首页 / Redis 入门教程 / JSON 与 Redis 8 新类型(向量集/概率类型)

Redis 入门教程

JSON 与 Redis 8 新类型(向量集/概率类型)

本教程共 40 篇 · 第 15 篇 · 更新于 2026-08-02

redisjsonredisjson向量集bloomcuckoot-digesttop-kRedis 8 新类型

15. JSON 与 Redis 8 新类型(向量集 / 概率类型)

本节目标

  • 理解 Redis 8.x 将 JSON、向量集、概率类型「内置化」的意义
  • 掌握 RedisJSON 基本命令:JSON.SET / JSON.GET / JSON.TYPE
  • 了解向量集(Vector Set)解决「相似度检索 / RAG」的思路
  • 了解概率类型:Bloom Filter、Cuckoo Filter、T-Digest、Top-K、Count-Min Sketch 的用途
  • 明确它们与「经典 5 种数据类型」的能力边界

在 Redis 8.0 之前,JSON、时间序列、各类概率过滤器都是以外部 Module(需单独下载、编译、用 loadmodule 加载)的形式提供。从 Redis 8.0 起(Redis 社区版更名为 Redis Open Source),这些能力被内置集成到发行版——官方发布包(release tarball)在打包时已经把模块的 loadmodule 配置与参数写进了 redis.conf,解压即用,无需再手动安装模块。这意味着你可以直接在 redis-cli 里使用 JSON.*BF.*TDIGEST.* 等一系列命令。

提示(Redis 8.x 新特性):Redis 8.x 内置的数据结构/引擎包括但不限于——JSON、Time Series、Bloom Filter、Cuckoo Filter、Count-Min Sketch、Top-K、T-Digest,以及查询引擎(Query Engine);向量集(Vector Set)在 8.x 中处于 beta 阶段。这些在旧版(7.x 及更早)需要显式安装对应 Module,8.x 起开箱即用。本教程正文统一以 Redis 8.x(最新稳定版)为准。

15-1 RedisJSON:在 Redis 里存「真正的 JSON」

过去用 String 存 JSON,要么整体读改写(浪费),要么自己解析。RedisJSON 让你以「文档」方式存储嵌套 JSON,并用 JSONPath 表达式精确读写其中某个字段。

写入一个 JSON 文档(根路径用 $):

命令:

127.0.0.1:6379> JSON.SET user:1001 $ '{"name":"张三","age":28,"tags":["redis","db"]}'

输出:

OK

读取指定路径(JSONPath 表达式):

命令:

127.0.0.1:6379> JSON.GET user:1001 $.name
127.0.0.1:6379> JSON.TYPE user:1001 $

输出:

"[\"张三\"]"
"object"

JSON.GET 返回的是 JSON 编码结果;JSON.TYPE 返回根节点类型。你还可以 JSON.DEL 删除、JSON.NUMINCRBY 原子自增某个数值字段、JSON.ARRAPPEND 向数组追加元素等。配合 Redis 的查询引擎(Search and Query),还能对 Hash / JSON 建索引,做全文检索、二级索引与聚合。

15-2 向量集 Vector Set(beta)

向量集(Vector Set) 是 Redis 8.x 引入的、用于存储「向量嵌入(embedding)」的类型,专门服务于语义相似度搜索、语义缓存、语义路由与检索增强生成(RAG)。典型流程:把文本/图片通过 embedding 模型转成向量,存入向量集,再查询「与某向量最相似的 k 个」。它常用于 AI 应用(如对话短期/长期记忆、LLM 响应语义缓存)。该能力在 8.x 仍为 beta,生产使用前请核对 redis.io 最新文档中的命令与稳定性说明。

15-3 概率类型:用极小空间换「近似正确」

这类类型都用概率算法,以极小内存换取「足够好」的结果,命令前缀各有约定。

15-3.1 Bloom Filter(BF.)——判断「是否可能存在」

适合「去重判重、黑名单、爬虫已抓集合」。它告诉你「一定不在」或「可能在」(有误判但无误漏)。

命令:

127.0.0.1:6379> BF.ADD banned:ips "1.2.3.4"
127.0.0.1:6379> BF.EXISTS banned:ips "1.2.3.4"
127.0.0.1:6379> BF.EXISTS banned:ips "9.9.9.9"

输出:

(integer) 1
(integer) 1
(integer) 0

BF.MADD / BF.MEXISTS 支持批量操作。

15-3.2 Cuckoo Filter(CF.)——支持删除的判重

与 Bloom 类似,但 Cuckoo Filter 支持删除某个元素(Bloom 一般不支持),适合「优惠券是否已用」「定向广告曝光去重」等需要增删的场景。

命令:

127.0.0.1:6379> CF.ADD visited "page:home"
127.0.0.1:6379> CF.EXISTS visited "page:home"
127.0.0.1:6379> CF.DEL visited "page:home"

输出:

(integer) 1
(integer) 1
(integer) 1

15-3.3 T-Digest(TDIGEST.)——估算分位数

用于「在不保存全部数据点的情况下估算百分位数」,例如 p99 延迟、Top 百分位。非常适合监控、游戏排行、网络流量分析。

