前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用这个库,让你的服务操作 Redis 速度飞起

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

作者头像
我的小碗汤
发布2023-03-19 15:59:01
4480
发布2023-03-19 15:59:01
举报
文章被收录于专栏:我的小碗汤我的小碗汤

大多数人使用 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的情况。

示例

代码语言:javascript
复制
go get github.com/rueian/rueidis

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

代码语言:javascript
复制
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。

参考资料

[1]

redis 官方文档: https://redis.io/topics/client-side-caching

[2]

Rueidis: https://github.com/rueian/rueidis

[3]

完整基准测试源代码: https://github.com/rueian/rueidis-benchmark

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-01-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 进击云原生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 服务器辅助的客户端缓存
  • Rueidis[2]
  • 示例
    • 参考资料
    相关产品与服务
    云数据库 Redis
    腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档