Redis 6.0 新特性篇:Client Side Cache 是嘛玩意?
共 3400字,需浏览 7分钟
·
2021-09-22 20:32
为啥需要客户端缓存
Redis
的Tracking Feature
的实现代码在: https://github.com/antirez/redis/blob/unstable/src/tracking.c
。
很多公司使用 Redis 做缓存系统,并且很好的提高了数据访问的性能,为了进一步应对热点数据,还是会在 Redis 的 Client 端缓存一部分热点数据,用来应对「吃瓜事件」。
比如,「这该死的 996 福报」、「吴亦凡之大方牢房」、「时间管理大师」、「思聪舔我不得就锤我」、「吴秀波之谈恋爱么,能坐牢的那种」……
除了使用 Redis 缓存避免直接访问数据库以外,还会加更多的cache
层,比如采用 Memcachced
作为热点数据的本地缓存:
先去
Memcachced
中查询数据,命中直接返回。Memcachced
未命中,则再从 Redis 查询,命中则返回数据,并在Memcachced
保存这个数据。Redis 未命中,则去
MySQL
中查询,并依次设置到 Redis 和Memcachced
中。
访问本地内存的的性能必然比通过网络访问 Redis 快,所以这种模式可以极大地减少获取数据的延迟,并且可以减少 Redis 的负载,提高性能。
访问 Redis 获取数据,服务器响应。
使用客户端缓存,应用程序将获取的热门的数据存储在应用程序中,无需再次通过网络访问 Redis。
我们不应该缓存不断变化的键。 我们不该缓存很少请求的键。 我们希望缓存经常请求并以合理速率更改的键。对于没有稳定变化速度的例子,比如不断被 INCR
修改的全局计数器,就不应该缓存。
客户端缓存实现原理
tracking
。客户端缓存的命令是:CLIENT TRACKING ON|OFF [REDIRECT client-id] [PREFIX prefix] [BCAST] [OPTIN] [OPTOUT] [NOLOOP]
Tracking
功能提供了两种模式解决这个问题,分别是使用RESP3 协议版本的普通模式和广播模式,以及使用 RESP2 协议版本的转发模式。普通模式
tracking
开启时, Redis
会「记住」每个客户端请求的 key
,当 key
的值发现变化时会发送失效信息给客户端 (invalidation message
)。RESP3
协议发送给请求的客户端,或者转发给一个不同的连接 (支持 RESP2 + Pub/Sub
) 的客户端。Server 端将 Client 访问的 key以及该 key 对应的客户端 ID 列表信息存储在全局唯一的表(TrackingTable),当表满了,回移除最老的记录,同时触发该记录已过期的通知给客户端。 每个 Redis 客户端又有一个唯一的数字 ID,TrackingTable 存储着每一个 Client ID,当连接断开后,清除该 ID 对应的记录。 TrackingTable 表中记录的 Key 信息不考虑是哪个 database 的,虽然访问的是 db1 的 key,db2 同名 key 修改时会客户端收到过期提示,但这样做会减少系统的复杂性,以及表的存储数据量。
TrackingTable
存储普通模式的客户端数据,它的数据类型是基数树 ( radix tree)。CLIENT TRACKING ON|OFF
+OK
GET user:211
$3
广播模式(BCAST)
client tracking on bcast prefix user
PrefixTable
存储广播模式下的客户端数据,它存储**前缀字符串指针和(需要通知的 key 和客户端 ID)**的映射关系。转发模式
_redis_:invalidate
。//客户端B执行,客户端 B 的 ID 号是 606
SUBSCRIBE _redis_:invalidate
//客户端 A 执行
CLIENT TRACKING ON BCAST REDIRECT 606
_redis_:invalidate
频道获取失效消息了。有道无术,术可成;有术无道,止于术
欢迎大家关注Java之道公众号
好文章,我在看❤️