系统极客一直在努力
专注操作系统及软件使用技能

Valkey 9.1 发布:安全、性能、可观测性全面升级

Valkey

Valkey 9.1 正式发布!本次更新在安全性、可观测性、性能、效率以及工具链等方面,都带来了多项改进。

Valkey 9.1 主要更新

安全性

  • 数据库级 ACL:此前 Valkey 的访问控制列表(ACL)可以限定用户能执行哪些命令、访问哪些键,但这个权限是全局的——授权一次,所有数据库通用。9.1 版本把粒度细化到了单个数据库。多租户场景下,隔离性直接上了一个台阶。

1比如创建一个用户,只允许它访问 0 号和 1 号数据库:

> ACL SETUSER app-user on >secretpass +@all ~* db=0,1

2该用户通过身份验证后,可以与 0 号数据库交互:

> SELECT 0
OK
> SET mykey "hello"
OK

3但无法访问 2 号数据库:

> SELECT 2
(error) NOPERM No permissions to access database
  • Lua 脚本引擎已移至独立模块:Lua 不再和核心服务器耦合。如果你不需要 Lua 脚本,完全可以不用加载,攻击面也随之缩小。INFO命令新增了Scripting Engines字段,用于显示当前加载了哪些脚本引擎。
  • TLS 改进INFO命令现在能显示 TLS 证书的过期日期,不用再等到连接失败,才发现证书已经吊销;证书轮换支持后台自动重载,不需要重启服务;新增了对 SAN URI 的 TLS 身份验证支持,接入 mTLS 更加方便。

可观测性

  • 主线程与 I/O 线程使用率:单靠 CPU 使用率来判断 Valkey 的负载,其实并不太准。主线程和 I/O 线程在繁忙循环里等待工作时,即便实际很闲,CPU 指标也可能飙到接近 100%。Valkey 9.1 新增了针对这 2 类线程的累计使用率指标,既能反映真实负载,调优时也有了靠谱的依据。
  • JSON 格式日志:可以在valkey.conf里添加一行log-format json配置直接开启,日志就能直接被观测工具解析,无需再写自定义解析规则。
log-format json
  • 以前是纯文本格式:
14082:M 14 May 2026 14:12:43.508 * oO0OoO0OoO0Oo Valkey is starting oO0OoO0OoO0Oo
14082:M 14 May 2026 14:12:43.510 * Valkey version=255.255.255, bits=64, commit=6c329dfe, modified=0, pid=14082, just started
14082:M 14 May 2026 14:12:43.512 * Configuration loaded
14082:M 14 May 2026 14:12:43.515 * Increased maximum number of open files to 10032 (it was originally set to 2560).
14082:M 14 May 2026 14:12:43.517 * monotonic clock: ARM CNTVCT @ 24 ticks/us
14082:M 14 May 2026 14:12:43.519 # Failed to write PID file: Permission denied
14082:M 14 May 2026 14:12:43.521 * Running mode=standalone, port=6379.
14082:M 14 May 2026 14:12:43.522 # WARNING: The TCP backlog setting of 511 cannot be enforced because kern.ipc.somaxconn is set to the lower value of 128.
14082:M 14 May 2026 14:12:43.555 * Module 'lua' loaded from libvalkeylua.so
14082:M 14 May 2026 14:12:43.556 * Server initialized
14082:M 14 May 2026 14:12:43.557 * Ready to accept connections tcp
  • 现在每条日志都是一个独立的 JSON 对象:
{"pid":14500,"role":"primary","timestamp":"14 May 2026 14:13:02.921","level":"notice","message":"oO0OoO0OoO0Oo Valkey is starting oO0OoO0OoO0Oo"}
{"pid":14500,"role":"primary","timestamp":"14 May 2026 14:13:02.922","level":"notice","message":"Valkey version=255.255.255, bits=64, commit=6c329dfe, modified=0, pid=14500, just started"}
{"pid":14500,"role":"primary","timestamp":"14 May 2026 14:13:02.923","level":"notice","message":"Configuration loaded"}
{"pid":14500,"role":"primary","timestamp":"14 May 2026 14:13:02.924","level":"notice","message":"Increased maximum number of open files to 10032 (it was originally set to 2560)."}
{"pid":14500,"role":"primary","timestamp":"14 May 2026 14:13:02.925","level":"notice","message":"monotonic clock: ARM CNTVCT @ 24 ticks/us"}
{"pid":14500,"role":"primary","timestamp":"14 May 2026 14:13:02.925","level":"warning","message":"Failed to write PID file: Permission denied"}
{"pid":14500,"role":"primary","timestamp":"14 May 2026 14:13:02.926","level":"notice","message":"Running mode=standalone, port=6379."}
{"pid":14500,"role":"primary","timestamp":"14 May 2026 14:13:02.927","level":"warning","message":"WARNING: The TCP backlog setting of 511 cannot be enforced because kern.ipc.somaxconn is set to the lower value of 128."}
{"pid":14500,"role":"primary","timestamp":"14 May 2026 14:13:02.928","level":"notice","message":"Module 'lua' loaded from libvalkeylua.so"}
{"pid":14500,"role":"primary","timestamp":"14 May 2026 14:13:02.929","level":"notice","message":"Server initialized"}
{"pid":14500,"role":"primary","timestamp":"14 May 2026 14:13:02.930","level":"notice","message":"Ready to accept connections tcp"}

