使用这个库,让你的服务操作 Redis 速度飞起
點(diǎn)擊上方藍(lán)字關(guān)注?👆👆
沒(méi)領(lǐng)紅包封面的可以在文末領(lǐng)取
大多數(shù)人使用 Redis 作為遠(yuǎn)程緩存存儲(chǔ),因?yàn)樗俣瓤臁edis6 通過(guò)消除不必要的網(wǎng)絡(luò)往返,可以使其更快。
服務(wù)器輔助的客戶端緩存
這個(gè)方法很簡(jiǎn)單。Redis6 會(huì)記錄客戶端請(qǐng)求的鍵值,并在鍵值發(fā)生變化時(shí)通知客戶端。
因此,客戶端現(xiàn)在可以重用響應(yīng),而不需要通過(guò)網(wǎng)絡(luò)查詢 Redis,直到收到相應(yīng)的無(wú)效通知。這個(gè)新特性稱為服務(wù)器輔助的客戶端緩存。
具體可參考: redis 官方文檔[1]
盡管這項(xiàng)技術(shù)很簡(jiǎn)單,但它需要升級(jí)到新的 RESP3 協(xié)議,或者在 RESP2 Pub/Sub 通道上做個(gè)小技巧來(lái)接收通知。對(duì)于現(xiàn)有的客戶端庫(kù)來(lái)說(shuō),實(shí)現(xiàn)這兩個(gè)選項(xiàng)都不容易。
自 2020 年發(fā)布 Redis 6 以來(lái),這已經(jīng)是近兩年前的事情了?,F(xiàn)有的 Golang 客戶端庫(kù)中仍然很難使用這個(gè)強(qiáng)大的新功能。因此,有了下面這個(gè)新的客戶端實(shí)現(xiàn)。
Rueidis[2]
一個(gè)快速 Golang Redis RESP3 客戶端,實(shí)現(xiàn)自動(dòng)流水線,支持客戶端緩存。
多虧了 RESP3 的簡(jiǎn)單性和自動(dòng)流水線技術(shù)。新的客戶端庫(kù)通常比現(xiàn)有的客戶端庫(kù)有更高的吞吐量。下面是我的 Macbook M1 Pro 的基準(zhǔn)對(duì)比。
更多請(qǐng)查看 完整基準(zhǔn)測(cè)試源代碼[3]
如果緩存命中,服務(wù)器輔助的客戶端緩存可以執(zhí)行得非常好,因?yàn)闆](méi)有網(wǎng)絡(luò)交換。它只需要大約165ns平均檢索記錄從客戶端內(nèi)存緩存。
即使沒(méi)有客戶端緩存,在本地基準(zhǔn)測(cè)試上也可以實(shí)現(xiàn)14x的吞吐量。請(qǐng)參見(jiàn)parallelism(64)-key(16)-value(64)-10的情況。
示例
go?get?github.com/rueian/rueidis下面是一個(gè)如何在新的客戶端庫(kù)中使用服務(wù)器輔助的客戶端緩存的例子:
package?mainimport?("context""fmt""time""github.com/rueian/rueidis" )func?main()?{client,?err?:=?rueidis.NewClient(rueidis.ClientOption{InitAddress:?[]string{"127.0.0.1:6379"}})if?err?!=?nil?{panic(err)}defer?client.Close()cmd?:=?client.B()ctx?:=?context.Background()//?HSET?myhash?f?v_?=?client.Do(ctx,?cmd.Hset().Key("myhash").FieldValue().FieldValue("f",?"v").Build()).Error()//?HGETALL?myhashresp?:=?client.DoCache(ctx,?cmd.Hgetall().Key("myhash").Cache(),?time.Minute)fmt.Println(resp.IsCacheHit())?//?falsefmt.Println(resp.AsStrMap())???//?map[f:v]//?cache?hit?on?client?sideresp?=?client.DoCache(ctx,?cmd.Hgetall().Key("myhash").Cache(),?time.Minute)fmt.Println(resp.IsCacheHit())?//?truefmt.Println(resp.AsStrMap())???//?map[f:v] }DoCache()方法在底層使用服務(wù)器輔助的客戶端緩存,它有 3 個(gè)參數(shù):
支持 OpenTelemetry 跟蹤的上下文。
Redis 命令,應(yīng)該從命令生成器client.B()構(gòu)建。
客戶端 TTL 與 PTTL 結(jié)合使用,以確??蛻舳?TTL 不長(zhǎng)于 Redis 端。
此外,可以使用IsCacheHit()檢查響應(yīng)是否來(lái)自客戶端內(nèi)存。
如果 OpenTelemetry 集成被啟用,還可以通過(guò)兩個(gè)指標(biāo):rueidis_do_cache_hits和rueidis_do_cache_miss來(lái)觀察緩存命中率。
Rueidis 還支持其他功能,如 Redis 集群,Pub/Sub, Streams, Lua, Transaction。
還支持流行的 Redis 模塊。例如: RedisBloom, RedisJSON, RediSearch, RedisTimeseries。
參考資料
[1]
redis 官方文檔: https://redis.io/topics/client-side-caching
[2]Rueidis: https://github.com/rueian/rueidis
[3]完整基準(zhǔn)測(cè)試源代碼: https://github.com/rueian/rueidis-benchmark
點(diǎn)個(gè)在看集群永保穩(wěn)定👇
總結(jié)
以上是生活随笔為你收集整理的使用这个库,让你的服务操作 Redis 速度飞起的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 微软开发者的年度回顾
- 下一篇: jenkins构建触发器定时任务