当前位置: 首页 > 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.xdnf.cn/news/1282753.html

相关文章:

  • VMD例程(Matlab 2021b可直接使用)
  • C++方向知识汇总(三)
  • 【MySQL基础篇】:MySQL索引——提升数据库查询性能的关键
  • 【华为机试】648. 单词替换
  • Jmeter使用第二节-接口测试(Mac版)
  • Nestjs框架: RBAC基于角色的权限控制模型初探
  • Flutter - 应用启动/路由管理
  • buildroot编译qt 5.9.8 arm64版本踩坑
  • 个人效能是一个系统
  • MaixPy简介
  • MySQL 函数
  • 达梦数据库慢SQL日志收集和分析
  • 【排序算法】⑥快速排序:Hoare、挖坑法、前后指针法
  • 算法训练营DAY57 第十一章:图论part07
  • 数集相等定义凸显解析几何几百年重大错误:将无穷多各异点集误为同一集
  • 深度学习和神经网络最基础的mlp,从最基础的开始讲
  • 数据大集网:精准获客新引擎,助力中小企业突破推广困局
  • MATLAB实现遗传算法求解路网路由问题
  • R语言机器学习算法实战系列(二十七)LASSO 与 Adaptive LASSO 在特征选择中的比较与应用
  • 【Leetcode】随笔
  • 深入浅出设计模式——行为型模式之观察者模式 Observer
  • Note4:Self-Attention
  • 能力评估:如何系统评估你的技能和经验
  • @ContextConfiguration
  • 嵌入式学习的第四十八天-中断+OCP原则
  • 矩阵游戏(二分图最大匹配)
  • 新人该如何将不同的HTML、CSS、Javascript等文件转化为Vue3文件架构
  • 大数据量下分页查询性能优化实践(SpringBoot+MyBatis-Plus)
  • Linux操作系统从入门到实战(十九)进程状态
  • HyperMesh许可使用监控