redisTemplate, RedisCaffeineCacheManager redisCaffeineCacheManager) {RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer(); redisMessageListenerContainer.setConnectionFactory(redisTemplate.getConnectionFactory());
CacheMessageListener cacheMessageListener = new CacheMessageListener(redisTemplate, redisCaffeineCacheManager);
redisMessageListenerContainer.addMessageListener(cacheMessageListener, new ChannelTopic(cacheRedisCaffeineProperties.getRedis().getTopic())); return redisMessageListenerContainer; }}
在resources/META-INF/spring.factories⽂件中增加spring boot配置扫描
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\
com.itopener.cache.redis.caffeine.spring.boot.autoconfigure.CacheRedisCaffeineAutoConfiguration
接下来就可以使⽤maven引⼊使⽤了
com.itopener
cache-redis-caffeine-spring-boot-starter 1.0.0-SNAPSHOT pom
在启动类上增加@EnableCaching注解,在需要缓存的⽅法上增加@Cacheable注解
package com.itopener.demo.cache.redis.caffeine.service;import java.util.Random;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.CachePut;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;
import com.itopener.demo.cache.redis.caffeine.vo.UserVO;import com.itopener.utils.TimestampUtil;
@Service
public class CacheRedisCaffeineService {
private final Logger logger = LoggerFactory.getLogger(CacheRedisCaffeineService.class);
@Cacheable(key = \"'cache_user_id_' + #id\ public UserVO get(long id) { logger.info(\"get by id from db\"); UserVO user = new UserVO(); user.setId(id);
user.setName(\"name\" + id);
user.setCreateTime(TimestampUtil.current()); return user; }
@Cacheable(key = \"'cache_user_name_' + #name\ public UserVO get(String name) { logger.info(\"get by name from db\"); UserVO user = new UserVO();
user.setId(new Random().nextLong()); user.setName(name);
user.setCreateTime(TimestampUtil.current()); return user; }
@CachePut(key = \"'cache_user_id_' + #userVO.id\ public UserVO update(UserVO userVO) { logger.info(\"update to db\");
userVO.setCreateTime(TimestampUtil.current()); return userVO; }
@CacheEvict(key = \"'cache_user_id_' + #id\ public void delete(long id) { logger.info(\"delete from db\"); }}
properties⽂件中redis的配置跟使⽤redis是⼀样的,可以增加两级缓存的配置
#两级缓存的配置
spring.cache.multi.caffeine.expireAfterAccess=5000spring.cache.multi.redis.defaultExpiration=60000#spring cache配置
spring.cache.cache-names=userIdCache,userNameCache
#redis配置
#spring.redis.timeout=10000
#spring.redis.password=redispwd#redis pool
#spring.redis.pool.maxIdle=10#spring.redis.pool.minIdle=2
#spring.redis.pool.maxActive=10#spring.redis.pool.maxWait=3000#redis cluster
spring.redis.cluster.nodes=127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003,127.0.0.1:7004,127.0.0.1:7005,127.0.0.1:7006spring.redis.cluster.maxRedirects=3
扩展
个⼈认为redisson的封装更⽅便⼀些
1. 对于spring cache缓存的实现没有那么多的缺陷
2. 使⽤redis的HASH结构,可以针对不同的hashKey设置过期时间,清理的时候会更⽅便
3. 如果基于redisson来实现多级缓存,可以继承RedissonCache,在对应⽅法增加⼀级缓存的操作即可4. 如果有使⽤分布式锁的情况就更⽅便了,可以直接使⽤Redisson中封装的分布式锁5. redisson中的发布订阅封装得更好⽤
后续可以增加对于缓存命中率的统计endpoint,这样就可以更好的监控各个缓存的命中情况,以便对缓存配置进⾏优化starter⽬录:springboot / itopener-parent / spring-boot-starters-parent / cache-redis-caffeine-spring-boot-starter-parent⽰例代码⽬录: springboot / itopener-parent / demo-parent / demo-cache-redis-caffeine以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
步旅网还为您提供以下相关内容希望对您有帮助:
Redis+Caffeine两级缓存,让访问速度更加流畅
在代码层面,实现两级缓存管理主要涉及以下步骤:使用如 Caffeine 的本地缓存和 Redis 作为远程缓存,整合后通过 Spring Boot 项目搭建环境,并配置 Redis 连接信息。接下来,通过 V1.0 版本实现手动操作缓存逻辑,包括在业务代码中注入和使用缓存,实现数据的读取和存储。V1.0 版本示例中,首先创建 Cac...
Spring Boot多级缓存实现方案
首先,设计一个多级缓存配置类,用于动态配置缓存属性,实现可插拔功能。在自动配置类中启用该配置类,注入相关属性。随后,重写Spring的Cache接口,集成Caffeine本地缓存与Redis分布式缓存,构建多级缓存机制。为监控缓存变动,实现Caffeine键值移除监听与Redis消息监听,确保数据一致性。最后,自动配置类注入相关be...
【Redis】SpringBoot中的cache注解、缓存的两种使用方式
在SpringBoot中,缓存的实现通常通过使用像Redis这样的中间件来提升程序性能。为了利用缓存,可以在分层架构中添加一个专门的缓存层,使得控制器调用时,数据首先在缓存中查找,若有则直接返回,否则调用服务层处理,处理结果再存入缓存,这有助于提高程序的可用性,但需要手动管理key和数据关联,影响维护性。
SpringBoot的Cacheable缓存注解
在此 RedisCacheManager 中,我们使用默认的 RedisCacheConfiguration 进行了一些配置,例如设置缓存的过期时间,同时指定了 Redis 的连接信息。本文介绍了如何在 Spring Boot 应用程序中使用 Redis 进行缓存,包括配置 RedisTemplate、使用 Cacheable 注解、设置缓存有效期、使用 @CacheEvict 清除缓存数据以及使...
SpringBoot整合redis并使用Spring Cache缓存注解
在Spring Boot 2.7中,为了利用Redis作为缓存存储,首先需要在配置文件中启用缓存功能并指定Redis配置。通过在application.properties或.yml中添加相关配置,Spring Boot会自动识别并使用Redis。确保在项目依赖中包含spring-boot-starter-data-redis以支持Redis操作。启用缓存通过@EnableCaching注解,同时配合@Cache...
spring-boot Cache redis 类型转换错误
我们把上面出错的地方单独拿出来 对于这个问题,网上也有人遇到过,但是都说什么是spring-boot devtools工具的问题,感觉挺扯的,我没用这个devtools工具,但是看网上分析的大致可以得出以下结论: 当cache将数据放入缓存时,使用了默认的序列化方式(JdkSerializationRedisSerializer),该序列化使用了二进制...
Java 缓存中间件
Spring Boot Cache 是针对 Spring Cache 的封装,简化了配置步骤,使得缓存集成更加便捷。只需引入依赖、配置缓存类型(如 Redis)并启用缓存功能即可。JetCache 是一个基于 Java 的缓存系统,提供统一 API 和注解,简化缓存使用。JetCache 支持 TTL、两级缓存、分布式自动刷新等功能,适用于复杂缓存场景。有...
SpringBoot整合SpringSeesion实现Redis缓存
首先我们创建一个Spring Boot 2.x的项目,在application.properties配置文件中添加Redis的配置,Spring和Redis的整合可以参考我其他的文章,此处不再详解。我们设置服务端口server.port为8080端口用于启动第一个服务。接下来我们需要在pom文件中添加spring-boot-starter-data-redis和spring-session-data-redis这两...
本地缓存解决方案-Caffeine Cache
Caffeine Cache基于LRU算法实现,支持多种缓存过期策略。在Spring Boot 2.0中,Caffeine Cache将取代Guava成为默认缓存方案。使用Caffeine Cache在Spring Boot 2.0项目中集成Caffeine Cache,可以使用以下步骤:准备工作搭建Spring Boot 2.x项目,集成MyBatis与MySQL数据库。java工程添加依赖在项目的pom.xml文件...
SpringBoot整合Redis做缓存-自定义缓存序列化方式,防止缓存数据乱码问 ...
SpringBoot整合Redis做缓存-自定义缓存序列化方式,防止缓存数据乱码问题首先是添加依赖:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-d