Caffeine and redis
17.4.1.Caffeine 和 redis 的区别
Caffeine 本身不会将数据存储到 Redis 中。如果你想要将数据缓存到 Redis 中,你需要使用专门为 Redis 设计的缓存解决方案,如 Spring Cache with Redis 或 Jedis。这些工具和库允许你直接与 Redis 数据库交互,将数据存储在 Redis 中并从中检索。
在一些复杂的应用中,Caffeine 和 Redis 可能会一起使用,每个在不同的层级提供缓存服务:
- Caffeine:作为第一层缓存,提供快速的本地缓存。它非常适合频繁访问且相对较小的数据集。
- Redis:作为第二层缓存,主要用于更大规模的、分布式的数据存储和缓存。它适合需要跨多个应用实例共享的数据。
在这样的设置中,通常首先检查 Caffeine 缓存中是否存在所需的数据。如果未找到,然后检查 Redis 缓存,并且可能将从 Redis 检索的数据放入 Caffeine 缓存以加快后续访问的速度。
17.2.结合使用 Caffeine 和 Redis
要创建一个服务,整合 Caffeine 和 Redisson 缓存,你可以遵循以下步骤。此服务将首先检查 Caffeine 缓存中是否存在所需数据。如果未找到,它将检查 Redisson 缓存,并可能将从 Redisson 检索的数据放入 Caffeine 缓存以加快后续访问的速度。
编写一个整合 Caffeine 和 Redisson 的服务类
package com.litongjava.tio.boot.hello.services;
import com.github.benmanes.caffeine.cache.Cache;
import com.litongjava.jfinal.aop.annotation.Service;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import com.litongjava.jfinal.aop.Aop;
@AService
public class CacheService {
private final Cache<String, Object> caffeineCache;
private final RedissonClient redissonClient;
public CacheService() {
this.caffeineCache = Aop.get(Cache.class);
this.redissonClient = Aop.get(RedissonClient.class);
}
public Object get(String key) {
// 首先尝试从 Caffeine 缓存中获取数据
Object value = caffeineCache.getIfPresent(key);
if (value != null) {
return value;
}
// 如果 Caffeine 缓存中没有,则尝试从 Redisson 缓存中获取
RBucket<Object> bucket = redissonClient.getBucket(key);
value = bucket.get();
if (value != null) {
// 如果在 Redisson 中找到数据,则将其添加到 Caffeine 缓存中
caffeineCache.put(key, value);
}
return value;
}
public void put(String key, Object value) {
// 同时更新 Caffeine 和 Redisson 缓存
caffeineCache.put(key, value);
RBucket<Object> bucket = redissonClient.getBucket(key);
bucket.set(value);
}
}
说明
服务类 (CacheService
): - 这个类整合了 Caffeine 和 Redisson 客户端。 - get(String key)
方法首先尝试从 Caffeine 缓存获取数据。如果未找到,它会从 Redisson 获取数据,并且将其放入 Caffeine 缓存中。 - put(String key, Object value)
方法同时更新 Caffeine 和 Redisson 缓存。
缓存客户端获取: - 使用 Aop.get
方法从 JFinal AOP 容器中获取 Caffeine 缓存和 Redisson 客户端实例。
使用服务: - 你可以在你的应用程序中的其他部分,如控制器或业务逻辑层中,注入或实例化 CacheService
类,并通过它来处理缓存逻辑。
这个服务提供了一个简单的方式来整合两种不同类型的缓存,利用了 Caffeine 的高性能本地缓存能力和 Redisson 的分布式缓存能力。通过这种方式,你可以提高数据检索的效率和应用程序的整体性能。
测试 Controller
package com.litongjava.tio.boot.hello.AController;
import com.litongjava.jfinal.aop.Aop;
import com.litongjava.tio.boot.hello.services.CacheService;
import com.litongjava.annotation.RequestPath;
import lombok.extern.slf4j.Slf4j;
@AController
@RequestPath("/cache")
@Slf4j
public class CacheTestController {
@RequestPath("/test")
public Object test() {
CacheService cacheService = Aop.get(CacheService.class);
String key = "cache-test1234";
Object value = cacheService.get(key);
if (value == null) {
log.info("计算新的value");
value = "12343";
cacheService.put(key, value);
}
return value;
}
}