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

相关推荐
夏木~1 小时前
Oracle 中什么情况下 可以使用 EXISTS 替代 IN 提高查询效率
数据库·oracle
W21551 小时前
Liunx下MySQL:表的约束
数据库·mysql
黄名富1 小时前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
言、雲1 小时前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库
1nullptr1 小时前
三次翻转实现数组元素的旋转
数据结构
TT哇1 小时前
【数据结构练习题】链表与LinkedList
java·数据结构·链表
A懿轩A2 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
G_whang2 小时前
centos7下docker 容器实现redis主从同步
redis·docker·容器
一个程序员_zhangzhen2 小时前
sqlserver新建用户并分配对视图的只读权限
数据库·sqlserver
zfj3212 小时前
学技术学英文:代码中的锁:悲观锁和乐观锁
数据库·乐观锁··悲观锁·竞态条件