時(shí)間:2023-04-21 02:39:02 | 來源:網(wǎng)站運(yùn)營
時(shí)間:2023-04-21 02:39:02 來源:網(wǎng)站運(yùn)營
Redis 6.0 除了多線程,別忘了這個(gè)牛逼特性?。?br>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.本文主要關(guān)注Client side caching(客戶端緩存)這一特性。
smallnest/RESP3 是Redis RESP3協(xié)議的解析庫,你可以使用它和Redis底層通訊,或者包裝它實(shí)現(xiàn)新版的Redis client庫或者Redis Server端。一年前,當(dāng) @antirez 參加完紐約Redis大會(huì)后,5:30就在旅店中醒來了,面對(duì)曼哈頓街頭的美麗景色,在蕓蕓眾生中思索Redis的未來。包括客戶端緩存。
L1 cache
等,采用memcached等產(chǎn)品作為熱數(shù)據(jù)的緩存。那么就有一個(gè)問題,如何能夠及時(shí)的同步這些cache和redis的數(shù)據(jù)呢?Ben提供了非常有意思的想法。tracking
??蛻舳司彺娴拿钍?CLIENT TRACKING ON|OFF [REDIRECT client-id] [PREFIX prefix] [BCAST] [OPTIN] [OPTOUT] [NOLOOP]
當(dāng)tracking
開啟時(shí), Redis會(huì)"記住"每個(gè)客戶端請(qǐng)求的key,當(dāng)key的值發(fā)現(xiàn)變化時(shí)會(huì)發(fā)送失效信息給客戶端(invalidation message)。失效信息可以通過RESP3協(xié)議發(fā)送給請(qǐng)求的客戶端,或者轉(zhuǎn)發(fā)給一個(gè)不同的連接(支持RESP2+ Pub/Sub)。當(dāng)廣播模式(broadcasting)開啟時(shí),參與tracking
的客戶端會(huì)收到它通過前綴訂閱的key的相關(guān)的通知,即使它沒請(qǐng)求過對(duì)應(yīng)的key。同時(shí)還提供了OPTIN
、OPTOUT
等模式。失效消息:當(dāng)一個(gè)key的數(shù)據(jù)有修改的時(shí)候,需要告訴客戶端它以前緩存的數(shù)據(jù)失效了,這時(shí)redis會(huì)主動(dòng)發(fā)送一條失效消息
tracking
。在這種模式下客戶端需要設(shè)置將track的key的前綴,這些key的失效消息會(huì)廣播給所有參與的客戶端,不管這些客戶端是否請(qǐng)求/緩存額這些key。不開始廣播模式時(shí),Redis只會(huì)track那些只讀命令請(qǐng)求的key,并且只會(huì)報(bào)告一次失效消息。REDIRECT <id>
放在最后介紹。make distcleanmakemake testsudo make install
相信很快就有編譯好的二進(jìn)制包可以下載。redis-server
使用redis-cli
訪問,默認(rèn)訪問本機(jī)的6379實(shí)例:redis-cli
當(dāng)然你可以通過-h
查看額外的參數(shù)配置,比如使用其它端口等等,這里我們使用最簡單的例子,重點(diǎn)是了解客戶端緩存的特性。telnet
而不是redis-cli
作為client連接redis,因?yàn)閞edis-cli對(duì)結(jié)果做了處理,尤其是失效消息,你可能無法觀測(cè)到。client tracking on
)hello 3
開啟RESP3協(xié)議:? ~ 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
這個(gè)時(shí)候如果使用redis-cli作為另外一個(gè)client更新a
的值,telnet這個(gè)client應(yīng)該能獲得通知:127.0.0.1:6379> set a 2OK
觀察telnet,它收到了一個(gè)失效消息:>2$10invalidate*1$1a
注意它采用RESP3中的PUSH類型(>
)。a
的值,telnet不會(huì)再收到失效消息。除非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兩個(gè)前綴,以a
開頭的所有的key和以user
開頭的所有的key,所有a
開頭的所有的key和以user
開頭的所有的key(包括a
和user
)的key變動(dòng)時(shí)它應(yīng)該都收到消息。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
的失效消息,而不會(huì)收到feed:6532343243432
的失效消息:>2$10invalidate*1$3abc>2$10invalidate*1$16user:32432723213
你可以通過client tracking off
停止客戶端緩存。目前貌似不能只停止對(duì)單個(gè)的前綴的tracking
。即使你使用client tracking off prefix user
也是取消對(duì)所有的key的tracking
。......} else if (!strcasecmp(c->argv[2]->ptr,"off")) { disableTracking(c);} else {......
OPTIN
,可以有選擇的開啟tracking
。只有你發(fā)送client caching yes
之后的下一條的只讀命令的key才會(huì)tracking
, 否則其它的只讀命令中的key不會(huì)tracking。optin
,讀取a的指,這個(gè)時(shí)候使用redis-cli client修改a的值為1000,我們并沒有收到a
的失效消息。client tracking on optin+OKget a$12
接下來我們發(fā)送client caching yes
,緊接著獲取a的值,這個(gè)時(shí)候如果再修改a的值,你就可以收到一條a的失效消息:client caching yes +OK get a $4 1000 >2 $10 invalidate *1 $1 a
必須是緊跟著client caching yes
嗎?是的,比如發(fā)送下面的命令,只會(huì)tracking
b,而不是a:client caching yes +OK get b _ get a $4 2000
OPTOUT
,你也可以有選擇的退出tracking
。只有你發(fā)送client caching off
之后的下一條的只讀命令的key才會(huì)停止tracking
, 否則其它的只讀命令中的key都會(huì)被tracking。OPTIN
正好相反,你可以根據(jù)你的場(chǎng)景來選擇。OPTOUT
之后,對(duì)任意的key的變動(dòng)都收到失效消息:client tracking on optout +OK get a $4 3000 >2 $10 invalidate *1 $1 a
這個(gè)時(shí)候如果我們想排除b
這個(gè)key,可以只針對(duì)它進(jìn)行設(shè)置:client caching no +OK get b $1 3
之后對(duì)b的變動(dòng)并不會(huì)收到b的失效消息。OPTIN
和OPTOUT
是針對(duì)的非BCAST場(chǎng)景,也就是只有你發(fā)送了key的只讀命令后,才會(huì)跟蹤相應(yīng)的key。而廣播模式是無論你是否發(fā)送過key的只讀命令,只要redis修改了key,都會(huì)發(fā)送相應(yīng)key(或者匹配前綴的key)的失效消息。NOLOOP
,則不會(huì)發(fā)送給更新這個(gè)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只需調(diào)用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的失效消息轉(zhuǎn)發(fā)給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
如果你要轉(zhuǎn)發(fā)的目的client開啟了RESP3協(xié)議,你就不需要RESP3 Pub/Sub了,因?yàn)镽ESP3原生支持Push消息。關(guān)鍵詞:特性
客戶&案例
營銷資訊
關(guān)于我們
微信公眾號(hào)
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。