SpringBoot集成redis的示例分析

56次阅读
没有评论

共计 10409 个字符,预计需要花费 27 分钟才能阅读完成。

自动写代码机器人,免费开通

这篇文章给大家分享的是有关 SpringBoot 集成 redis 的示例分析的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。

如何使用 springBoot 集成 redis
定义

REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统。
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串 (String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets) 等类型。
reids 的优点

以下是 Redis 的一些优点。

异常快 – Redis 非常快,每秒可执行大约 110000 次的设置 (SET) 操作,每秒大约可执行 81000 次的读取 / 获取 (GET) 操作。
支持丰富的数据类型 – Redis 支持开发人员常用的大多数数据类型,例如列表,集合,排序集和散列等等。这使得 Redis 很容易被用来解决各种问题,因为我们知道哪些问题可以更好使用地哪些数据类型来处理解决。
操作具有原子性 – 所有 Redis 操作都是原子操作,这确保如果两个客户端并发访问,Redis 服务器能接收更新的值。
多实用工具 – Redis 是一个多实用工具,可用于多种用例,如:缓存,消息队列(Redis 本地支持发布 / 订阅),应用程序中的任何短期数据,例如,web 应用程序中的会话,网页命中计数等。

Redis 安装

Window 下安装
下载地址:https://github.com/MSOpenTech/redis/releases。
Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip 压缩包到 C 盘,解压后,将文件夹重新命名为 redis。

打开一个 cmd 窗口 使用 cd 命令切换目录到 C:\redis
运行 redis-server.exe redis.windows.conf
如果想方便的话,可以把 redis 的路径加到系统的环境变量里,这样就省得再输路径了,后面的那个 redis.windows.conf 可以省略,如果省略,会启用默认的。输入之后,会显示如下界面:
SpringBoot 集成 redis 的示例分析

集成 redis

我们还是延用上一章的项目:Springboot 集成 springcloud-config 实现 dataSource 热部署

1、添加依赖

!-- 集成 redis-- 
 dependency 
  groupId org.springframework.boot /groupId 
  artifactId spring-boot-starter-redis /artifactId 
  version 1.4.1.RELEASE /version 
 /dependency 
 dependency 
  groupId com.alibaba /groupId 
  artifactId fastjson /artifactId 
  version 1.2.3 /version 
 /dependency 
 dependency 
  groupId com.fasterxml.jackson.core /groupId 
  artifactId jackson-databind /artifactId 
 /dependency

2、在配置中心里添加 redis 配置

spring.redis.host=127.0.0.1
#Redis 服务器连接端口
spring.redis.port=6379
#Redis 服务器连接密码(默认为空)spring.redis.password=
#连接池最大连接数(使用负值表示没有限制)spring.redis.pool.max-active=8
#连接池最大阻塞等待时间(使用负值表示没有限制)spring.redis.pool.max-wait=-1
#连接池中的最大空闲连接
spring.redis.pool.max-idle=8
#连接池中的最小空闲连接
spring.redis.pool.min-idle=0
#连接超时时间(毫秒)spring.redis.timeout=30000

3、配置类 RedisConfig

import java.lang.reflect.Method;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import com.fasterxml.jackson.annotation.PropertyAccessor; 
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.databind.ObjectMapper;
@Configuration
@EnableCaching
@RefreshScope
public class RedisConfig extends CachingConfigurerSupport{ @Value( ${spring.redis.host} )
 private String host;
 @Value(${spring.redis.port} )
 private int port;
 @Value(${spring.redis.timeout} )
 private int timeout;
 @Value(${spring.redis.password} )
 private String password;
 @Value(${spring.redis.pool.max-active} )
 private int maxActive;
 @Value(${spring.redis.pool.max-wait} )
 private int maxWait;
 @Value(${spring.redis.pool.max-idle} )
 private int maxIdle;
 @Value(${spring.redis.pool.min-idle} )
 private int minIdle;
 
 @RefreshScope
 @Bean
 public KeyGenerator wiselyKeyGenerator(){ return new KeyGenerator() {
 @Override
 public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder();
 sb.append(target.getClass().getName());
 sb.append(method.getName());
 for (Object obj : params) { sb.append(obj.toString());
 }
 return sb.toString();
 }
 };
 }
 
 @RefreshScope
 @Bean
 public JedisConnectionFactory redisConnectionFactory() { JedisConnectionFactory factory = new JedisConnectionFactory();
 factory.setHostName(host);
 factory.setPort(port);
 factory.setTimeout(timeout); // 设置连接超时时间
 factory.setPassword(password);
 factory.getPoolConfig().setMaxIdle(maxIdle);
 factory.getPoolConfig().setMinIdle(minIdle);
 factory.getPoolConfig().setMaxTotal(maxActive);
 factory.getPoolConfig().setMaxWaitMillis(maxWait);
 return factory;
 }
 
 @RefreshScope
 @Bean
 public CacheManager cacheManager(RedisTemplate redisTemplate) { RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
 // Number of seconds before expiration. Defaults to unlimited (0)
 cacheManager.setDefaultExpiration(10); // 设置 key-value 超时时间
 return cacheManager;
 }
 
 @RefreshScope
 @Bean
 public RedisTemplate String, String  redisTemplate(RedisConnectionFactory factory) { StringRedisTemplate template = new StringRedisTemplate(factory);
 setSerializer(template); // 设置序列化工具,这样 ReportBean 不需要实现 Serializable 接口
 template.afterPropertiesSet();
 return template;
 }
 
 @RefreshScope
 private void setSerializer(StringRedisTemplate template) { Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
 ObjectMapper om = new ObjectMapper();
 om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
 jackson2JsonRedisSerializer.setObjectMapper(om);
 template.setValueSerializer(jackson2JsonRedisSerializer);
 }
}

