博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring-boot集成redis实现缓存功能
阅读量:6207 次
发布时间:2019-06-21

本文共 4932 字,大约阅读时间需要 16 分钟。

一、本次案例

我们假设用户信息(user)和产品信息(product)需要缓存,缓存数据都加上user和product作为key前缀,采用用户的id和产品的id作为key的后缀。用户缓存时间为30分钟,产品信息缓存时间为10分钟。

二、redis客户端配置

无论使用spring-boot的哪个版本,我们都需要先配置redis连接,两个版本的redis客户端连接池使用有所不同。

spring-boot版本 默认客户端类型
1.5.x jedis
2.x lettuce

在1.5.x中,我们配置jedis连接池只需要配置 spring.redis.pool.* 开始的配置即可,如下配置

spring.redis.pool.max-active=8spring.redis.pool.max-wait=-1spring.redis.pool.min-idle=0spring.redis.pool.max-idle=8

但在2.x版本中由于引入了不同的客户端,需要指定配置哪种连接池,如下配置

#jedis客户端spring.redis.jedis.pool.max-active=8spring.redis.jedis.pool.max-wait=-1msspring.redis.jedis.pool.min-idle=0spring.redis.jedis.pool.max-idle=8#lettuce客户端spring.redis.lettuce.pool.min-idle=0spring.redis.lettuce.pool.max-idle=8spring.redis.lettuce.pool.max-wait=-1msspring.redis.lettuce.pool.max-active=8spring.redis.lettuce.shutdown-timeout=100ms

除此之外还可以看到时间配置上还需要带上对应的单位。

三、直接配置cache参数

在1.5.x版本下提供的针对cache的配置非常少,我们能够使用到的自动装配redis缓存的配置如下

#缓存的名称集合,多个采用逗号分割spring.cache.cache-names=#缓存的类型,官方提供了很多,这里我们填写redisspring.cache.type=

在2.x版本时,官方增加了更多的配置

#缓存的名称集合,多个采用逗号分割spring.cache.cache-names=#缓存的类型,官方提供了很多,这里我们填写redisspring.cache.type=#是否缓存null数据,默认是falsespring.cache.redis.cache-null-values=#redis中缓存超时的时间,默认60000msspring.cache.redis.time-to-live=#缓存数据key是否使用前缀,默认是truespring.cache.redis.use-key-prefix=#缓存数据key的前缀,在上面的配置为true时有效,spring.cache.redis.key-prefix=

四、JavaConfig方式配置

通用配置方式只能满足整个程序所有缓存都采用相同公共配置的方式,如果需要特殊处理,如我们的案列,则需要自己采用代码的方式来配置。

采用代码的方式,只要需要配置的是CacheMananger,采用Redis时具体实现我们需要使用其子类RedisCacheMananger来做配置

4.1、spring-boot 1.5.x版本

CacheManager配置

@Beanpublic CacheManager cacheManager(RedisTemplate redisTemplate) {    RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate);    //默认超时时间,单位秒    redisCacheManager.setDefaultExpiration(60);    //缓存超时时间Map,key为cacheName,value为超时,单位是秒    Map
expiresMap = new HashMap<>(); //缓存用户信息的cacheName和超时时间 expiresMap.put("user", 1800L); //缓存产品信息的cacheName和超时时间 expiresMap.put("product", 600L); redisCacheManager.setExpires(expiresMap); return redisCacheManager;}

cache调用代码

