«Самый сильный» Lettuce поддерживает кеш клиента Redis6

Java Redis

Кэш клиента Redis

Обычно есть два решения для кэширования:

[L1] Кэш памяти (типа Caffeine, Ehcache) - быстрый, доступен в процессе, но при перезапуске кеш теряется, и есть проблема лавинного кеша.

[L2] Централизованный кеш (например, Redis) — может предоставлять услуги для нескольких узлов одновременно, но при высокой степени параллелизма пропускная способность становится узким местом.

В отрасли существует множество сред с открытым исходным кодом для решения вышеуказанных проблем, которые могут иметь не только скорость L1, но и состояние кластера L2. следующее

Двухуровневая структура кэширования J2Cache

синхронизация в реальном времени данных о горячих клавишах

существует"redis 6.0"В версии функция клиентского кэша поддерживается по умолчанию, а клиент основного подключения на Java"lettuce"Поддержка доступна в последней версии снимка (6.0.0.BUILD-SNAPSHOT). Давайте воспользуемся кодом, чтобы испытать волшебную функцию кэширования на стороне клиента.

Установка Редис 6.0

Установитьredis 6, команда установки через Docker выглядит следующим образом

docker run --name redis6 -p 6379:6379 --restart=always -d redis:6.0.6

JAR-зависимости

Примечание: здесь используется клиент lettuce.Обратите внимание, что в настоящее время используется версия моментальных снимков 6.0, и репозиторий моментальных снимков lettuce необходимо добавить в pom.

  • 1.lettuce 6.0 зависимости снимков
<dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId>
    <version>6.0.0.BUILD-SNAPSHOT</version>
</dependency>
    1. Настроить репозиторий моментальных снимков
<repositories>
        <repository>
            <id>sonatype-snapshots</id>
            <name>Sonatype Snapshot Repository</name>
            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

манипулирование кодом

  • Используйте салат для подключения к Redis и переберите значение k1.
// <1> 创建单机连接的连接信息
RedisURI redisUri = RedisURI.builder()                    //
        .withHost("127.0.0.1")
        .withPort(6379)
        .build();
RedisClient redisClient = RedisClient.create(redisUri);
StatefulRedisConnection<String, String> otherParty = redisClient.connect();
RedisCommands<String, String> commands = otherParty.sync();
StatefulRedisConnection<String, String> connection = redisClient.connect();
// <2> 创建缓存访问器
Map<String, String> clientCache = new ConcurrentHashMap<>(); //map 自动保存所有操作key的 key=value
CacheFrontend<String, String> frontend = ClientSideCaching.enable(CacheAccessor.forMap(clientCache), connection,
        TrackingArgs.Builder.enabled());

// <3> 客户端正常写入测试数据 k1 v1
String key = "k1";
commands.set(key, "v1");
// <4> 循环读取
while (true) {
    // <4.1> 缓存访问器中的值,查看是否和 Redis 服务端同步
    String cachedValue = frontend.get(key);
    System.out.println("当前 k1 的值为:--->" + cachedValue);
    Thread.sleep(3000);
}
  • Клиент redis-cli одновременно использует k1 для изменения значения k1.

./redis-cli -h 127.0.0.1 -p 6379

> set k1 v2
  • Обратите внимание на лог консоли
...
当前 k1 的值为:--->v1
当前 k1 的值为:--->v1
当前 k1 的值为:--->v1
当前 k1 的值为:--->v2
当前 k1 的值为:--->v2
当前 k1 的值为:--->v2
....

Как указано выше: значение k1 изменяется на других клиентах (redis-cli), и клиент салата воспринимает изменение данных. Но салат в концеCacheFrontend.getВы запрашивали Redis?

Мы можем увидеть конкретные детали операции клиента с помощью следующего мониторинга

монитор


./redis-cli -h 127.0.0.1 -p 6379

> MONITOR
OK
1595922453.165088 [0 172.16.1.96:57482] "SET" "k1" "v1"   # 对应 <3> 写入测试数据
1595922453.168238 [0 172.16.1.96:57483] "GET" "k1"        # <4.1> 缓存访问器中的值,由于第一次查询为空需要穿透去查询 redis-server
1595922466.525942 [0 172.16.1.96:57498] "COMMAND"         # 其他客户端 redis-cli 接入 提醒
1595922472.046488 [0 172.16.1.96:57498] "set" "k1" "v2"   # 其他客户端 操作 k1
1595922474.208214 [0 172.16.1.96:57483] "GET" "k1"        # 由于k1 值发生变化,循环 <4.1> 会重新查询redis-server

Как указано выше: хотя это бесконечный цикл, выше всего несколько комментариев об операции redis, указывающих на то, что кеш клиента действует.

Суммировать

  • В настоящее время только салат поддерживает эту функцию, jedis еще не поддерживает ее.
  • spring-boot-data-redis еще не поддерживает эту функцию, предполагается, что требуется версия spring boot 2.5.