首先还是加入依赖Jar
pom.xml中加入依赖
<!-- 加载spring boot redis 包 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
application.properties 中配置Redis连接信息
#配置redis
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=192.168.150.131
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=5000
添加Redis缓存注解配置类
解决Redis缓存中的key和value等序列化方式,方便我们使用Redis客户端查看key以及value,因为我使用的是RedisTemplate,所以默认使用JdkSerializationRedisSerializer来序列化键和值,这样使用Redis客户端查看key和value的时候就是一堆看不懂的字符串。
/***
* Redis缓存注解配置类
*/@EnableCaching//开启缓存@Configuration//标注这是一个Spring Boot配置类publicclassRedisConfigextendsCachingConfigurerSupport{@Beanpublic RedisTemplate<String, Object>redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String, Object> template=newRedisTemplate<>();
RedisSerializer<String> redisSerializer=newStringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer=newJackson2JsonRedisSerializer(Object.class);
ObjectMapper om=newObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setConnectionFactory(factory);//key序列化方式
template.setKeySerializer(redisSerializer);//value序列化
template.setValueSerializer(jackson2JsonRedisSerializer);//value hashmap序列化
template.setHashValueSerializer(jackson2JsonRedisSerializer);return template;}@Beanpublic CacheManagercacheManager(RedisConnectionFactory factory){
RedisSerializer<String> redisSerializer=newStringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer=newJackson2JsonRedisSerializer(Object.class);//解决查询缓存转换异常的问题
ObjectMapper om=newObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);// 配置序列化(解决乱码的问题),过期时间600秒
RedisCacheConfiguration config= RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(600)).serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)).disableCachingNullValues();
RedisCacheManager cacheManager= RedisCacheManager.builder(factory).cacheDefaults(config).build();return cacheManager;}}
注解的方式使用缓存
UserServiceImpl.java
1、查询所有List集合
//查询所有List集合@Cacheable(value="userList", key="'findAllUser'")@Overridepublic List<User>findAllUser(){return userDao.findAll();}
1)@Cacheable
根据方法对其返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。
查看源码,属性值如下:
属性/方法名 | 解释 |
---|---|
value | 缓存名称,必填,它指定了你的缓存存放在哪块命名空间 |
cacheNames | 与 value 差不多,二选一即可 |
key | 可选属性,可以使用 SpEL 标签自定义缓存的key |
2、根据id删除用户信息
UserController.java
/**
* 删除用户信息(单个) 删除缓存
* @param id
* @return
*/@PostMapping(value="removeUserById/{id}")@ResponseBodypublic JSONObjectremoveUser(@PathVariable Integer id){return userService.removeUser(id);}
接口实现类代码UserServiceImpl.java
//根据id删除用户信息@CacheEvict(value="userList", allEntries=true)@Overridepublic JSONObjectremoveUser(Integer id){
JSONObject jsonObject=newJSONObject();if(userDao.removeUserById(id)>0){
jsonObject.put("code","200");
jsonObject.put("msg","success");
jsonObject.put("data",id);}else{
jsonObject.put("code","500");
jsonObject.put("msg","fail");}return jsonObject;}
使用Postman测试,结果如下图所示
2)@CacheEvict
使用该注解标志的方法,会清空指定的缓存。一般用在更新或者删除方法上。
查看源码,属性值如下:
属性/方法名 | 解释 |
---|---|
value | 缓存名称,必填,它指定了你的缓存存放在哪块命名空间 |
cacheNames | 与 value 差不多,二选一即可 |
key | 可选属性,可以使用 SpEL 标签自定义缓存的key |
allEntries | 是否清空所有缓存,默认为 false。如果指定为 true,则方法调用后将立即清空所有的缓存 |
beforeInvocation | 是否在方法执行前就清空,默认为 false。如果指定为 true,则在方法执行前就会清空缓存 |
其他缓存注解
1)缓存@CachePut
使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库。一般用在新增方法上。
查看源码,属性值如下:
属性/方法名 | 解释 |
---|---|
value | 缓存名称,必填,它指定了你的缓存存放在哪块命名空间 |
cacheNames | 与 value 差不多,二选一即可 |
key | 可选属性,可以使用 SpEL 标签自定义缓存的key |