Redis数据类型篇001_数据类型梳理与选择指南

Redis是一个数据结构服务器(data structure server),其核心是提供一系列原生数据类型来帮助你解决各种各样的问题,如缓存、队列、事件处理。

本文第一章节将简要介绍每种数据类型,并提供详细教程和命令参考的链接;第二章节简单将这些数据类型分成专业化类型和通用类型两种;第三章节简单介绍了通用数据类型的特性,以帮助我们选择合适的数据类型。最后章节则讲解了如何选择我们要使用的数据类型。

参考官方文档:Data-TypesCompare-Data-Types

文章目录

  • [1. 梳理Redis数据类型](#1. 梳理Redis数据类型)
  • [2. 专业化/通用性](#2. 专业化/通用性)
  • [3. 盘点通用数据类型的特性](#3. 盘点通用数据类型的特性)
    • [3.1. Strings 字符串](#3.1. Strings 字符串)
    • [3.2. Hashes 哈希](#3.2. Hashes 哈希)
    • [3.3. JSON](#3.3. JSON)
    • [3.4. Lists 列表](#3.4. Lists 列表)
    • [3.5. Sets 集合](#3.5. Sets 集合)
    • [3.6. Sorted sets 有序集合](#3.6. Sorted sets 有序集合)
    • [3.7. Stream 流](#3.7. Stream 流)
  • [4. 选择数据类型](#4. 选择数据类型)
    • [4.1. Documents 文档](#4.1. Documents 文档)
    • [4.2. Collections 集合](#4.2. Collections 集合)
    • [4.3. Sequences 序列](#4.3. Sequences 序列)

1. 梳理Redis数据类型

Redis Open Source实现以下的数据类型:

2. 专业化/通用性

Redis提供的数据类型中,一部分是用于特定目的高度专业化的:

  • Geospatial 地理空间:存储带有相关坐标的字符串,用于地理空间查询。

  • Vector sets 向量集:存储字符串及其关联的向量数据(以及可选的元数据),用于向量相似性查询。

  • Probabilistic data types 概率数据类型:为大型数据集提供近似技术和其他统计数据。

    包含HyperLogLog、Bloom filter、Cuckoo filter、t-digest、Top-K、Count-min sketch

  • Time series 时间序列:存储实值数据点及其收集时间。

一部分则更加通用:

  • Strings 字符串:存储文本或二进制数据。
  • Hashes 哈希:将键值对集合存储在单个键内。
  • JSON:存储结构化的层级数组和K-V键值对对象,与流行的JSON文本文件格式相匹配。
  • Lists 列表:存储一组有序的简单字符串。
  • Sets 集合:存储一组无序且唯一的字符串。
  • Sorted sets 有序集合:存储一组唯一的字符串以及其对应的分数。
  • Streams 流:存储一系列条目,每个条目包含一组字段-值对。

通用数据类型在功能上有部分重叠,你甚至可以只使用字符串类型加一点小创意,就能模拟他们。但是,每种数据类型在性能、内存占用和功能上存在不同的权衡。

专业化数据类型都有其特定的使用场景,一个专业场景下基本上就只能使用对应的专业化数据类型。

而通用数据类型则更加灵活,一个场景下可能使用数据类型A、B、C、D都能实现。因此在一个业务场景下,选择使用哪种通用数据类型反而是更需要思考的。

3. 盘点通用数据类型的特性

在学习如何选择数据类型前,我们需要先简单介绍一下这些通用数据类型的特性。

3.1. Strings 字符串

  • **结构:**非结构化文本/二进制数据、简单计数器、位集、整数集合。
  • **操作:**get, set, append, increment, decrement, bitwise operations.
  • **适用场景:**非结构化文档、计数器、标志、位图。

字符串主要用于存储文本或二进制数据块,其内部结构将由你的应用程序管理。不过,它们也支持访问字符串中位区间的槽作,以作为比特集、整数或浮点数使用。

3.2. Hashes 哈希

  • **结构:**键值对集合
  • **操作:**get, set, delete, increment, decrement, query.
  • **适用场景:**字段数较少的简单对象。

哈希主要用于存储字段数量较少的对象(非嵌套、不复杂)。不过,实际上哈希中的字段数量并没有真正的限制,所以你可以在应用程序中意多种不同的方式来使用哈希。

哈希的字段值是字符串类型,但Redis提供了将他们作为整数/浮点数处理的命令,并且提供了简单的算术运算操作。

你可以为单个哈希字段设置过期时间,也可以用Redis查询引擎来索引和查询哈希文档。

3.3. JSON

  • 结构: 层级数组和与流行的JSON文本文件格式匹配的键值对像。
  • **操作:**get, set, update, delete, query.
  • **适用场景:**具有多个字段的复杂嵌套对象。

JSON提供了丰富的数据建模功能,包含嵌套字段和数组。你可以使用简单的路径语法访问JSON数据中任意子集的数据。JSON也提供了比哈希更强大、更灵活的查询引擎特性。

3.4. Lists 列表

  • **结构:**简单的字符串序列
  • **操作:**push, pop, get, set, trim.
  • 适用场景: 队列、栈、日志、其他的线性数据结构。

3.5. Sets 集合

  • **结构:**无序的唯一字符串集合
  • **操作:**add, remove, test membership, intersect, union, difference.
  • **适用场景:**无关联数据的唯一元素集

集合存储唯一字符串的集合。提供高效的元素检查、添加、移除操作,还支持集合运算,如并集、交集和差分。

3.6. Sorted sets 有序集合

  • 结构: 唯一字符串及其对应分数的集合。
  • **操作:**add, remove, test membership, range by score or rank.
  • **适用场景:**带有分数的唯一元素、有序的集合。

有序结合存储唯一字符串及其对应的分数。针对基于分数的范围查询进行了优化,因此对实现优先队列和其他的有序集合非常有用。

3.7. Stream 流

  • 结构: 一系列条目,每个条目包含字段-值对。
  • **操作:**add, read, trim.
  • **适用场景:**日志数据、时间序列以及其他仅追加结构。

流存储一系列条目,每个条目包含一组字段值对。针对追加新条目和顺序读取做了优化,因此在实现日志数据、时间序列和其他仅追加数据结构时非常有用。还内置支持了消费者组来管理多个读取者,确保至少一次送达。

4. 选择数据类型

本章节将探讨每种数据类型在特定任务中的优缺点。

需要注意的是,这些建议都是"经验法则",而非严格的定论。因为偏好某些数据类型可能存在许多微妙的理由。

4.1. Documents 文档

通常使用字符串、哈希或者JSON类型来存储文档数据。

JSON通常对内存和处理的要求更高,其次是哈希,最后是字符串。

建议参考下面的决策树作为你选择最合适数据类型的指南:
Yes
No
Yes
No
Yes
No
Yes
No
Yes
No
需要嵌套数据结构(字段、数组),或者需要使用Redis查询引擎进行地理空间索引/查询?
JSON
需要使用Redis查询引擎进行索引和查询,且可以没有嵌套数据结构和地理空间索引?
Hashes 哈希
需要在文档的单个数据项上设置过期时间?
Hashes 哈希
需要频繁访问文档中的单个数据字段,但这些字段只是简单的整型或比特,可以通过整数索引轻松引用?
Strings 字符串
需要频繁访问文档中,包含字符串或二进制数据值的各个数据字段?
Hashes 哈希
Strings 字符串

4.2. Collections 集合

通常使用集合或有序集合来存储集合数据,对于非常简单的集合,甚至可以使用字符串。

他们都可以进行基本的元素测试,但有着不同的额外功能和权衡。有序集合的内存开销和处理需求最高;其次是集合;最后是字符串。

注意:如果你需要存储集合或有序集合中键的额外属性,可以使用辅助哈希或JSON对象,其中的字段名与集合中的键匹配。

建议参考下面的决策树作为你选择最合适数据类型的指南:
Yes
No
Yes
No
Yes
No
需要以任意顺序或字典顺序存储和检索键?
Sorted sets 有序集合
需要为每个键存储额外的信息,且不需要集合操作(交集、并集、差分)?
Hashes 哈希
键是否都是已知范围内的简单整数索引?
Strings 字符串(Bitmap 位图)
Sets 集合

4.3. Sequences 序列

通常使用有序结合、列表、流来存储字符串或二进制数据序列。它们在特定用途上各有优缺点。

建议参考下面的决策树作为你选择最合适数据类型的指南:
Yes
No
Yes
No
需要维护任意优先级顺序/字典顺序,需要频繁通过索引访问元素或者执行集合操作?
Sorted sets 有序集合
主要是按照时间戳顺序存储和检索元素,或者管理多个消费者从序列中读取?
Stream 流
Lists 列表

相关推荐
Antoine-zxt15 小时前
MySQL CPU飙升至500%的深度排查与优化实践
数据库·mysql
Awkwardx15 小时前
MySQL数据库—MySQL基本查询
数据库·mysql
夜流冰15 小时前
Excel - MS Support for Excel: 2 Collaborate
数据库·windows·excel
轻微的风格艾丝凡15 小时前
嵌入式定时器计时技巧:用有符号数省略溢出判断的底层逻辑与实践
数据库·算法·dsp开发·嵌入式软件
Lonely丶墨轩16 小时前
从登录入口窥见架构:一个企业级双Token认证系统的深度拆解
java·数据库·sql
收获不止数据库16 小时前
黄仁勋2026CES演讲复盘:旧世界,裂开了!
大数据·数据库·人工智能·职场和发展
汽车仪器仪表相关领域16 小时前
工况模拟精准检测,合规减排赋能行业 ——NHASM-1 型稳态工况法汽车排气检测系统项目实战经验分享
数据库·算法·单元测试·汽车·压力测试·可用性测试
2301_8002561116 小时前
数据库设计中的 “数据依赖→设计异常→关系分解(范式)” 核心逻辑
数据库·postgresql
冰冰菜的扣jio16 小时前
Redis基础数据结构
数据结构·数据库·redis