Redis 中的主要数据结构

Redis 提供了丰富且高效的数据结构,支持多种类型的操作,可以满足不同场景下的存储需求。以下是 Redis 中的主要数据结构及其应用场景和特点:

1. 字符串(String)

字符串是 Redis 中最基础的数据类型,所有键值最终都可以以字符串的形式存储。

  • 特点:单个字符串值最大可达 512 MB。
  • 常用命令SETGETINCRDECRAPPENDSTRLEN
  • 应用场景 :计数器、简单的 key-value 存储、缓存 JSON 数据、分布式锁(通过 SETNX 实现)。

例子

plaintext 复制代码
SET myKey "Hello, Redis!"
GET myKey  # 返回 "Hello, Redis!"
INCR myCounter  # 将 myCounter 的值加 1

2. 列表(List)

列表是一种链表结构,可以在列表的头部和尾部快速插入和删除元素。

  • 特点:适合按照顺序存储一组元素,支持双向链表的操作。
  • 常用命令LPUSHRPUSHLPOPRPOPLRANGELLEN
  • 应用场景 :消息队列(可使用 LPUSHRPOP 实现队列)、任务列表、时间序列数据存储。

例子

plaintext 复制代码
LPUSH myList "Redis"
LPUSH myList "is"
LPUSH myList "awesome"
LRANGE myList 0 -1  # 返回 ["awesome", "is", "Redis"]

3. 集合(Set)

集合是一种无序的集合数据结构,元素唯一且不重复。

  • 特点:Redis 会自动去重,适合存储唯一性要求的集合。
  • 常用命令SADDSREMSMEMBERSSISMEMBERSUNIONSINTER
  • 应用场景:标签系统、共同好友、去重操作、社交网络中的共同关注者。

例子

plaintext 复制代码
SADD mySet "apple"
SADD mySet "banana"
SADD mySet "apple"  # "apple" 已存在,不会重复添加
SMEMBERS mySet  # 返回 ["apple", "banana"]

4. 有序集合(Sorted Set)

有序集合 与集合类似,但每个元素都会关联一个分数(score),Redis 根据分数自动排序。

  • 特点:可以按分数排序,适合实现排名系统。
  • 常用命令ZADDZRANGEZRANGEBYSCOREZREMZCOUNT
  • 应用场景:排行榜、延时队列、带权重的排序任务(如排行榜中用户的分数排序)。

例子

plaintext 复制代码
ZADD mySortedSet 100 "Alice"
ZADD mySortedSet 200 "Bob"
ZRANGE mySortedSet 0 -1 WITHSCORES  # 返回 ["Alice", 100, "Bob", 200]

5. 哈希(Hash)

哈希是一种键值对集合,适合存储对象属性(类似于 JSON 对象)。

  • 特点:每个哈希键下可以存储多个字段,适合存储对象的多属性值。
  • 常用命令HSETHGETHGETALLHDELHINCRBY
  • 应用场景:用户信息存储、配置项、对象的字段值(如用户ID、用户名、用户年龄等)。

例子

plaintext 复制代码
HSET user:1001 name "Alice"
HSET user:1001 age "30"
HGETALL user:1001  # 返回 {"name": "Alice", "age": "30"}

6. 位图(Bitmap)

位图是基于字符串的特殊数据结构,可以进行位操作,每个位可以存储 0 或 1。

  • 特点:使用位操作存储布尔状态,能有效节省空间。
  • 常用命令SETBITGETBITBITCOUNTBITOP
  • 应用场景:用户签到、活跃用户统计、布尔标记存储(如用户是否在线)。

例子

plaintext 复制代码
SETBIT user_activity 1 1  # 设置用户 1 活跃
SETBIT user_activity 2 1  # 设置用户 2 活跃
BITCOUNT user_activity  # 返回活跃用户数量

7. HyperLogLog