命令:

127.0.0.1:6379> TDIGEST.ADD latencies 10 20 30 100 200
127.0.0.1:6379> TDIGEST.QUANTILE latencies 0.99

输出:

(integer) 1
1) "200"

15-3.4 Top-K(TOPK.)——找出最频繁的 k 个

用于「在流式数据里实时找热度最高的 k 个值」,例如热搜词、热门商品。

命令:

127.0.0.1:6379> TOPK.ADD trend "redis" "mysql" "redis" "redis" "pg"
127.0.0.1:6379> TOPK.QUERY trend "redis"

输出:

1) (nil)
2) (nil)
3) (nil)
4) (nil)
5) (nil)
(integer) 1

此外还有 Count-Min Sketch(CMS.),用于估算某个值在数据流中出现的次数(如销量估算)。

15-4 怎么选这些新类型

  • 要存「结构化文档 + 按字段读写 / 检索」→ RedisJSON
  • 要做 AI 语义检索 / RAG / 向量缓存 → 向量集(beta)
  • 要「判重、去重、黑名单」且不要求精确 → Bloom / Cuckoo
  • 要「估算分位数(p95/p99)」→ T-Digest
  • 要「实时找 Top-K 热点」→ Top-K
  • 要「估算出现频次」→ Count-Min Sketch

提示:上述 JSON.*BF.*CF.*TDIGEST.*TOPK.*CMS.* 等命令自 Redis 8.x 起内置可用(向量集命令前缀为 V*,beta 阶段请核对官方文档最新命令名)。旧版 Redis 需先 MODULE LOAD 对应模块。与第 12 章 HyperLogLog 一样,概率类型都用「极小空间换近似」,不适合需要精确成员列表的场景。本教程正文统一以 Redis 8.x(最新稳定版)为准。

15.x 为什么「内置」这件事很重要

在 Redis 8.x 之前,要用上 JSON 或概率类型,你得单独下载对应 Module 源码、编译、用 loadmodule 加载,还要在运维上额外关注这些模块进程的版本与兼容性——相当于在 Redis 之外又养了一套组件。8.x 把它们内置进发行版,带来的直接好处是:部署一条命令(或一份官方 redis.conf)即可获得完整能力,版本与 Redis 核心一起发布、一起测试,运维面和故障面都更小;同时这些类型与核心数据类型共享同一套持久化、复制、ACL 与客户端协议,调用方式一致。

具体到选型,再补充几个典型落地点:RedisJSON 适合「用户资料、商品详情、配置文档」这类需要按字段读写或检索的半结构化数据;向量集适合 AI 应用里的语义缓存(把用户问题向量化后查相似历史回答,直接复用)、以及 RAG 的向量检索;Bloom/Cuckoo 适合「广告去重、爬虫已抓集合、优惠券核销」这类海量判重;T-Digest 适合「服务 p99 延迟、游戏段位分布」这类分位数监控;Top-K 适合「热搜词、爆款商品」实时榜单。它们共同的特点是:用极小的内存或近似计算,解决「精确方案太贵」的问题。

需要强调的是,这些新类型与前面讲的经典类型并非取代关系,而是互补:能精确就用精确(Set/String/Hash),需要省内存、可近似、或要结构化文档/向量检索时,才上对应的新类型。把它们放进同一个 Redis 实例里组合使用,往往能凑出非常简洁又高性能的业务方案。

15-5 常见误区

  • 误区:JSON 类型就是 String 存 JSON。 不完全等价;RedisJSON 支持按 JSONPath 局部读写、原子修改字段,并在建索引后支持检索,能力远超手动解析 String。
  • 误区:概率过滤器「判断存在就一定存在」。 Bloom/Cuckoo 是「有误判可能、无误漏」:说不在则一定不在,说在可能是误判。
  • 误区:8.x 仍需手动装 Module 才能用这些类型。 8.x 发行版已内置并默认配置,开箱即用(自行从源码 git 构建时模块配置在 redis-full.conf)。
  • 误区:向量集已稳定可用于核心生产。 在 8.x 中仍为 beta,上线前请评估稳定性并核对最新文档。

15-6 小结

  • Redis 8.x 把 JSON、向量集、概率类型(Bloom/Cuckoo/T-Digest/Top-K/CMS)内置为开箱即用能力。
  • RedisJSON:JSON.SET / JSON.GET / JSON.TYPE,配合 JSONPath 局部读写与查询引擎检索。
  • 向量集(beta):存向量嵌入,服务语义相似度搜索与 RAG。
  • 概率类型:Bloom/CF 判重去重;T-Digest 分位数;Top-K 热点;CMS 频次估算。
  • 它们的共性是「用极小空间换近似/特定能力」,与经典类型互补。

提示:关于版本——本教程正文统一以 Redis 8.x(最新稳定版)为准;官方 redis.io 下载页另标 8.8 为 “Latest stable”,而 GitHub 上 redis/redis 的最新发布 tag 为 8.10.0,二者同属 8.x,命令与类型差异对教材影响极小。