4、RedisUtils 类

import java.io.Serializable;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SetOperations;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Service;
@Service
public class RedisUtils {
 @Autowired
 private RedisTemplate redisTemplate;
 /**
 *  写入缓存
 * @param key
 * @param value
 * @return
 */
 public boolean set(final String key, Object value) {
 boolean result = false;
 try { ValueOperations Serializable, Object  operations = redisTemplate.opsForValue();
 operations.set(key, value);
 result = true;
 } catch (Exception e) { e.printStackTrace();
 }
 return result;
 }
 /**
 *  写入缓存设置时效时间
 * @param key
 * @param value
 * @return
 */
 public boolean set(final String key, Object value, Long expireTime ,TimeUnit timeUnit) {
 boolean result = false;
 try { ValueOperations Serializable, Object  operations = redisTemplate.opsForValue();
 operations.set(key, value);
 redisTemplate.expire(key, expireTime, timeUnit);
 result = true;
 } catch (Exception e) { e.printStackTrace();
 }
 return result;
 }
 /**
 *  批量删除对应的 value
 * @param keys
 */
 public void remove(final String... keys) { for (String key : keys) { remove(key);
 }
 }
 /**
 *  批量删除 key
 * @param pattern
 */
 public void removePattern(final String pattern) { Set Serializable  keys = redisTemplate.keys(pattern);
 if (keys.size()   0){ redisTemplate.delete(keys);
 }
 }
 /**
 *  删除对应的 value
 * @param key
 */
 public void remove(final String key) { if (exists(key)) { redisTemplate.delete(key);
 }
 }
 /**
 *  判断缓存中是否有对应的 value
 * @param key
 * @return
 */
 public boolean exists(final String key) { return redisTemplate.hasKey(key);
 }
 /**
 *  读取缓存
 * @param key
 * @return
 */
 public Object get(final String key) {
 Object result = null;
 ValueOperations Serializable, Object  operations = redisTemplate.opsForValue();
 result = operations.get(key);
 return result;
 }
 /**
 *  哈希   添加
 * @param key
 * @param hashKey
 * @param value
 */
 public void hmSet(String key, Object hashKey, Object value){ HashOperations String, Object, Object  hash = redisTemplate.opsForHash();
 hash.put(key,hashKey,value);
 }
 /**
 *  哈希获取数据
 * @param key
 * @param hashKey
 * @return
 */
 public Object hmGet(String key, Object hashKey){ HashOperations String, Object, Object  hash = redisTemplate.opsForHash();
 return hash.get(key,hashKey);
 }
 /**
 *  列表添加
 * @param k
 * @param v
 */
 public void lPush(String k,Object v){ ListOperations String, Object  list = redisTemplate.opsForList();
 list.rightPush(k,v);
 }
 /**
 *  列表获取
 * @param k
 * @param l
 * @param l1
 * @return
 */
 public List Object  lRange(String k, long l, long l1){ ListOperations String, Object  list = redisTemplate.opsForList();
 return list.range(k,l,l1);
 }
 /**
 *  集合添加
 * @param key
 * @param value
 */
 public void add(String key,Object value){ SetOperations String, Object  set = redisTemplate.opsForSet();
 set.add(key,value);
 }
 /**
 *  集合获取
 * @param key
 * @return
 */
 public Set Object  setMembers(String key){ SetOperations String, Object  set = redisTemplate.opsForSet();
 return set.members(key);
 }
 /**
 *  有序集合添加
 * @param key
 * @param value
 * @param scoure
 */
 public void zAdd(String key,Object value,double scoure){ ZSetOperations String, Object  zset = redisTemplate.opsForZSet();
 zset.add(key,value,scoure);
 }
 /**
 *  有序集合获取
 * @param key
 * @param scoure
 * @param scoure1
 * @return
 */
 public Set Object  rangeByScore(String key,double scoure,double scoure1){ ZSetOperations String, Object  zset = redisTemplate.opsForZSet();
 return zset.rangeByScore(key, scoure, scoure1);
 }

5、测试,修改 controller

import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.chenqi.springboot.redis.RedisUtils;
import com.chenqi.springboot.service.TestService;
@RestController
public class SpringBootController {
 
 public static final Logger log = LoggerFactory.getLogger(SpringBootController.class);
 
 @Autowired
 TestService testService;
 
 @Autowired
 private RedisUtils redisUtils;
 @RequestMapping(value =  /hello/{id} )
 public String hello(@PathVariable(value =  id) String id){
 // 查询缓存中是否存在
 boolean hasKey = redisUtils.exists(id);
 String str =  
 if(hasKey){
 // 获取缓存
 Object object = redisUtils.get(id);
 log.info(从缓存获取的数据 + object);
 str = object.toString();
 }else{
 // 从数据库中获取信息
 log.info( 从数据库中获取数据 
 str = testService.test();
 // 数据插入缓存(set 中的参数含义:key 值,user 对象,缓存存在时间 10(long 类型),时间单位) redisUtils.set(id,str,10L,TimeUnit.MINUTES);
 log.info(数据插入缓存  + str);
 }
 return str;
 }
}

启动项目,第一次访问:http://localhost:8002/hello/111
SpringBoot 集成 redis 的示例分析
SpringBoot 集成 redis 的示例分析
通过控制台输出,我们可以看到是从数据库中获取的数据,并且存入了 redis 缓存中。

我们再次刷新浏览器
SpringBoot 集成 redis 的示例分析
可以看到,第二次是从缓存中读取的,我们试试不断刷新浏览器
SpringBoot 集成 redis 的示例分析

感谢各位的阅读!关于“SpringBoot 集成 redis 的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计10409字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)