HyperLogLog 是一种用于基数统计的概率性数据结构,可以用极少的内存(12 KB)来估算独立元素的数量,适合大规模数据去重统计。

  • 特点:内存占用小,但会有一定误差,误差率约为 0.81%。
  • 常用命令PFADDPFCOUNTPFMERGE
  • 应用场景:UV 统计、页面访问去重、唯一性统计(比如每天有多少唯一用户访问)。

例子

plaintext 复制代码
PFADD myHyperLogLog "user1"
PFADD myHyperLogLog "user2"
PFCOUNT myHyperLogLog  # 返回去重后的用户数

8. 地理位置(GEO)

GEO 是 Redis 中用于存储地理位置数据的结构,支持地理坐标存储和基于位置的查询。

  • 特点:可以存储经纬度并计算位置间的距离,支持基于半径的范围查询。
  • 常用命令GEOADDGEODISTGEORADIUSGEOPOS
  • 应用场景:查找附近的用户或地点、基于地理位置的推荐系统。

例子

plaintext 复制代码
GEOADD myGeoSet 116.407526 39.90403 "Beijing"
GEOADD myGeoSet 121.473701 31.230416 "Shanghai"
GEODIST myGeoSet "Beijing" "Shanghai" km  # 返回两地距离

9. 流(Stream)

是 Redis 5.0 之后引入的一种消息队列数据结构,支持高效的消息存储和处理。

  • 特点:支持消息队列的生产与消费,可以用于实时数据流处理。
  • 常用命令XADDXREADXGROUPXDEL
  • 应用场景:消息队列、事件存储、实时数据处理(如日志收集、订单系统)。

例子

plaintext 复制代码
XADD myStream * sensor_id 1 temperature 22.5
XADD myStream * sensor_id 2 temperature 23.1
XREAD COUNT 2 STREAMS myStream 0  # 读取消息流中的数据

总结

Redis 提供的多种数据结构不仅丰富而且高效,适合多种应用场景:

  • 字符串(String):最基础的键值对数据结构,适合简单的数据存储。
  • 列表(List):适合需要有序的队列和栈操作。
  • 集合(Set):适合去重和集合运算。
  • 有序集合(Sorted Set):适合排名和排序需求。
  • 哈希(Hash):适合存储对象的属性。
  • 位图(Bitmap):适合布尔值存储,节省空间。
  • HyperLogLog:适合大规模基数统计。
  • 地理位置(GEO):适合基于地理位置的服务。
  • 流(Stream):适合实时数据流处理和消息队列。

Redis 的多种数据结构,使得它不仅仅是一个简单的键值对数据库,更是一个功能强大的内存数据存储系统,可以应用于缓存、排行榜、消息队列、实时分析等多种场景。

相关推荐
hy.z_77710 分钟前
【数据结构刷题】顺序表与ArrayList
数据结构
TE-茶叶蛋23 分钟前
Redis 原子操作
数据库·redis·缓存
Linux运维老纪26 分钟前
Python文件操作及数据库交互(Python File Manipulation and Database Interaction)
linux·服务器·数据库·python·云计算·运维开发
Felven26 分钟前
A. Everybody Likes Good Arrays!
数据结构·算法
Bruce_Liuxiaowei32 分钟前
MCP Python SDK构建的**SQLite浏览器**的完整操作指南
数据库·python·sqlite
数据与人工智能律师1 小时前
正确应对监管部门的数据安全审查
大数据·网络·数据库·人工智能·区块链
2401_897930061 小时前
什么是非关系型数据库
数据库·oracle
鱼丸丶粗面1 小时前
Python 读取 txt 文件详解 with ... open()
linux·数据库·python
拾荒者.1261 小时前
设计一个关键字统计程序:利用HashMap存储关键字统计信息,对用户输入的关键字进行个数统计。
数据库·python·mysql
encoding-console1 小时前
欧拉环境(openEuler 22.03 LTS SP3)安装移动磐维数据库(PanWeiDB_V2.0-S2.0.2_B01)步骤
数据库·虚拟机·欧拉·磐维数据库