@Cacheable(value = "user", key = "'user:'+#id", unless = "#result==null")public String getUser(int id) {    //逻辑操作}@Cacheable(value = "product", key = "'product:'+#id", unless = "#result==null")public String getProduct(int id) {    //逻辑操作}

4.2、spring-boot 2.x版本

CacheManager配置

2.x版本开始,代码方式配置变化比较大,同时增加了更多配置参数

@BeanCacheManager cacheManager(RedisConnectionFactory connectionFactory) {    //user信息缓存配置    RedisCacheConfiguration userCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(30)).disableCachingNullValues().prefixKeysWith("user");    //product信息缓存配置    RedisCacheConfiguration productCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(10)).disableCachingNullValues().prefixKeysWith("product");    Map
redisCacheConfigurationMap = new HashMap<>(); redisCacheConfigurationMap.put("user", userCacheConfiguration); redisCacheConfigurationMap.put("product", productCacheConfiguration); //初始化一个RedisCacheWriter RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory); //设置CacheManager的值序列化方式为JdkSerializationRedisSerializer,但其实RedisCacheConfiguration默认就是使用StringRedisSerializer序列化key,JdkSerializationRedisSerializer序列化value,所以以下注释代码为默认实现 //ClassLoader loader = this.getClass().getClassLoader(); //JdkSerializationRedisSerializer jdkSerializer = new JdkSerializationRedisSerializer(loader); //RedisSerializationContext.SerializationPair
pair = RedisSerializationContext.SerializationPair.fromSerializer(jdkSerializer); //RedisCacheConfiguration defaultCacheConfig=RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(pair); RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig(); //设置默认超过期时间是30秒 defaultCacheConfig.entryTtl(Duration.ofSeconds(30)); //初始化RedisCacheManager RedisCacheManager cacheManager = new RedisCacheManager(redisCacheWriter, defaultCacheConfig, redisCacheConfigurationMap); return cacheManager;}

以上代码中RedisCacheConfiguration类为2.x新增的配置类,增加了几个配置项。这里比较奇怪的是调用它的配置方法每一次都会重新生成一个配置对象,而不是在原对象上直接修改参数值,这一点本人没搞懂作者为何要选择这种方式。

cache调用代码

@Cacheable(value = "user", key = "#id", unless = "#result==null")public String getUser(int id) {    //逻辑操作}@Cacheable(value = "product", key = "#id", unless = "#result==null")public String getProduct(int id) {    //逻辑操作}

这里两点需要注意的地方

  • 1、在Cacheable的key属性中不在需要自己配置前缀,可以在RedisCacheConfiguration中配置。
  • 2、如果Cacheable中不配置 unless = "#result==null" 属性,而RedisCacheConfiguration中调用disableCachingNullValues()配置了不缓存null结果在出现null结果时会报异常,这一点与我一开始的理解也不太一样,二者并非都生效的。个人理解unless配置#result==null可以决定null的值是否往cacheManager丢,而RedisCacheConfiguration的disableCachingNullValues()只在存储前起到了校验作用,而不会因为设置了这个值而直接跳过null的保存。如果真是设计如此,感觉有点鸡肋,不知道算不算一个bug。

小结

spring-boot刚刚发布了2.0.0的正式版,除了比较大的webflux之外,许多组件可能都有细节变化,在做升级的时候需要注意更改,建议先验证常用的功能用法后,再做升级的计划安排。

转载地址:http://ckkja.baihongyu.com/

你可能感兴趣的文章
Introduce
查看>>
分析云计算对企业IT架构潜在影响
查看>>
山西省医院协会牵手科大讯飞 依托省人民医院推进 “ AI + 医疗”落地
查看>>
如何用 MOOC 组合掌握机器学习?
查看>>
云计算和外包数据安全分析及建议
查看>>
Hadoop命令手册
查看>>
Salesforce Einstein承诺提供“开箱即用”的人工智能应用程序
查看>>
企业如何应对云计算的法律风险
查看>>
《程序化广告实战》一 第1章 程序化广告的前世今生
查看>>
摩尔定律堪称不死神话: IBM开发5纳米芯片
查看>>
友友云产品发布会在京举行
查看>>
Gartner:如何定位CDO首席数据官
查看>>
蓝代斯克助力企业决胜现代化IT
查看>>
5款应用优化Outlook体验感
查看>>
H3C许立宪:金融跨界成必然趋势
查看>>
Arkeia发布业界首个用于备份的虚拟设备
查看>>
机器学习的入门“秘籍”
查看>>
Struts2漏洞爆发 知道创宇云安全已拦截近万攻击样本
查看>>
关于5G的10个问答 让我们告别盲人摸象
查看>>
中兴通讯徐明:中国智慧城市应以人为核心让信息惠民
查看>>