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

相关推荐
SelectDB1 小时前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
这个DBA有点耶2 小时前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
掉头发的王富贵5 小时前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
Nturmoils5 小时前
WHERE 条件别凭习惯写,常用查询先跑一遍
数据库
刘马想放假8 小时前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
云技纵横8 小时前
一个 @Async 让循环依赖暴雷:Spring 代理的暗坑
redis
Databend1 天前
在 AWS 中国峰会逛了一天,我在 Databend 展台看到了 Agent 数据基础设施的新思路
数据库·人工智能·agent
犯困蛋挞yy1 天前
用Claude快速解决Redis代码报错反复无解的问题
redis
北域码匠1 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
ClouGence2 天前
Oracle 数据同步为什么会出现数据不一致?长事务是常被忽略的原因
数据库·后端·oracle