使用Spring管理Caffeine缓存(CacheManager+Caffeine)

本文介绍了如何在Spring应用中使用Caffeine缓存,包括添加pom依赖、配置CacheManager、设置缓存策略,并说明了当缓存满时的自动处理机制。

1 依赖

使用Spring管理Caffeine缓存的主要pom依赖如下所示。

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>5.2.8.RELEASE</version>
</dependency>
			
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>

<dependency>
	<groupId>com.github.ben-manes.caffeine</groupId>
	<artifactId>caffeine</artifactId>
	<version>2.9.2</version>
</dependency>

2 配置类

CacheManager配置类如下所示。

@Configuration
@EnableCaching
public class CacheManagerConfig {

    /**
     * 创建基于Caffeine的CacheManager
     */
    @Bean
    @Primary
    public CacheManager caffeineCacheManager() {
        SimpleCacheManager cacheMan
使用 Caffeine 和 Redis 构建的多级缓存架构中,通过 `CacheManager` 获取所有缓存 key 的实现方式需要结合本地缓存Caffeine)和远程缓存(Redis)分别进行处理。由于 `CacheManager` 仅能管理本地缓存中的 key,因此需要额外调用 Redis 的命令来获取其存储的所有 key。 ### 获取 Caffeine 缓存的 key 可以通过 `CacheManager` 获取指定缓存名称下的本地缓存实例,并直接调用其 `getKeys()` 方法获取所有 key: ```java import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import java.util.Set; public Set<Object> getCaffeineCacheKeys(CacheManager cacheManager, String cacheName) { Cache cache = cacheManager.getCache(cacheName); if (cache != null) { return cache.getNativeCache().getKeys(); } return Set.of(); } ``` 该方法适用于基于 Caffeine 的本地缓存部分,能够获取当前缓存实例中的所有 key 集合[^3]。 ### 获取 Redis 缓存的 key 对于 Redis 缓存,需要通过 `RedisTemplate` 调用底层连接获取所有 key: ```java import org.springframework.data.redis.core.RedisTemplate; import java.util.Set; public Set<String> getRedisCacheKeys(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.getConnectionFactory().getConnection().keys("*".getBytes()); } ``` 此方法利用了 Redis 的 `KEYS *` 命令,返回当前数据库中所有的 key。需要注意的是,在数据量较大的生产环境中,该操作可能对性能产生影响,建议在低峰期执行或使用 `SCAN` 命令替代以避免阻塞[^4]。 ### 整合 Caffeine 与 Redis 的所有缓存 key 为了统一获取两级缓存中的所有 key,可以将上述两个方法整合到一个服务类中,分别获取本地和远程缓存的 key 并合并结果: ```java import org.springframework.cache.CacheManager; import org.springframework.data.redis.core.RedisTemplate; import java.util.HashSet; import java.util.Set; public class MultiLevelCacheService { private final CacheManager cacheManager; private final RedisTemplate<String, Object> redisTemplate; public MultiLevelCacheService(CacheManager cacheManager, RedisTemplate<String, Object> redisTemplate) { this.cacheManager = cacheManager; this.redisTemplate = redisTemplate; } public Set<String> getAllCacheKeys() { Set<String> allKeys = new HashSet<>(); // 获取所有本地缓存 key for (String cacheName : cacheManager.getCacheNames()) { Cache cache = cacheManager.getCache(cacheName); if (cache != null) { allKeys.addAll(cache.getNativeCache().getKeys()); } } // 获取所有 Redis 缓存 key Set<byte[]> redisKeys = redisTemplate.getConnectionFactory().getConnection().keys("*".getBytes()); for (byte[] key : redisKeys) { allKeys.add(new String(key)); } return allKeys; } } ``` 该服务类通过遍历 `CacheManager` 中注册的所有本地缓存,获取每个缓存的 key,并从 Redis 中获取所有 key,最终合并为一个完整的 key 集合。 ### 注意事项 - **性能问题**:获取所有缓存 key 是一种高开销操作,尤其是在 Redis 数据量大的情况下,应谨慎使用。 - **安全性**:在生产环境中,应限制此类操作的访问权限,防止暴露敏感信息。 - **扩展性**:如果未来引入其他类型的缓存实现,需扩展该服务类以支持新的缓存类型。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ability Liao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值