当前位置: 首页 > news >正文

Redis 数据结构及特点

Redis 是一个基于内存的高性能键值存储系统,支持多种数据结构,每种数据结构在底层实现、性能特点、使用场景上都有差异。本文将详细介绍 Redis 支持的数据结构 及其 特点


1. String(字符串)

简介

  • 最基本的数据类型,二进制安全。
  • 既可以是字符串,也可以是数字(整型/浮点型)。
  • 最大长度:512 MB

常用命令

命令说明
SET key value设置值
GET key获取值
INCR key值加 1(数字)
DECR key值减 1(数字)
APPEND key value追加内容
MGET key1 key2 ...批量获取

底层实现

  • SDS(Simple Dynamic String):可动态扩容,避免缓冲区溢出。
  • 支持整数值直接存储为 int 类型(节省空间)。

特点

  • 操作简单,性能高(O(1))。
  • 适合存储:缓存对象、计数器、分布式锁、短字符串。

2. List(列表)

简介

  • 有序、可重复的字符串序列。
  • 双端操作(从左、右两端 push/pop)。
  • 最大元素数:2^32 - 1

常用命令

命令说明
LPUSH key value1 [value2...]从左插入
RPUSH key value1 [value2...]从右插入
LPOP key从左弹出
RPOP key从右弹出
LRANGE key start stop获取范围内元素
BLPOP key timeout阻塞弹出

底层实现

  • 早期:ziplist(压缩列表)或 linkedlist(双向链表)。
  • Redis 3.2+:统一用 quicklist(压缩列表 + 链表结合)。

特点

  • 按插入顺序排序,适合消息队列、任务队列。
  • 插入和弹出为 O(1),随机访问为 O(n)。

3. Hash(哈希表)

简介

  • 键值对集合,适合存储对象(类似 Map)。
  • 最大 field 数量:2^32 - 1

常用命令

命令说明
HSET key field value设置字段值
HGET key field获取字段值
HMGET key field1 field2批量获取
HDEL key field删除字段
HGETALL key获取所有字段和值

底层实现

  • ziplist(压缩列表):当 field 数少且 value 短。
  • hashtable(哈希表):元素较多时。

特点

  • 适合存储结构化数据(如用户信息)。
  • 内存利用率高,操作复杂度 O(1)。

4. Set(集合)

简介

  • 无序、不重复的字符串集合。
  • 最大元素数:2^32 - 1

常用命令

命令说明
SADD key member1 [member2...]添加成员
SREM key member移除成员
SMEMBERS key获取所有成员
SISMEMBER key member判断成员是否存在
SUNION key1 key2并集
SINTER key1 key2交集
SDIFF key1 key2差集

底层实现

  • intset(整数集合):全是整数且数量少。
  • hashtable(哈希表):存储大量字符串成员。

特点

  • 自动去重,适合标签、好友关系。
  • 集合运算(交、并、差)性能高。

5. Sorted Set(有序集合,ZSet)

简介

  • 集合 + 分数(score),按分数排序。
  • 成员唯一,score 可重复。
  • 最大元素数:2^32 - 1

常用命令

命令说明
ZADD key score member添加成员
ZREM key member删除成员
ZRANGE key start stop [WITHSCORES]按顺序获取成员
ZREVRANGE key start stop倒序获取
ZRANK key member获取排名(升序)
ZREVRANK key member获取排名(降序)
ZINCRBY key increment member增加分数

底层实现

  • ziplist:元素少且数据短。
  • skiplist(跳表)+ hashtable:支持高效排序和查找。

特点

  • 适合排行榜、延时队列。
  • 按分数范围查找 O(log n)。

6. Bitmap(位图)

简介

  • 基于字符串的二进制位操作。
  • 最大长度:512MB(约 2^32 位)。

常用命令

命令说明
SETBIT key offset value设置某个位
GETBIT key offset获取某个位
BITCOUNT key统计位为 1 的数量
BITOP op destkey key1 key2...位运算

特点

  • 内存占用极小,适合布尔统计(签到、活跃用户)。
  • 位操作 O(1)。

