进击云原生

V1

2022/01/28阅读:65主题:默认主题

使用这个库,让你的服务操作 Redis 速度飞起

使用这个库,让你的服务操作 Redis 速度飞起

Redis6 服务器辅助的客户端缓存与 Golang

大多数人使用 Redis 作为远程缓存存储,因为它速度快。Redis6 通过消除不必要的网络往返,可以使其更快。

服务器辅助的客户端缓存

这个方法很简单。Redis6 会记录客户端请求的键值,并在键值发生变化时通知客户端。

因此,客户端现在可以重用响应,而不需要通过网络查询 Redis,直到收到相应的无效通知。这个新特性称为服务器辅助的客户端缓存。

具体可参考: redis 官方文档

尽管这项技术很简单,但它需要升级到新的 RESP3 协议,或者在 RESP2 Pub/Sub 通道上做个小技巧来接收通知。对于现有的客户端库来说,实现这两个选项都不容易。

自 2020 年发布 Redis 6 以来,已经是近两年前的事情了。现有的 Golang 客户端库中仍然很难使用这个强大的新功能。因此,有了下面这个新的客户端实现。

Rueidis

一个快速 Golang Redis RESP3 客户端,实现自动流水线,支持客户端缓存。

多亏了 RESP3 的简单性和自动流水线技术。新的客户端库通常比现有的客户端库有更高的吞吐量。下面是我的 Macbook M1 Pro 的基准对比。

更多请查看 完整基准测试源代码

如果缓存命中,服务器辅助的客户端缓存可以执行得非常好,因为没有网络交换。它只需要大约165ns平均检索记录从客户端内存缓存。

即使没有客户端缓存,在本地基准测试上也可以实现14x的吞吐量。请参见parallelism(64)-key(16)-value(64)-10的情况。

示例

go get github.com/rueian/rueidis

下面是一个如何在新的客户端库中使用服务器辅助的客户端缓存的例子:

package main

import (
 "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 myhash
 resp := client.DoCache(ctx, cmd.Hgetall().Key("myhash").Cache(), time.Minute)
 fmt.Println(resp.IsCacheHit()) // false
 fmt.Println(resp.AsStrMap())   // map[f:v]
 // cache hit on client side
 resp = client.DoCache(ctx, cmd.Hgetall().Key("myhash").Cache(), time.Minute)
 fmt.Println(resp.IsCacheHit()) // true
 fmt.Println(resp.AsStrMap())   // map[f:v]
}

DoCache()方法在底层使用服务器辅助的客户端缓存,它有 3 个参数:

  1. 支持 OpenTelemetry 跟踪的上下文。

  2. Redis 命令,应该从命令生成器client.B()构建。

  3. 客户端 TTL 与 PTTL 结合使用,以确保客户端 TTL 不长于 Redis 端。

此外,可以使用IsCacheHit()检查响应是否来自客户端内存。

如果 OpenTelemetry 集成被启用,还可以通过两个指标:rueidis_do_cache_hitsrueidis_do_cache_miss来观察缓存命中率。

Rueidis 还支持其他功能,如 Redis 集群,Pub/Sub, Streams, Lua, Transaction。

还支持流行的 Redis 模块。例如: RedisBloom, RedisJSON, RediSearch, RedisTimeseries。

翻译

Redis 6 server-assisted client-side caching with Golang

原文

本文同步发于微信公众号【我的小碗汤】,扫码关注,了解更多咨询,更有免费资源供您学习

扫码关注,加群学习
扫码关注,加群学习

分类:

后端

标签:

后端

作者介绍

进击云原生
V1

公众号:进击云原生