Spring Boot集成Redis缓存之注解方式

2022-08-23 08:58:30

首先还是加入依赖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
  • 作者:DT辰白
  • 原文链接:https://blog.csdn.net/qq_41107231/article/details/106061649
    更新时间:2022-08-23 08:58:30