Redis 6客户端追踪简介

作者:Wen Hui

转载:中间件小哥

客户端追踪是Redis 6中引入的新概念。这个特性主要辅助客户端在Redis服务端键值被其他客户端更新后,能及时通知客户端将缓存过的键值逐出并更新。从而减少或避免数据一致性带来的问题。目前的客户端追踪包含以下模式:

1)普通追踪模式

命令:CLIENT TRACKING ON

特点:

1.当客户端开启追踪时,服务器端保存一个无效表(Invalidation Table)来记录所有相应客户端读取过的键的信息。

2.当相应的键被更改时,向相应的客户端发送缓存无效信息。

普通追踪模式优点:

只针对特定客户端发送键无效信息。节省服务器端和客户端CPU资源。

追踪模式缺点:

相对于其他模式来说耗费更多服务器端内存,因为需要记住启用普通追踪模式的客户端访问过的所有键。

例子:

如下图所示,左上窗口代表客户端1连接,左下代表客户端1的缓存失效消息连接,右边窗口代表客户端2,在客户端1查询并模拟缓存过foo键的值后,如果客户端2随后更新foo的值,则客户端1的缓存失效消息连接会接收到服务器的消息,通知foo键已经被更新过了,需要客户端重新查询并缓存新的值。

2)广播追踪模式

命令:CLIENT TRACKING ON BROADCAST PREFIX <PREFIX1> <PREFIX2> …

特点:

1. 服务器保存一个键前缀表(Prefix Table)来记录客户端需要追踪的键前缀,而不是记录所有相应的客户端访问过的键。

2. 当满足特定键前缀中的任何键被更新时,服务器向所有订阅特定前缀的客户端发送缓存无效信息。

广播追踪模式优点:

服务器端只需要记住客户端感兴趣的键前缀信息,节省服务器端内存。

广播追踪模式缺点:

如果特定键前缀中的任何键被更新时,服务器需要向所有订阅该键前缀的客户端发送缓存无效消息。耗费服务器端和客户端CPU及网络资源,并且客户端可能收到很多没有缓存过的键的无效消息。

例子:

如下图所示,左边1列代表客户端1的客户端连接和缓存失效消息连接,中间一列代表客户端2的客户端连接和缓存失效连接,右边一个窗口代表客户端3.首先客户端1和客户端2开启了广播追踪模式,客户端1注册了foo:和bar:两个键前缀,客户端2注册了foo:和ttt:两个键前缀。客户端1和2分别模拟查询并缓存了foo:1和foo:2两个键。在客户端3更新foo:1后,因为客户端1和2都注册了foo:前缀,所以都会收到缓存失效的消息,即使客户端2没有缓存foo:1键的值。

image

3)普通追踪模式下的OPT IN模式

命令:CLIENT TRACKING ON OPTIN

特点:

客户端需要显式通过CLIENT CACHING YES命令指定下一个读请求的键需要被追踪(默认情况下不追踪),其他与普通追踪模式相同。

例子:

如下图所示,左边两个窗口代表客户端1的客户端连接和缓存失效消息连接,右边窗口代表客户端2.客户端1启用客户端追踪OPT IN模式并模拟缓存了foo键,当客户端2更新foo键的值后客户端1没有接收到缓存失效的消息,因为OPT IN模式是默认不开启的。当客户端显式使用CLIENT CACHING YES 并缓存foo键的值后,客户端2更新foo键的值,这时客户端1会接收到缓存失效消息。但CLIENT CACHING YES只对下一个读请求有效。

image

4)普通追踪模式下的OPT OUT模式

命令: CLIENT TRACKING ON OPTOUT

特点:

用户需要显式通过CLIENT CACHING NO指定下一个键不需要追踪(默认情况下追踪),其他与普通追踪模式相同。

例子:

如下图所示,和上一个例子类似,左边两个窗口代表客户端1的客户端连接和缓存失效消息连接,右边窗口代表客户端2.客户端1启用客户端追踪OPT OUT模式并模拟缓存了foo键,与OPT IN模式相反,当客户端2更新foo键的值后客户端1会收到缓存失效消息。但当客户端1使用CLIENT CACHING NO并缓存rrr键时,客户端2更新rrr键,客户端1没有接收到缓存失效消息。因为客户端已经显示指定这个键rrr不需要被追踪,与OPT IN 模式相同,CLIENT CACHING NO只对下一个读请求有效,当客户端1缓存ttt并被客户端2修改时,客户端1会恢复收到缓存失效的消息。

image

OPT IN/OUT模式优点:

相对于普通追踪模式而言,OPT IN/OUT 模式可以显式指定那些键需要被追踪哪些不需要,因此相对普通追踪模式来说更节省服务器端内存和CPU处理时间。

OPT IN/OUT模式缺点:

程序需要更细粒度控制对每个键进行追踪。以此带来的实现复杂度。

目前Redis客户端缓存需要注意问题

  1. 目前大部分的Redis客户端目前没有支持RESP3 协议,如果使用RESP2协议需要创建额外的发布订阅客户端连接来接收缓存无效信息。

2. Proxy端的支持。

3. 双连接模式下,客户端更新本地缓存和接收其他客户端更改数据导致的Redis缓存无效消息间存在竞态条件(race condition)。需要在客户端程序中做仔细的处理。

Future

根据Salvatore的社交媒体消息,未来客户端追踪部分代码可能会进行相应改变,其中主要变动是在特定情况下,Redis服务端发送给客户端中的缓存无效消息中直接将更改过的键值放入其中,从而避免客户端再向Redis服务器端读取相应的更新过的键值。从而节省服务器端和客户端的CPU和节省系统网络带宽。

在接下来的文章中,我们会讲解这一部分的Redis源码实现。

参考资料:

https://redis.io/topics/client-side-caching

https://github.com/antirez/redis

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352