7. HyperLogLog

简介

  • 基于概率的数据结构,用于基数统计(去重计数)。
  • 占用固定内存:12KB
  • 误差:约 0.81%。

常用命令

命令说明
PFADD key element1 [element2...]添加元素
PFCOUNT key获取基数估算值
PFMERGE destkey key1 key2...合并计数

特点

  • 适合统计 UV(独立访问用户)。
  • 不能获取具体元素,只能估算数量。

8. Geospatial(地理位置)

简介

  • 基于 ZSet 实现的地理位置信息存储。
  • 支持位置添加、范围查询、距离计算。

常用命令

命令说明
GEOADD key longitude latitude member添加位置
GEODIST key member1 member2 [unit]距离计算
`GEORADIUS key lon lat radius mkm`范围查询
GEOPOS key member获取经纬度

特点

  • 底层用 GeoHash 编码 + ZSet 存储。
  • 适合附近的人/店铺功能。

9. Stream(流)

简介

  • 类似消息队列,按时间顺序存储消息。
  • 支持消费组,持久化。

常用命令

命令说明
XADD key * field value添加消息
XREAD COUNT n STREAMS key ID读取消息
XGROUP CREATE key groupname id创建消费组
XREADGROUP GROUP group consumer消费组读取

特点

  • 适合日志流、事件流、实时数据处理。
  • 消息持久化存储,支持多消费者。

10. 数据结构对比表

类型有序性可重复性底层结构典型应用
String可重复SDS缓存、计数器
List可重复quicklist消息队列
Hashfield 唯一ziplist/hashtable对象存储
Set不可重复intset/hashtable标签、去重
ZSet按 score 排序成员唯一skiplist+hashtable排行榜
Bitmap位索引N/Abit array签到、活跃统计
HyperLogLogN/AN/AHLLUV 统计
Geo按位置排序成员唯一GeoHash+ZSet附近的人
Stream按时间排序可重复radix tree日志流
http://www.lryc.cn/news/617875.html

相关文章:

  • 【工作笔记】Wrappers.lambdaQuery()用法
  • ROS2学习(1)—基础概念及环境搭建
  • JavaEE 初阶第十七期:文件 IO 的 “管道艺术”(下)
  • vscode新建esp32工程,没有sample_project怎么办?
  • 计算机网络:ovn数据通信都是用了哪些协议?
  • 应用层模拟面试题
  • C语言(06)——二、八、十、十六进制的相互转换
  • Effective C++ 条款35:考虑 virtual函数以外的其他选择
  • 【已解决】报错:WARNING: pip is configured with locations that require TLS/SSL
  • HarmonyOS 开发入门 第一章
  • 一文读懂 C# 中的 Lazy<T>
  • Python 在自动化办公汇总和脚本示例
  • 本地文件夹与 GitHub 远程仓库绑定并进行日常操作的完整命令流程
  • 【基本有序数组中找到有且仅有的一个无序元素并进行排序之顺序法】2022-10-12
  • Linux线程——线程控制及理解
  • Transformer前传:Seq2Seq与注意力机制Attention
  • Haystack:面向大模型应用的模块化检索增强生成(RAG)框架
  • 什么情况下会导致日本服务器变慢?解决办法
  • Linux kernel network stack, some good article
  • Flink + Hologres构建实时数仓
  • Spring JDBC
  • TDengine IDMP 基本功能(1.界面布局和操作)
  • 【华为机试】208. 实现 Trie (前缀树)
  • openGauss逻辑备份恢复工具gs_dump/gs_restore
  • AI生成代码时代的商业模式重构:从“软件即产品”到“价值即服务”
  • 大模型落地实践:从技术重构到行业变革的双重突破
  • 亚马逊广告底层逻辑重构:从流量博弈到价值创造的战略升维
  • 思科交换机的不同级别IOS软件有什么区别?
  • Oracle数据库中的Library cache lock和pin介绍
  • Qt——实现”Hello World“、认识对象树与Qt坐标系