spring boot使用经验分享(四)redis

一、pom.xm文件引入对应的包

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

二、redis配置

常用client有两种:Jedis和Lettuce,spring boot框架中在1.x.x的版本时默认使用的jedis,2.x.x版本默认使用的lettuce

Jedis :

jedis是直连模式,在多个线程间共享一个 Jedis 实例时是线程不安全的,需要使用连接池。但是当连接数量增多时,成本较高。

Lettuce:(推荐)

Lettuce连接基于Netty,连接实例可以在多个线程间并发访问。可以满足多线程环境下的并发访问,一个连接实例不够的情况也可以按需增加连接实例。

# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接超时时间(毫秒)
spring.redis.timeout=1000
# Lettuce
# 连接池最大连接数(-1表示没有限制)默认 8
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(-1表示没有限制)默认 -1
spring.redis.lettuce.pool.max-wait=1000
# 连接池中的最大空闲连接,默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接,默认 0
spring.redis.lettuce.pool.min-idle=0

三、redis配置类


    @Bean(name = "redisTemplate")
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(mapper);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        //StringRedisSerializer 序列化和反序列化redis的key值
        template.setKeySerializer(stringRedisSerializer);
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用StringRedisSerializer的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson2JsonRedisSerializer
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson2JsonRedisSerializer
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        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);

        // 配置序列化(解决乱码的问题),ttl为过期时间
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(timeToLive)
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();

        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }

}

四、缓存注解

1)@Cacheable
@Cacheable可以标记在方法上(表示该方法是支持缓存的),也可以标记在一个类上(表示该类所有方法都支持缓存)。

方法上添加了@Cacheable标记,Spring会在其被调用后将其返回值缓存起来(以键值对方式)下次利用同样的参数来执行该方法时可以直接从缓存中获取结果。

针对缓存的key,Spring支持两种策略,默认策略和自定义策略

@Cacheable需要配置的有value、key和condition。

value表示当前方法的返回值会被缓存Cache的名称。可以是一个Cache也可以是多个Cache,当需要指定多个Cache时其是一个数组。

用来指定Spring缓存时对应的key的。该属性支持SpringEL表达式自定义key。如果没有指定该属性时,Spring将使用默认策略生成key。

@Cacheable(value = "product", key = "#id")
public Product findById(Long id)

2)@CacheEvict
清除缓存,根据cachename,key和condition删除缓存

比@Cacheable多两个属性:allentries,beforeInvocation 

allentries 
默认为false,设置为true的话就不用设置key了,会删除value指定的cachename下所有的缓存

beforeInvocation 
默认为false,默认spring是会在调用方法成功之后清除缓存的,如果方法里面抛错了自然也就不清除了,但是把此值设置为true的话spring会在调用方法前就删除缓存,也就是说不管方法执行结果如何缓存都删。

3)@CachePut
@CachePut将执行结果以键值对的形式存入指定的缓存中,常用于更新缓存。

4)@Caching

有时候我们可能组合多个Cache注解使用,如下。

@Caching(put = {
    @CachePut(value = "product", key = "#product.id"),
    @CachePut(value = "product", key = "#product.name"),
    @CachePut(value = "product", key = "#product.price")
})

发布了43 篇原创文章 · 获赞 0 · 访问量 3910

猜你喜欢

转载自blog.csdn.net/zhangdx001/article/details/105031693