性能

  • I/O 线程模型重写:线程间的通信模型做了重新设计,多种工作负载下,吞吐量最高提升了 17%。
  • Stream 范围查询提速XRANGEXREVRANGE的热路径进行了优化,速度最高提升 30%。
  • 字符串 GET 吞吐量提升:提高了字符串嵌入大小的阈值,GET 命令吞吐量最高提升 30%。
  • 有序集合查询加速:跳表查询处理改进后,ZRANGEBYSCOREZRANGEBYLEX等命令跑得更快了。
  • COMMAND 响应缓存COMMAND命令的返回结果现在会被缓存。在初始化时调用该命令的客户端,连接建立时间会缩短。
  • 默认启用硬件时钟:减少了时间相关系统调用的开销,GET 和 SET 整体性能提升约 3%。

在 512 字节负载、9 个 I/O 线程、10 路命令流水线配置下,Valkey 9.1 的单机吞吐量达到了每秒 210 万次请求。完整结果可以到 Valkey 性能仪表板上对比查看。

效率

  • 小字符串更省内存:内部指针优化后,128 字节以下的字符串内存占用最高可减少 20%。
  • 有序集合内存优化:跳表结构调整后,有序集合内存占用最高减少了 10%。
  • Rehashing 延迟降低:优化键空间增长触发的哈希表重哈希操作,对请求延迟的影响更小。
  • 批量删除不再触发多余的 rehash:在SREMZREMHDEL等批量删除操作时,哈希表的大小调整会暂停,避免不必要的重哈希。
  • 副本创建更加高效:启用 AOF 的副本现在会直接复用接收到的 RDB 文件,作为初始 AOF 基础文件,不再重新生成快照。

新命令

HGETDEL

HGETDEL可以原子性地获取并删除哈希中的一个或多个字段。典型场景是队列消费——一次调用完成取值和清除,不需要在HGET之后再套一层HDEL事务。

例如:statuspayload字段在一次调用中被原子性地取出并移除,只留下retries字段。

> HSET job:42 status "pending" payload '{"action":"send_email"}' retries "3"
(integer) 3
> HGETDEL job:42 FIELDS 2 status payload
1) "pending"
2) "{\"action\":\"send_email\"}"
> HGETALL job:42
1) "retries"
2) "3"

MSETEX

MSETEX允许在单条命令中设置多个键,并共享同一个过期时间。以前要实现同样的效果,要么多次调用SETEX,要么用流水线把SETEXPIRE打包发送。MSETEX把这个常见模式简化成了一条命令。

让我们看两个例子:

  • 设置 3 个会话键,都在 3600 秒后过期:
> MSETEX 3 session:abc "user:1" session:def "user:2" session:ghi "user:3" EX 3600
OK
> TTL session:abc
(integer) 3600
> GET session:def
"user:2"
  • 使用NX选项,只设置尚不存在的键:
> MSETEX 2 session:abc "user:99" session:xyz "user:4" NX EX 3600
OK
> GET session:abc
"user:1"
> GET session:xyz
"user:4"

CLUSTERSCAN

CLUSTERSCAN支持跨节点的集群范围键扫描。以前要扫描整个集群的键,需要客户端自己挨个节点跑SCAN再合并结果,现在一条命令就能迭代整个集群。

以下是一些实际例子:

  • 迭代集群中的所有键:
> CLUSTERSCAN 0
1) "3"
2) 1) "user:1001"
   2) "user:1002"
   3) "session:abc"
  • 使用返回的游标继续扫描,直到游标返回 0:
> CLUSTERSCAN 3
1) "7"
2) 1) "cache:page1"
   2) "order:5001"
  • 按模式过滤,查找集群中所有会话键:
> CLUSTERSCAN 0 MATCH "session:*"
1) "12"
2) 1) "session:abc"
   2) "session:def"

  • 按键类型过滤
> CLUSTERSCAN 0 TYPE hash
1) "5"
2) 1) "user:profile:1001"
   2) "job:42"

  • 扫描特定 slot 中的键:
> CLUSTERSCAN 0 SLOT 7638
1) "0"
2) 1) "user:1001"

工具链

  • CLI 支持原子槽迁移valkey-cli在执行--cluster rebalance--cluster reshard时,可以通过--cluster-use-atomic-slot-migration参数启用原子槽迁移。
  • valkey-benchmark 改进:输出中新增了 RPS 分布信息,并加入了--warmup--duration参数,准测试时的时间和预热阶段控制更加精确。
赞(0)
分享到

评论 抢沙发