Spring Boot 学习----SpringBoot整合Redis

SpringBoot整合Redis

说明:由于使用的是window系统,所以本文中使用的redis是再Docker中运行的。

至于如何启动redis这里不再说明,需要的请自行百度。

配置pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

编写redis配置类

/**
 * redis配置类
 */
@Configuration
//开启缓存
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
    /**
     * 自定义生成key的规则
     * @return
     */
    @Override
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object o, Method method, Object... objects) {
                //格式化缓存key字符串
                StringBuilder sb = new StringBuilder();
                //追加类名
                sb.append(o.getClass().getName());
                //追加方法名
                sb.append(method.getName());
                System.out.println("调用Redis缓存Key : " + sb.toString());
                return sb.toString();
            }
        };
    }

    /**
     * 采用RedisCacheManager作为缓存管理器
     * @param connectionFactory
     */
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        RedisCacheManager redisCacheManager = RedisCacheManager.create(connectionFactory);
        return  redisCacheManager;
    }

    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
        // 解决键、值序列化问题
        StringRedisTemplate template = new StringRedisTemplate(factory);
        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);
        template.afterPropertiesSet();
        return template;
    }
}
  • 上面的redisTemplate可以使用其他序列化的实现。
  • key的生成规则可以由自己定义,返回值会成为redis的key。

编写redis操作工具类

redis工具类主要使用redisTemplate类进行操作,至于怎么操作这里不再阐述。你可以找网上大佬封装好的,也可以自己封装。

使用缓存

这里主要讲解一下 @Cacheable、@CachePut、@CacheEvict

  • @Cacheable(在执行 @Cacheable 标注的方法前先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,执行该方法并将方法返回值放进缓存。)
@Cacheable(key = "#id",value = "key",unless = "#id==null")
@PostMapping("/{id}/{value}")
public String setKey(@PathVariable String value,@PathVariable String id){
    return value+id;
}

PS:若去掉value属性则会抛错。若没有key则会进入到配置类中的key生成策略中生成对应key。

最后进入redis中的key格式回事 key::value

  • @CacheEvict(方法执行成功后会从缓存中移除相应数据)
@CacheEvict(value = "key",key = "#id")
@DeleteMapping("/{id}")
public String clear(@PathVariable String id){
    return null;
}
  • @CachePut(主要用于数据新增和修改方法)
@CachePut(value = "value", key = "#id")  
@PutMapping("/{id}/{value}")
public User save(){ 
    return null;
}

PS:参数, value缓存名、 key缓存键值、 condition满足缓存条件、unless否决缓存条件

具体又哪些参数根据注解的参数来对照。

相关推荐