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.tio.http.server.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;
  }
}