Redis8.8新特性

158 阅读4分钟

前言

Redis8.8新增了一些特性,可以学习参考

Redis8.8新特性

Redis官网

可以查阅Redis官网

https://redis.io/docs/latest/develop/whats-new/8-8/
Redis8.8安装

为了方便,采用docker镜像安装部署,以下是安装命令

配置redis.conf

1、在路径/opt/redis/conf/下,新增一个redis.conf

image.png 内容为

# ===== 网络 =====
bind 0.0.0.0
port 6379
protected-mode yes

# ===== 安全 =====
requirepass YourStrongP@ssw0rd!

# ===== 持久化 =====
# RDB 快照策略
save 900 1
save 300 10
save 60 10000
dir /data

# AOF 持久化
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec

# ===== 内存管理 =====
maxmemory 2gb
maxmemory-policy allkeys-lru

# ===== Redis 8.8 新特性相关 =====
# 开启 Hash 字段级通知(需包含 K 和 h,且开启细分事件)
notify-keyspace-events "KEA"

# ===== 日志 =====
loglevel notice
logfile ""

# ===== 其他 =====
tcp-backlog 511
timeout 300
tcp-keepalive 300

**备注:**Redis上面有密码

docker安装

执行下面docker指令

docker run -d   --name redis-8.8.1   --restart unless-stopped   -p 6379:6379   -v /opt/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf:ro   -v /opt/redis/data:/data   redis:8.8.1   redis-server /usr/local/etc/redis/redis.conf

redis镜像尽量用最新,别用8.8.0版本,安装成功之后,会有以下结果

image.png

进入到容器里面执行指令
进入容器
docker exec -it 容器id /bin/bash

进入到容器里面

进入redis客户端

执行

cd /usr/local/bin
启动客户端
redis-cli

image.png

Redis8.8新特性
ARSET

Redis 8.8 引入了原生的 Array 数据结构,支持按 O(1)  时间复杂度进行索引读写,且存储非常紧凑

执行

ARSET myarray2 0 "first" 1 "second"

image.png 执行

ARGET myarray2 0

image.png

ARLEN myarray2

image.png

INCREX

限流是 Redis 的常见场景,但此前通常需要编写复杂的 Lua 脚本-3-6INCREX 是一个新命令,它集成了自增、边界检查和过期时间,能原子性地实现窗口计数器限流-1-4

💡 例子:限制每分钟最多处理100个请求

# 限制接口 /api/login 每分钟最多调用 100 次
# 该命令尝试将计数器增加 1,如果结果超过 100,操作会被拒绝
INCREX rate:api:login EX 60 UBOUND 100
# 返回: (新计数器值, 实际增加的数值)
# 当计数器超过100,该命令会返回错误或特殊响应,以拒绝本次请求

image.png

Hash 变更通知更细
四种频道类型与消息格式

这是字段级通知的核心。与旧版只有 __keyspace@<db>__:<key> 和 __keyevent@<db>__:<event> 两种频道不同,Redis 8.8 新增了四种专用频道,提供了极大的灵活性-2-9

频道格式消息载荷(Payload)内容典型使用场景
__subkeyspace@<db>__:<key>`:`监听特定 Key 的所有字段变化。例如,监听 user:100 这个 Hash 的任何字段被 hsethdel 等操作。
__subkeyevent@<db>__:<event>`<key_len>::`监听特定操作类型。例如,监听所有 Key 上发生的 hset 事件。
__subkeyspaceitem@<db>__:<key>\n<subkey><event>监听特定 Key 的特定字段。例如,只监听 user:100 的 name 字段是否变化。
`subkeyspaceevent@:`<subkey_len>:<subkey>监听特定 Key 的特定事件。例如,只监听 user:100 发生的 hdel 事件。

消息格式说明

  • 消息载荷中,字段名采用 长度前缀编码<len>:<subkey>),以支持二进制安全的字段名-2-8
  • 当操作涉及多个字段时(如 HMSET),载荷中会包含多个 <len>:<subkey>,用逗号分隔-8。 要启用 Redis 8.8 的 Hash 字段级通知,notify-keyspace-events 配置必须同时包含数据类型的标志和频道类型的标志-8

