
「最强」Lettuce 已支持 Redis6 客户端缓存
发布日期:2021-05-09 04:22:00
浏览次数:20
分类:博客文章
本文共 2790 字,大约阅读时间需要 9 分钟。
Redis 客户端缓存
缓存的解决方案一般有两种:
【L1】 内存缓存(如 Caffeine、Ehcache) —— 速度快,进程内可用,但重启缓存丢失,出现缓存雪崩的问题。
【L2】集中式缓存(如 Redis)—— 可同时为多节点提供服务,但高并发下,带宽成为瓶颈。
业内有很多开源框架来解决以上问题,既能有 L1 速度,并且拥有 L2 集群态。如下
在 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 快照依赖
io.lettuce lettuce-core 6.0.0.BUILD-SNAPSHOT
-
- 配置快照仓库
sonatype-snapshots Sonatype Snapshot Repository https://oss.sonatype.org/content/repositories/snapshots/ true
代码操作
- 使用 lettuce 连接 redis ,并循环查看 k1 的值
// <1> 创建单机连接的连接信息RedisURI redisUri = RedisURI.builder() // .withHost("127.0.0.1") .withPort(6379) .build();RedisClient redisClient = RedisClient.create(redisUri);StatefulRedisConnectionotherParty = redisClient.connect();RedisCommands commands = otherParty.sync();StatefulRedisConnection connection = redisClient.connect();// <2> 创建缓存访问器Map clientCache = new ConcurrentHashMap<>(); //map 自动保存所有操作key的 key=valueCacheFrontend frontend = ClientSideCaching.enable(CacheAccessor.forMap(clientCache), connection, TrackingArgs.Builder.enabled());// <3> 客户端正常写入测试数据 k1 v1String 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> MONITOROK1595922453.165088 [0 172.16.1.96:57482] "SET" "k1" "v1" # 对应 <3> 写入测试数据1595922453.168238 [0 172.16.1.96:57483] "GET" "k1" # <4.1> 缓存访问器中的值,由于第一次查询为空需要穿透去查询 redis-server1595922466.525942 [0 172.16.1.96:57498] "COMMAND" # 其他客户端 redis-cli 接入 提醒1595922472.046488 [0 172.16.1.96:57498] "set" "k1" "v2" # 其他客户端 操作 k11595922474.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 版本
项目推荐:
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月03日 01时44分32秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
RESTful API 介绍,设计
2019-03-06
asp.net中用FileStream类实现下载文件功能,自定义下载路径,像IE下载一样
2019-03-06
C#获取Excel中所有的Sheet名称
2019-03-06
unity3d由于Camera.main.transform报空引用错误的解决方案
2019-03-06
SQL Syscolumns
2019-03-06
jQuery实现日期字符串格式化
2019-03-06
vue学习笔记(十)路由
2019-03-06
[最全整理]关于决策树的一切
2019-03-06
100天搞定机器学习|Day9-12 支持向量机
2019-03-06
100天搞定机器学习|Day19-20 加州理工学院公开课:机器学习与数据挖掘
2019-03-06
100天搞定机器学习|Day22 机器为什么能学习?
2019-03-06
100天搞定机器学习|day37 无公式理解反向传播算法之精髓
2019-03-06
数据工程师必备的8项技能,不要只知道Python!
2019-03-06
R in action读书笔记(3)-第六章:基本图形
2019-03-06
R in action读书笔记(19)第十四章 主成分和因子分析
2019-03-06
CISC和RISC是什么?它们的特点和区别?
2019-03-06
iOS UIAlertController
2019-03-06
iOS UISlider的使用
2019-03-06
iOS Xcode 打包之后,不能输出日志
2019-03-06
UIPickerView的使用(二)
2019-03-06