新特性预览
- SSL
- ACL: 更好,命令支持
- RESP3
- Client side caching:重新设计
- Threaded I/O
- Diskless replication on replicas
- Cluster support in Redis-benchmark and improved redis-cli cluster support
- Disque in beta as a module of Redis: 开始侵入消息队列领域
- Redis Cluster Proxy
- 支持RDB不再使用时可立即删除,针对不落盘的场景
- PSYNC2: 优化的复制协议
- 超时设置支持更友好
- 更快的RDB加载,20% ~ 30%的提升
STRALGO,新的字符串命令,目前只有一个实现LCS (longest common subsequence)
Client side caching(客户端缓存)
Redis实现的是一个服务端协助的客户端缓存,叫做
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会主动发送一条失效消息
REDIRECT : 将失效消息转发给另外一个客户端。当不使用RESP3而是使用老的RESP2和Redis通讯时,client本身不支持处理失效消息,所以可以开启一个支持Pub/Sub客户端处理失效消息。当然如果客户端支持RESP3也可以将失效消息转发给另外一个客户端。这个cace放在最后演示。
- BCAST: 使用广播模式开始tracking。在这种模式下客户端需要设置将track的key的前缀,这些key的失效消息会广播给所有参与的客户端,不管这些客户端是否请求/缓存额这些key。不开始广播模式时,Redis只会track那些只读命令请求的key,并且只会报告一次失效消息。
- PREFIX : 只应用了广播模式,注册一个key的前缀。所有以这个前缀开始的key有修改时,都会发送失效消息。可以注册多个前缀。如果不设置前缀,那么广播模式会track每一个key。
- OPTIN: 当广播模式没有激活时,正常不会track只读命令的key,除非它们在CLIENT CACHING yes之后被调用。
- OPTOUT: 当广播模式没有激活时,正常会track只读命令的key,除非它们在CLIENT CACHING off之后被调用。
- NOLOOP: 不发送client自己修改的key。
环境说明
Redis6.0.5(安装参考如下)
语雀内容
为了更好的观察redis的返回结果,使用telnet
而不是redis-cli
作为client连接redis,因为redis-cli对结果做了处理,尤其是失效消息,可能无法观测到。
1、BCAST 广播模式 (client tracking on
)
A.使用Telent连接6380端口进行测试(监听响应的协议内容),连接上之后发送hello 3
开启RESP3协议-(在设置新的监听模式前需要关闭其他的监听模式)
$ telnet 127.0.0.1 6380
$ hello 3
version
$5
6.0.5
$5
proto
:3
$2
id
:1648
$4
mode
$10
standalone
$4
role
$6
master
$7
modules
*1
%2
$4
name
$2
bf
$3
ver
:20201
B.通过telnet开启 tracking 操作Redis Server
client tracking on
+OK
set a 1
+OK
get a
$1
1
C.使用Redis-cli更新a的值,观察telent收到失效消息
更新值
127.0.0.1:6380> set a 2
OK
D.取消tracking
$ client tracking off
2、tracking特定前缀的key (client tracking on
)
上面的方式会tracking所有的key,如果只想跟踪特定的key, 目前redis提供了一种方式,也就是前缀匹配的方式。可以tracking特定前缀的key。它应用了广播模式。
A.使用telnet client设定前缀和开启tracking(在设置新的监听模式前需要关闭其他的监听模式)-(在设置新的监听模式前需要关闭其他的监听模式)
并设置key以及初值
hello 3
client tracking off
+OK
client tracking on prefix a bcast
+OK
client tracking on prefix user bcast
+OK
set abc 100
>2
$10
invalidate
*1
$3
abc
set user:211 good
+OK
>2
$10
invalidate
*1
$8
user:211
set feed 112
+OK
B.使用Redis-cli更新具有特定前缀的key值,可以在telnet观察到失效消息
127.0.0.1:6380> set abc 101
OK
127.0.0.1:6380> set user:211 bad
OK
127.0.0.1:6380> set feed 1222
OK
telnet client收到abc
和user:211
的失效消息,而不会收到feed
的失效消息:
C.通过client tracking off
停止客户端缓存
目前貌似不能只停止对单个的前缀的tracking
。即使使用client tracking off prefix user
也是取消对所有的key的tracking
。
client tracking off
+OK
3、选择加入(optin)
如果使用OPTIN
,可以有选择的开启tracking
。只有发送client caching yes
之后的下一条的只读命令的key才会tracking
, 否则其它的只读命令中的key不会tracking。
A.首先开始optin
,读取a的指,这个时候使用redis-cli client修改a的值为1000,并没有收到a
的失效消息。-(在设置新的监听模式前需要关闭其他的监听模式)
hello 3
client tracking off
+OK
client tracking on optin
+OK
get a
$1
2
B.接下来发送client caching yes
,紧接着获取a的值,这个时候如果再修改a的值,就可以收到一条a的失效消息
client tracking on optin
+OK
get a
$1
2
client caching yes
+OK
get a
$1
2
set a 1
>2
$10
invalidate
*1
$1
a
+OK
C.必须是紧跟着client caching yes
,比如发送下面的命令,只会tracking
abc,而不是a
client caching yes
+OK
get abc
$3
101
set abc 100
>2
$10
invalidate
*1
$3
abc
+OK
set a 2
+OK
get a
$2
2
4、选择退出
如果使用OPTOUT
,也可以有选择的退出tracking
。只有发送client caching off
之后的下一条的只读命令的key才会停止tracking
, 否则其它的只读命令中的key都会被tracking。
可以看到它和OPTIN
正好相反,可以根据场景来选择。
A.开启OPTOUT
之后,对任意的key的变动都收到失效消息-(在设置新的监听模式前需要关闭其他的监听模式)
hello 3
client tracking off
+OK
client tracking on optout
+OK
get a
$2
2
set a 1
>2
$10
invalidate
*1
$1
a
+OK
set abc 111
+OK
get abc
$3
111
set abc 123
>2
$10
invalidate
*1
$3
abc
+OK
B.排除b
这个key,只针对他的监听排除,之后对b的变动并不会收到b的失效消息。
client caching no
+OK
get b
_
set b 123
+OK
set abc 124
+OK
get abc
$3
124
set abc 123
>2
$10
invalidate
*1
$3
abc
+OK
注意: OPTIN
和OPTOUT
是针对的非BCAST场景,也就是只有发送了key的只读命令后,才会跟踪相应的key。而广播模式是无论是否发送过key的只读命令,只要redis修改了key,都会发送相应key(或者匹配前缀的key)的失效消息。
5、NOLOOP
正常设置时,失效消息是发给所有参与的client,但是如果设置了NOLOOP
,则不会发送给更新这个key的client。
hello 3
client tracking off
+OK
client tracking on bcast noloop
+OK
get a
$1
1
set a 2
+OK
set a 1
+OK
client tracking off
+OK
client tracking on bcast
+OK
get a
$1
1
set a 2
+OK
>2
$10
invalidate
*1
$1
a
6、REDIRECT
转发消息的处理。这是为了兼容RESP2协议一个处理方式,将失效消息转发给另外一个client。
A.首先查看redis-cli的client id
127.0.0.1:6380> client list
id=7 addr=127.0.0.1:40819 fd=11 name=sentinel-4b84598d-cmd age=5415 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=publish user=default
id=8 addr=127.0.0.1:33181 fd=12 name=sentinel-4b84598d-pubsub age=5415 idle=0 flags=P db=0 sub=1 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=subscribe user=default
id=9 addr=127.0.0.1:57018 fd=13 name=sentinel-a4c5c2fb-cmd age=5415 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=publish user=default
id=10 addr=127.0.0.1:42870 fd=14 name=sentinel-a4c5c2fb-pubsub age=5415 idle=0 flags=P db=0 sub=1 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=subscribe user=default
id=4 addr=127.0.0.1:46312 fd=8 name= age=5415 idle=0 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=replconf user=default
id=1648 addr=121.239.106.21:53729 fd=16 name= age=3780 idle=426 flags=t db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=set user=default
id=1619 addr=127.0.0.1:39158 fd=15 name= age=3807 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
id=5 addr=127.0.0.1:59946 fd=9 name=sentinel-14bd5b81-cmd age=5415 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping user=default
id=6 addr=127.0.0.1:51611 fd=10 name=sentinel-14bd5b81-pubsub age=5415 idle=0 flags=P db=0 sub=1 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=subscribe user=default
B.使用telnet连接redis,查看client id
client id
:1648
C.telnet 客户端开启订阅失效消息
hello 3
client tracking off
+OK
SUBSCRIBE __redis__:invalidate
>3
$9
subscribe
$20
__redis__:invalidate
:1
client tracking on bcast redirect 1648
+OK
D.在Redis-cli进行值更新
127.0.0.1:6380> set a 100
OK
E.可以看到telnet客户端收到了失效信息
>2
$10
invalidate
*1
$1
a
如果要转发的目的client开启了RESP3协议,就不需要RESP3 Pub/Sub了,因为RESP3原生支持Push消息。
redis的tracking feature的实现代码在:tracking.c。