Redis 6.0 新特性篇:Client Side Cache 是嘛玩意?
為啥需要客戶端緩存
Redis 的Tracking Feature 的實現(xiàn)代碼在: https://github.com/antirez/redis/blob/unstable/src/tracking.c。
很多公司使用 Redis 做緩存系統(tǒng),并且很好的提高了數(shù)據(jù)訪問的性能,為了進一步應(yīng)對熱點數(shù)據(jù),還是會在 Redis 的 Client 端緩存一部分熱點數(shù)據(jù),用來應(yīng)對「吃瓜事件」。
比如,「這該死的 996 福報」、「吳亦凡之大方牢房」、「時間管理大師」、「思聰舔我不得就錘我」、「吳秀波之談戀愛么,能坐牢的那種」……
除了使用 Redis 緩存避免直接訪問數(shù)據(jù)庫以外,還會加更多的cache 層,比如采用 Memcachced 作為熱點數(shù)據(jù)的本地緩存:
先去
Memcachced中查詢數(shù)據(jù),命中直接返回。Memcachced未命中,則再從 Redis 查詢,命中則返回數(shù)據(jù),并在Memcachced保存這個數(shù)據(jù)。Redis 未命中,則去
MySQL中查詢,并依次設(shè)置到 Redis 和Memcachced中。
訪問本地內(nèi)存的的性能必然比通過網(wǎng)絡(luò)訪問 Redis 快,所以這種模式可以極大地減少獲取數(shù)據(jù)的延遲,并且可以減少 Redis 的負載,提高性能。
訪問 Redis 獲取數(shù)據(jù),服務(wù)器響應(yīng)。

使用客戶端緩存,應(yīng)用程序?qū)@取的熱門的數(shù)據(jù)存儲在應(yīng)用程序中,無需再次通過網(wǎng)絡(luò)訪問 Redis。 
我們不應(yīng)該緩存不斷變化的鍵。 我們不該緩存很少請求的鍵。 我們希望緩存經(jīng)常請求并以合理速率更改的鍵。對于沒有穩(wěn)定變化速度的例子,比如不斷被 INCR修改的全局計數(shù)器,就不應(yīng)該緩存。
客戶端緩存實現(xiàn)原理
tracking??蛻舳司彺娴拿钍?CLIENT TRACKING ON|OFF [REDIRECT client-id] [PREFIX prefix] [BCAST] [OPTIN] [OPTOUT] [NOLOOP]
Tracking 功能提供了兩種模式解決這個問題,分別是使用RESP3 協(xié)議版本的普通模式和廣播模式,以及使用 RESP2 協(xié)議版本的轉(zhuǎn)發(fā)模式。
普通模式
tracking開啟時, Redis會「記住」每個客戶端請求的 key,當 key的值發(fā)現(xiàn)變化時會發(fā)送失效信息給客戶端 (invalidation message)。RESP3協(xié)議發(fā)送給請求的客戶端,或者轉(zhuǎn)發(fā)給一個不同的連接 (支持 RESP2 + Pub/Sub) 的客戶端。Server 端將 Client 訪問的 key以及該 key 對應(yīng)的客戶端 ID 列表信息存儲在全局唯一的表(TrackingTable),當表滿了,回移除最老的記錄,同時觸發(fā)該記錄已過期的通知給客戶端。 每個 Redis 客戶端又有一個唯一的數(shù)字 ID,TrackingTable 存儲著每一個 Client ID,當連接斷開后,清除該 ID 對應(yīng)的記錄。 TrackingTable 表中記錄的 Key 信息不考慮是哪個 database 的,雖然訪問的是 db1 的 key,db2 同名 key 修改時會客戶端收到過期提示,但這樣做會減少系統(tǒng)的復(fù)雜性,以及表的存儲數(shù)據(jù)量。
TrackingTable存儲普通模式的客戶端數(shù)據(jù),它的數(shù)據(jù)類型是基數(shù)樹 ( radix tree)。
CLIENT TRACKING ON|OFF
+OK
GET user:211
$3
廣播模式(BCAST)
client tracking on bcast prefix user

PrefixTable 存儲廣播模式下的客戶端數(shù)據(jù),它存儲**前綴字符串指針和(需要通知的 key 和客戶端 ID)**的映射關(guān)系。轉(zhuǎn)發(fā)模式
_redis_:invalidate。
//客戶端B執(zhí)行,客戶端 B 的 ID 號是 606
SUBSCRIBE _redis_:invalidate
//客戶端 A 執(zhí)行
CLIENT TRACKING ON BCAST REDIRECT 606
_redis_:invalidate 頻道獲取失效消息了。有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)
歡迎大家關(guān)注Java之道公眾號
好文章,我在看??
