「最强」Lettuce 已支持 Redis6 客户端缓存

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 在 **redis 6.0** 版本中,已经默认支持了客户端缓存功能,Java 中主流的连接客户端 **lettuce** 在最新的快照版本 (6.0.0.BUILD-SNAPSHOT) 已经提供支持。 下边就通过代码来体验一下客户端缓存的神奇功能。

Redis 客户端缓存

缓存的解决方案一般有两种:

【L1】 内存缓存(如 Caffeine、Ehcache) —— 速度快,进程内可用,但重启缓存丢失,出现缓存雪崩的问题。

【L2】集中式缓存(如 Redis)—— 可同时为多节点提供服务,但高并发下,带宽成为瓶颈。

业内有很多开源框架来解决以上问题,既能有 L1 速度,并且拥有 L2 集群态。如下

J2Cache 两级缓存框架

hotkey 热点数据实时同步

redis 6.0 版本中,已经默认支持了客户端缓存功能,Java 中主流的连接客户端 lettuce 在最新的快照版本 (6.0.0.BUILD-SNAPSHOT) 已经提供支持。 下边就通过代码来体验一下客户端缓存的神奇功能。

Redis 6.0 安装

安装 redis 6,这里通过 Docker 安装命令如下

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

Jar 依赖

注意: 这里使用 lettuce 客户端,注意当前使用 6.0 的快照版本 ,需要在 pom 增加 lettuce 快照仓库

  • 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>

代码操作

  • 使用 lettuce 连接 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)修改,lettuce 客户端确实感知到了数据变化。 但 lettuce 到底 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 操作只有以上注释的几条,说明客户端缓存生效。

总结

  • 当前仅有 lettuce 支持此功能,jedis 还未支持
  • spring-boot-data-redis 暂未支持此功能,估计需要 spring boot 2.5 版本
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
6天前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
22天前
|
缓存 NoSQL Java
Redis深度解析:解锁高性能缓存的终极武器,让你的应用飞起来
【8月更文挑战第29天】本文从基本概念入手,通过实战示例、原理解析和高级使用技巧,全面讲解Redis这一高性能键值对数据库。Redis基于内存存储,支持多种数据结构,如字符串、列表和哈希表等,常用于数据库、缓存及消息队列。文中详细介绍了如何在Spring Boot项目中集成Redis,并展示了其工作原理、缓存实现方法及高级特性,如事务、发布/订阅、Lua脚本和集群等,帮助读者从入门到精通Redis,大幅提升应用性能与可扩展性。
49 0
|
7天前
|
存储 NoSQL Redis
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
Redis持久化、RDB和AOF方案、Redis主从集群、哨兵、分片集群、散列插槽、自动手动故障转移
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
|
26天前
|
NoSQL 网络协议 Redis
【Azure Redis】AKS中使用Lettuce连接Redis Cache出现 timed out 问题的解决思路
【Azure Redis】AKS中使用Lettuce连接Redis Cache出现 timed out 问题的解决思路
【Azure Redis】AKS中使用Lettuce连接Redis Cache出现 timed out 问题的解决思路
|
17天前
|
缓存 NoSQL 关系型数据库
MySQL与Redis缓存一致性的实现与挑战
在现代软件开发中,MySQL作为关系型数据库管理系统,广泛应用于数据存储;而Redis则以其高性能的内存数据结构存储特性,常被用作缓存层来提升数据访问速度。然而,当MySQL与Redis结合使用时,确保两者之间的数据一致性成为了一个重要且复杂的挑战。本文将从技术角度分享MySQL与Redis缓存一致性的实现方法及其面临的挑战。
42 2
|
20天前
|
Java UED Maven
紧跟技术潮流:手把手教你构建响应式Vaadin应用,让用户体验无缝接轨!
【8月更文挑战第31天】本文从零开始,详细介绍如何使用强大的Java框架Vaadin构建流畅且响应式的Web应用程序。首先,确保安装JDK 1.8+、Maven 3.3.9+及IDE。接着,创建Maven项目并添加Vaadin依赖。然后,通过继承`UI`类创建主界面,并定义自定义主题与样式。利用Vaadin的响应式布局组件,如`HorizontalLayout`和`VerticalLayout`,实现多设备兼容性。
27 0
|
20天前
|
缓存 NoSQL Redis
Entity Framework Core 与 Redis 强强联手!实现高速缓存,提升应用性能超厉害
【8月更文挑战第31天】在现代应用开发中,结合 Entity Framework Core 与 Redis 可显著提升数据访问速度。Entity Framework Core 是一个强大的 ORM 框架,但处理频繁访问的数据时可能遇到性能瓶颈。Redis 作为高性能内存数据库,具备快速读写能力。两者结合利用 Redis 高速缓存,减少直接数据库访问,提高应用响应速度及性能。
31 0
|
22天前
|
缓存 NoSQL Java
惊!Spring Boot遇上Redis,竟开启了一场缓存实战的革命!
【8月更文挑战第29天】在互联网时代,数据的高速读写至关重要。Spring Boot凭借简洁高效的特点广受开发者喜爱,而Redis作为高性能内存数据库,在缓存和消息队列领域表现出色。本文通过电商平台商品推荐系统的实战案例,详细介绍如何在Spring Boot项目中整合Redis,提升系统响应速度和用户体验。
44 0
|
26天前
|
NoSQL 网络协议 Linux
【AKS+Redis】AKS中客户端(ioredis)遇见Azure Redis服务Failover后链接中断的可能性
【AKS+Redis】AKS中客户端(ioredis)遇见Azure Redis服务Failover后链接中断的可能性
|
26天前
|
NoSQL 网络协议 Linux
【Azure Redis】Lettuce客户端遇见连接Azure Redis长达15分钟的超时
【Azure Redis】Lettuce客户端遇见连接Azure Redis长达15分钟的超时