点击上方蓝字关注 👆👆
没领红包封面的可以在文末领取
大多数人使用 Redis 作为远程缓存存储,因为它速度快。Redis6 通过消除不必要的网络往返,可以使其更快。
服务器辅助的客户端缓存
这个方法很简单。Redis6 会记录客户端请求的键值,并在键值发生变化时通知客户端。
因此,客户端现在可以重用响应,而不需要通过网络查询 Redis,直到收到相应的无效通知。这个新特性称为服务器辅助的客户端缓存。
具体可参考: redis 官方文档[1]
尽管这项技术很简单,但它需要升级到新的 RESP3 协议,或者在 RESP2 Pub/Sub 通道上做个小技巧来接收通知。对于现有的客户端库来说,实现这两个选项都不容易。
自 2020 年发布 Redis 6 以来,这已经是近两年前的事情了。现有的 Golang 客户端库中仍然很难使用这个强大的新功能。因此,有了下面这个新的客户端实现。
Rueidis[2]
一个快速 Golang Redis RESP3 客户端,实现自动流水线,支持客户端缓存。
多亏了 RESP3 的简单性和自动流水线技术。新的客户端库通常比现有的客户端库有更高的吞吐量。下面是我的 Macbook M1 Pro 的基准对比。
更多请查看 完整基准测试源代码[3]
如果缓存命中,服务器辅助的客户端缓存可以执行得非常好,因为没有网络交换。它只需要大约165ns平均检索记录从客户端内存缓存。
即使没有客户端缓存,在本地基准测试上也可以实现14x的吞吐量。请参见parallelism(64)-key(16)-value(64)-10
的情况。
示例
go get github.com/rueian/rueidis
下面是一个如何在新的客户端库中使用服务器辅助的客户端缓存的例子:
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()
方法在底层使用服务器辅助的客户端缓存,它有 3 个参数:
支持 OpenTelemetry 跟踪的上下文。
Redis 命令,应该从命令生成器
client.B()
构建。客户端 TTL 与 PTTL 结合使用,以确保客户端 TTL 不长于 Redis 端。
此外,可以使用IsCacheHit()
检查响应是否来自客户端内存。
如果 OpenTelemetry 集成被启用,还可以通过两个指标:rueidis_do_cache_hits
和rueidis_do_cache_miss
来观察缓存命中率。
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]完整基准测试源代码: https://github.com/rueian/rueidis-benchmark
点个在看集群永保稳定👇