手把手教你使用 Spring Boot 3 开发上线一个前后端分离的生产级系统(六) - 本地缓存 Caffeine 和 分布式缓存 Redis 集成与配置
2022/5/30 2:21:20
本文主要是介绍手把手教你使用 Spring Boot 3 开发上线一个前后端分离的生产级系统(六) - 本地缓存 Caffeine 和 分布式缓存 Redis 集成与配置,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
本地缓存 Caffeine 集成和配置
Caffeine 是 Java 8 对 Google Guava 缓存的重写,是一个提供了近乎最佳命中率的高性能的缓存库。我们按照如下步骤集成和配置:
- 添加 spring-boot-starter-cache 依赖
使用 spring-boot-starter-cache “Starter” 可以快速添加基本缓存依赖项。 starter 引入了 spring-context-support。如果我们手动添加依赖项,则必须包含 spring-context-support 才能使用 JCache 或 Caffeine 支持。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>
- 添加 caffeine 依赖
<dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> </dependency>
- 自定义缓存管理器
/** * Caffeine 缓存管理器 */ @Bean public CacheManager caffeineCacheManager() { SimpleCacheManager cacheManager = new SimpleCacheManager(); List<CaffeineCache> caches = new ArrayList<>(CacheConsts.CacheEnum.values().length); for (CacheConsts.CacheEnum c : CacheConsts.CacheEnum.values()) { if (c.isLocal()) { Caffeine<Object, Object> caffeine = Caffeine.newBuilder().recordStats().maximumSize(c.getMaxSize()); if (c.getTtl() > 0) { caffeine.expireAfterWrite(Duration.ofSeconds(c.getTtl())); } caches.add(new CaffeineCache(c.getName(), caffeine.build())); } } cacheManager.setCaches(caches); return cacheManager; }
- 使用 @EnableCaching 注解开启缓存
@SpringBootApplication @MapperScan("io.github.xxyopen.novel.dao.mapper") @EnableCaching @Slf4j public class NovelApplication { public static void main(String[] args) { SpringApplication.run(NovelApplication.class, args); } @Bean public CommandLineRunner commandLineRunner(ApplicationContext context){ return args -> { Map<String, CacheManager> beans = context.getBeansOfType(CacheManager.class); log.info("加载了如下缓存管理器:"); beans.forEach((k,v)->{ log.info("{}:{}",k,v.getClass().getName()); log.info("缓存:{}",v.getCacheNames()); }); }; } }
这样我们就可以使用 Spring Cache 的注解(例如 @Cacheable)开发了。
分布式缓存 Redis 集成和配置
本地缓存虽然有着访问速度快的优点,但无法进行大数据的存储。并且当我们集群部署多个服务节点,或者后期随着业务发展进行服务拆分后,没法共享缓存和保证缓存数据的一致性。
本地缓存的数据还会随应用程序的重启而丢失,这样对于需要持久化的数据满足不了需求,还会导致重启后数据库瞬时压力过大。
所以本地缓存一般适合于缓存只读数据,如统计类数据,或者每个部署节点独立的数据。其它情况就需要用到分布式缓存了。
分布式缓存的集成步骤和本地缓存基本差不多,除了替换 caffeine 的依赖项为我们 redis 的依赖和配置上我们自定义的 redis 缓存管理器外,还要在配置文件中加入 redis 的连接配置:
- 加入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
- 配置 redis 缓存管理器
/** * 缓存配置类 * * @author xiongxiaoyang * @date 2022/5/12 */ @Configuration public class CacheConfig { /** * Caffeine 缓存管理器 */ @Bean @Primary public CacheManager caffeineCacheManager() { SimpleCacheManager cacheManager = new SimpleCacheManager(); List<CaffeineCache> caches = new ArrayList<>(CacheConsts.CacheEnum.values().length); for (CacheConsts.CacheEnum c : CacheConsts.CacheEnum.values()) { if (c.isLocal()) { Caffeine<Object, Object> caffeine = Caffeine.newBuilder().recordStats().maximumSize(c.getMaxSize()); if (c.getTtl() > 0) { caffeine.expireAfterWrite(Duration.ofSeconds(c.getTtl())); } caches.add(new CaffeineCache(c.getName(), caffeine.build())); } } cacheManager.setCaches(caches); return cacheManager; } /** * Redis 缓存管理器 */ @Bean public CacheManager redisCacheManager(RedisConnectionFactory connectionFactory) { RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory); RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig() .disableCachingNullValues().prefixCacheNameWith(CacheConsts.REDIS_CACHE_PREFIX); Map<String, RedisCacheConfiguration> cacheMap = new LinkedHashMap<>(CacheConsts.CacheEnum.values().length); for (CacheConsts.CacheEnum c : CacheConsts.CacheEnum.values()) { if (c.isRemote()) { if (c.getTtl() > 0) { cacheMap.put(c.getName(), RedisCacheConfiguration.defaultCacheConfig().disableCachingNullValues() .prefixCacheNameWith(CacheConsts.REDIS_CACHE_PREFIX).entryTtl(Duration.ofSeconds(c.getTtl()))); } else { cacheMap.put(c.getName(), RedisCacheConfiguration.defaultCacheConfig().disableCachingNullValues() .prefixCacheNameWith(CacheConsts.REDIS_CACHE_PREFIX)); } } } RedisCacheManager redisCacheManager = new RedisCacheManager(redisCacheWriter, defaultCacheConfig, cacheMap); redisCacheManager.setTransactionAware(true); redisCacheManager.initializeCaches(); return redisCacheManager; } }
- application.yml 中加入 redis 连接配置信息
spring: redis: host: 127.0.0.1 port: 6379 password: 123456
这篇关于手把手教你使用 Spring Boot 3 开发上线一个前后端分离的生产级系统(六) - 本地缓存 Caffeine 和 分布式缓存 Redis 集成与配置的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)
- 2024-05-30【Java】百万数据excel导出功能如何实现
- 2024-05-30我们小公司,哪像华为一样,用得上IPD(集成产品开发)?
- 2024-05-30java excel上传--poi
- 2024-05-30安装笔记本应用商店的pycharm,再安排pandas等模块,说是没有打包工具?
- 2024-05-29java11新特性