Redis 中的主要数据结构

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

1. 字符串(String)

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

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

例子:

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

2. 列表(List)

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

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

例子:

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

3. 集合(Set)

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

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

例子:

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

4. 有序集合(Sorted Set)

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

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

例子:

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

5. 哈希(Hash)

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

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

例子:

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

6. 位图(Bitmap)

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

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

例子:

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

7. HyperLogLog

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

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

例子:

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

8. 地理位置(GEO)

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

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

例子:

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 之后引入的一种消息队列数据结构,支持高效的消息存储和处理。

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

例子:

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

相关推荐
我不会插花弄玉9 分钟前
7.函数【由浅入深-MySQL】
android·数据库·mysql
周小董23 分钟前
[1369]Windows上安装PostgreSQL
数据库·windows·postgresql
一只积极向上的小咸鱼3 小时前
第一性原理思考:从拆解问题到用实验检验答案
数据库
这个DBA有点耶3 小时前
时序数据库InfluxDB高基数问题深度拆解:内存索引膨胀机制与OOM完整链路
数据库·架构·dba
加油yx3 小时前
MySQL数据类型
数据库·mysql
0+1113 小时前
算法 --链表
数据结构·算法·leetcode·链表
行百里er4 小时前
Redis 模块——JSON、向量搜索与时序
redis·后端
蓝胖的四次元口袋4 小时前
Redis知识梳理(1)
数据库·redis·缓存
夜雪一千4 小时前
MySQL 数据加密实战:从传输、存储到字段级加密,分清场景不踩坑
数据库·mysql
wefg15 小时前
【Redis】C++ 自定义客户端
数据库·redis·缓存