你之前的命令 CONFIG SET notify-keyspace-events STIV 只开启了频道类型(S T I V),但缺少了最重要的数据类型标志 h(代表 Hash 命令)-4-8。这正是收不到消息的根本原因。

🔧 正确的配置方法

你需要执行以下命令来开启配置:

redis-cli config set notify-keyspace-events hSTIV

或者启用所有常用的数据类型和所有子键频道类型:

redis-cli config set notify-keyspace-events AKEhSTIV

注意:这里的 h 标志不是指 "hash 数据结构",而是指会触发这些通知的  "hash 命令" -4-8A 是 g$lshztdxea 的别名,代表几乎所有标准事件类型。

执行

config set notify-keyspace-events AKEhSTIV

执行

PSUBSCRIBE __subkeyspace@0__:user:100

image.png 然后另起一个客户端执行

HSET user:100 aa  98

image.png 这个时候,会看到

image.png

XNACK:流消息的显式拒绝与释放

在 Redis Streams 中,当一个消费者无法处理某条消息时,以前只能让它继续留在待处理列表(PEL)中,直到超时后被其他消费者认领,这会造成延迟-3。新命令 XNACK 允许消费者显式地拒绝(NACK) 一条消息,并立即将其释放,以便其他消费者可以重新处理-1-4

XNACK 支持三种模式,让失败处理更精细-3

  • SILENT:用于内部错误,下次可被其他消费者重试。
  • FAIL:用于资源不足,消息可被其他资源充足的消费者尝试。
  • FATAL:用于消息格式错误,将其标记为“毒药消息”,便于归入死信队列。
XNACK key group <SILENT | FAIL | FATAL> IDS numids id [id ...]

正确的命令格式和示例

你需要先指定一种模式(SILENTFAIL, 或 FATAL),然后加上 IDS 关键字,并指明要操作的消息数量。一个正确的命令如下-1

XNACK mystream mygroup FAIL IDS 1 1526569435-0

这个命令会以 FAIL 模式(意味着当前消费者无法处理该消息)释放 ID 为 1526569435-0 的消息,让它能被组内其他消费者重新处理。

时序查询更省请求:单命令多聚合

Redis 8.8 支持 Time Series 范围查询一次返回多个聚合结果。

更新前

TS.RANGE metrics:a:api - + AGGREGATION min 60000
TS.RANGE metrics:a:api - + AGGREGATION avg 60000
TS.RANGE metrics:a:api - + AGGREGATION max 60000

更新后

TS.RANGE metrics:a:api - + AGGREGATION min,avg,max 60000
JSON.SET FPHA

Redis 8.8 给 JSON.SET 增加了 FPHA,可以显式指定齐次浮点数组的内部类型。

更新前

JSON.SET user:1001 $ '[1.0,2.0,3.0]'

以前只能把数字数组写进去,但没法明确告诉 Redis 这是一组应该按哪种浮点类型存储的数值数组。

更新后

JSON.SET user:1001 $ '[1.0,2.0,3.0]' FPHA FP16
COUNT聚合器

ZUNIONZINTER等集合运算命令新增COUNT聚合器,可以统计元素在输入集合中出现的次数。

ZADD set1 1 "a" 2 "b"
ZADD set2 1 "b" 3 "c"
# 交集,并统计每个元素出现的次数
ZINTER dest key 2 set1 set2 AGGREGATE COUNT
ZRANGE dest 0 -1 WITHSCORES  # 输出: "b" (score为2,表示在2个集合中出现)
搜索与查询增强
  • FT.HYBRID:支持CANDIDATES_PER_SHARD参数,可限制每个分片的候选向量数,减少集群模式下的开销。

  • FT.PROFILE:新增对混合查询(FT.HYBRID)的性能分析支持。

  • FT.AGGREGATE:新增组内排序归约器(COLLECT),可在分组后对文档进行排序。

    混合查询,限制每分片候选数为100

    FT.HYBRID idx "*" "vector_field" KNN 10 "query_vector" CANDIDATES_PER_SHARD 100

    性能分析混合查询

    FT.PROFILE idx HYBRID QUERY "..."

    分组后收集并排序(示例概念)

    FT.AGGREGATE idx "*" GROUPBY 1 @category REDUCE COLLECT 1 @score

总结

Redis8.8也发布了一些实用特性,可以试试