当前位置: 首页 > 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.dtcms.com/a/326199.html

相关文章:

  • 计算机网络(一)——TCP
  • JavaScript Const的基础使用
  • QML的中英文翻译
  • 快速搭建前端playwright工程
  • SpringAI实现Reread(Advisor)
  • DNS核心概念与BIND配置详解
  • C++11的历史和统一的初始化列表
  • Qt串口通信设计指南:通信层架构与实践
  • K8S学习----应用部署架构:传统、虚拟化与容器的演进与对比
  • 虚拟财产刑事辩护:跨地域性与匿名性带来的挑战
  • 记录一些sonic自动化运行中的问题
  • 常见通信协议详解:TCP、UDP、HTTP/HTTPS、WebSocket 与 GRPC
  • 基于 Axios 的 HTTP 请求封装文件解析
  • Rust:专业级错误处理工具 thiserror 详解
  • Nginx 从入门到实战:安装、配置、升级与高级应用全解析
  • Web 开发前端与后端 API 的交互
  • golang 基础案例_01
  • 【MYSQL】MySQL中On duplicate key update
  • 台式机内存条安装方法
  • Docker中安装MySQL 5的详细过程
  • 算法讲解--水果成篮
  • GitHub的简单使用方法----(2)
  • Android中Activity销毁底层原理
  • AVS Video Converter视频转换与编辑工具深度评测
  • 基于OpenCV的实时美颜技术:从传统算法到深度学习融合实现
  • 光功率dBm为何是负数?一文详解
  • Effective C++ 条款35:考虑 virtual函数以外的其他选择
  • Spring源码解析 - SpringApplication run流程-prepareContext源码分析
  • MD5:理解MD5 / MD5核心特性 / MD5 在前端开发中的常见用途 / 在线生成MD5 / js-md5
  • Linux Docker 运行SQL Server