时间:2023-04-21 02:39:02 | 来源:网站运营
时间:2023-04-21 02:39:02 来源:网站运营
Redis 6.0 除了多线程,别忘了这个牛逼特性!:I just released Redis 6.0.1. Unfortunately there was a bug in Redis 6.0.0 introduced just a few days before the release, that only happens when using the non-default allocator (libc malloc in this case triggers it). Optimization reverted, 6.0.1 released. Sorry for the issue.本文主要关注Client side caching(客户端缓存)这一特性。
smallnest/RESP3 是Redis RESP3协议的解析库,你可以使用它和Redis底层通讯,或者包装它实现新版的Redis client库或者Redis Server端。一年前,当 @antirez 参加完纽约Redis大会后,5:30就在旅店中醒来了,面对曼哈顿街头的美丽景色,在芸芸众生中思索Redis的未来。包括客户端缓存。
L1 cache
等,采用memcached等产品作为热数据的缓存。那么就有一个问题,如何能够及时的同步这些cache和redis的数据呢?Ben提供了非常有意思的想法。tracking
。客户端缓存的命令是:CLIENT TRACKING ON|OFF [REDIRECT client-id] [PREFIX prefix] [BCAST] [OPTIN] [OPTOUT] [NOLOOP]
当tracking
开启时, Redis会"记住"每个客户端请求的key,当key的值发现变化时会发送失效信息给客户端(invalidation message)。失效信息可以通过RESP3协议发送给请求的客户端,或者转发给一个不同的连接(支持RESP2+ Pub/Sub)。当广播模式(broadcasting)开启时,参与tracking
的客户端会收到它通过前缀订阅的key的相关的通知,即使它没请求过对应的key。同时还提供了OPTIN
、OPTOUT
等模式。失效消息:当一个key的数据有修改的时候,需要告诉客户端它以前缓存的数据失效了,这时redis会主动发送一条失效消息
tracking
。在这种模式下客户端需要设置将track的key的前缀,这些key的失效消息会广播给所有参与的客户端,不管这些客户端是否请求/缓存额这些key。不开始广播模式时,Redis只会track那些只读命令请求的key,并且只会报告一次失效消息。CLIENT CACHING yes
之后被调用。CLIENT CACHING off
之后被调用。REDIRECT <id>
放在最后介绍。make distcleanmakemake testsudo make install
相信很快就有编译好的二进制包可以下载。redis-server
使用redis-cli
访问,默认访问本机的6379实例:redis-cli
当然你可以通过-h
查看额外的参数配置,比如使用其它端口等等,这里我们使用最简单的例子,重点是了解客户端缓存的特性。telnet
而不是redis-cli
作为client连接redis,因为redis-cli对结果做了处理,尤其是失效消息,你可能无法观测到。client tracking on
)hello 3
开启RESP3协议:➜ ~ telnet localhost 6379Trying ::1...Connected to localhost.Escape character is '^]'.hello 3%7$6server$5redis$7version$56.0.1......
之后尝试开启tracking
并读取a
的值:client tracking on+OKset a 1+OKget a$11
这个时候如果使用redis-cli作为另外一个client更新a
的值,telnet这个client应该能获得通知:127.0.0.1:6379> set a 2OK
观察telnet,它收到了一个失效消息:>2$10invalidate*1$1a
注意它采用RESP3中的PUSH类型(>
)。a
的值,telnet不会再收到失效消息。除非telnet client再get a
一次,重新tracking
a的值。tracking
:client tracking off
client tracking on
)hello 3.......client tracking on prefix a bcast+OKclient tracking on prefix user bcast+OK
我们tracking两个前缀,以a
开头的所有的key和以user
开头的所有的key,所有a
开头的所有的key和以user
开头的所有的key(包括a
和user
)的key变动时它应该都收到消息。abc
、user:32432723213
和feed:6532343243432
:127.0.0.1:6379> set abc 100OK127.0.0.1:6379> set user:32432723213 goodOK127.0.0.1:6379> set feed:6532343243432 abcOK
telnet client收到abc
和user:32432723213
的失效消息,而不会收到feed:6532343243432
的失效消息:>2$10invalidate*1$3abc>2$10invalidate*1$16user:32432723213
你可以通过client tracking off
停止客户端缓存。目前貌似不能只停止对单个的前缀的tracking
。即使你使用client tracking off prefix user
也是取消对所有的key的tracking
。......} else if (!strcasecmp(c->argv[2]->ptr,"off")) { disableTracking(c);} else {......
OPTIN
,可以有选择的开启tracking
。只有你发送client caching yes
之后的下一条的只读命令的key才会tracking
, 否则其它的只读命令中的key不会tracking。optin
,读取a的指,这个时候使用redis-cli client修改a的值为1000,我们并没有收到a
的失效消息。client tracking on optin+OKget a$12
接下来我们发送client caching yes
,紧接着获取a的值,这个时候如果再修改a的值,你就可以收到一条a的失效消息:client caching yes +OK get a $4 1000 >2 $10 invalidate *1 $1 a
必须是紧跟着client caching yes
吗?是的,比如发送下面的命令,只会tracking
b,而不是a:client caching yes +OK get b _ get a $4 2000
OPTOUT
,你也可以有选择的退出tracking
。只有你发送client caching off
之后的下一条的只读命令的key才会停止tracking
, 否则其它的只读命令中的key都会被tracking。OPTIN
正好相反,你可以根据你的场景来选择。OPTOUT
之后,对任意的key的变动都收到失效消息:client tracking on optout +OK get a $4 3000 >2 $10 invalidate *1 $1 a
这个时候如果我们想排除b
这个key,可以只针对它进行设置:client caching no +OK get b $1 3
之后对b的变动并不会收到b的失效消息。OPTIN
和OPTOUT
是针对的非BCAST场景,也就是只有你发送了key的只读命令后,才会跟踪相应的key。而广播模式是无论你是否发送过key的只读命令,只要redis修改了key,都会发送相应key(或者匹配前缀的key)的失效消息。NOLOOP
,则不会发送给更新这个key的client。client tracking on bcast noloop +OK set a 1 +OK client tracking off +OK client tracking on bcast +OK set a 1 +OK >2 $10 invalidate *1 $1 a
注意,取消tracking只需调用client tracking off
即可。127.0.0.1:6379> client listid=4 addr=127.0.0.1:61017 fd=8 name= age=33103 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client user=default
使用telnet连接redis,查看client id:client id:12
telnet 客户端开启订阅失效消息:SUBSCRIBE __redis__:invalidate *3 $9 subscribe $20 __redis__:invalidate :1
然后我们就可以将redis-cli的失效消息转发给telnet client:client tracking on bcast redirect 12127.0.0.1:6379> set a 1000OK
可以看到telnet客户端收到了失效消息:*3 $7 message $20 __redis__:invalidate *1 $1 a
如果你要转发的目的client开启了RESP3协议,你就不需要RESP3 Pub/Sub了,因为RESP3原生支持Push消息。关键词:特性