Redis简单使用

113 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

如何在Springboot中使用Redis进行缓存

依赖及yml配置
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
# 配置redis以及cache
spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password:
    timeout: 10000 #连接超时时间

缓存配置:
  • 开启基于注解的缓存 @EnableCaching
  • 设置缓存数据时value序列化、key生成 策略
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory){
 RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
      redisTemplate.setConnectionFactory(factory);
      // 创建json序列化对象
      GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
      // 设置key序列化String
      redisTemplate.setKeySerializer(new StringRedisSerializer());
      // 设置value序列化 json
      redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
      // 设置hash key序列化String
      redisTemplate.setHashKeySerializer(new StringRedisSerializer());
      // 设置hash value 序列化json
      redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
      // 初始化redis完成序列化的方法
      redisTemplate.afterPropertiesSet();
      return redisTemplate;
  }
  • 配置缓存管理器 java

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
            RedisCacheConfiguration cacheConfiguration =
                    RedisCacheConfiguration.defaultCacheConfig()
                            //设置缓存默认超时时间  30分钟
                            //.entryTtl(Duration.ofMillis(30))
                            .disableCachingNullValues()
                            // 设置key序列化
                           .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))                      .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
            return RedisCacheManager.builder(factory).cacheDefaults(cacheConfiguration).build();
        }
    

缓存操作
  • 设置缓存
    @Cacheable: 有缓存就读缓存,没有才执行将返回值设置到缓存中

    @Cacheable(value = "userCache", key = "111") //对应key userCache::111
    @PostMapping("/saveTest")
    public String saveTest() {
       log.error("----查询数据库----");
       return "查询数据库";
    }
    
  • 更新缓存

    @CachePut:保证方法被调用,并且将返回结果缓存到Redis

    @PostMapping("/updateTest")
    @CachePut(value = "userCache", key = "111") //对应key userCache::111
    public String updateTest() {
       log.error("----更新缓存----");
       return "删除缓存->1";
    }
    
  • 删除缓存

    @CacheEvict:删除对应缓存

    @PostMapping("/deleteTest")
    @CacheEvict(value = "userCache", key = "111") //对应key userCache::111
    public String deleteTest() {
       log.error("----删除缓存----");
       return "删除缓存";
    }
    

    上面的注解有匹配上的value和key相同的时候,表示操作同一个key
    上面的注解内可以添加的变量都有:

    • value: 缓存的名称 ,@Cacheable(value=”mycache”)、@Cacheable(value={”cache1”,”cache2”}
    • key:缓存的 key,可以为空 。支持SpEL 表达式编写
    • condition:缓存的条件,支持SpEL 表达式编写,返回true表示进行上述三个注解的操作
    • unless:否定缓存,当条件为TRUE时,就不会缓存。支持SpEL 表达式编写

    CacheEvict 专有变量:

    • allEntries:是否清空所有缓存内容,缺省为 false。
    • beforeInvocation:是否在方法执行前就清空,缺省为 false(缺省时,如果执行异常,则不会清空缓存)。