Skip to content

Redis - 数据类型

Redis 不仅仅是一个简单的键值(key-value)存储系统,它还是一个数据结构服务器。理解其丰富的数据类型是构建强大高效应用的关键。现代 Redis 在原有五种数据类型的基础上,支持了多种更高级的数据结构。

最基本的 Redis 类型。它们是二进制安全的(binary-safe),可以存储任何类型的数据,从文本到序列化对象或 JPEG 文件,最大可达 512MB。

用例: 缓存 HTML 片段、存储会话数据、使用 INCR/DECR 进行计数。

127.0.0.1:6379> SET cache:user:123 "...user profile data..." EX 3600
OK
127.0.0.1:6379> GET cache:user:123
"...user profile data..."

在字符串字段(field)和字符串值(value)之间建立映射关系,非常适合表示对象。它们在存储大量对象时内存效率很高。

注意: HMSET 命令自 Redis 4.0.0 起已弃用。请改用带有多字段/值对的 HSET 命令。

用例: 存储用户资料、产品目录。

127.0.0.1:6379> HSET user:1001 username "alex" email "alex@example.com" points 1500
(integer) 3
127.0.0.1:6379> HGETALL user:1001
1) "username"
2) "alex"
3) "email"
4) "alex@example.com"
5) "points"
6) "1500"

一个字符串列表,按插入顺序排序。你可以从头部(左侧)或尾部(右侧)推入/弹出元素。

用例: 实现消息队列、存储时间线或活动动态。

127.0.0.1:6379> LPUSH tasks:queue 'process_video_1.mp4'
(integer) 1
127.0.0.1:6379> LPUSH tasks:queue 'generate_report_3.pdf'
(integer) 2
127.0.0.1:6379> RPOP tasks:queue
"process_video_1.mp4"

无序的唯一字符串集合。它们经过高度优化,适用于成员资格测试、查找不同集合的并集和交集操作。

用例: 存储文章标签、追踪独立访客、实现访问控制列表(ACL)。

127.0.0.1:6379> SADD article:1:tags 'nosql' 'database' 'redis'
(integer) 3
127.0.0.1:6379> SADD article:1:tags 'redis' # This will be ignored
(integer) 0
127.0.0.1:6379> SISMEMBER article:1:tags 'database'
(integer) 1

与集合(Sets)类似,它们是唯一字符串的集合。但每个成员都关联一个浮点分数(floating-point score)。成员总是根据此分数进行排序。

用例: 排行榜、限流器、二级索引。

127.0.0.1:6379> ZADD leaderboard:2024 1550 'player1' 2100 'player2' 1800 'player3'
(integer) 3
# Get top 2 players
127.0.0.1:6379> ZREVRANGE leaderboard:2024 0 1 WITHSCORES
1) "player2"
2) "2100"
3) "player3"
4) "1800"

一种强大的、只追加(append-only)的日志数据结构。它允许你按时间顺序记录事件,并使用消费者组(consumer groups)进行处理,类似于 Apache Kafka。

用例: 实时消息、事件溯源、传感器数据采集。

# 向流中添加一个事件
127.0.0.1:6379> XADD sensor:data * temp 25.5 humidity 60
"1672531200000-0"
# 从流的起始位置读取所有事件
127.0.0.1:6379> XRANGE sensor:data - +
1) 1) "1672531200000-0"
2) 1) "temp"
2) "25.5"
3) "humidity"
4) "60"

7. 地理空间索引(Geospatial Indexes)

Section titled “7. 地理空间索引(Geospatial Indexes)”

存储经度/纬度(longitude/latitude)对,并允许你执行范围查询(radius queries),查找彼此在一定距离内的点。

用例: 查找附近的兴趣点、基于位置的服务。

127.0.0.1:6379> GEOADD locations 13.361389 52.521944 "Brandenburg Gate"
(integer) 1
# 查找距离某个点 5 公里半径内的位置
127.0.0.1:6379> GEORADIUS locations 13.36 52.52 5 km
1) "Brandenburg Gate"

一种概率型数据结构,用于以极小的内存估算集合中唯一元素的数量(基数/cardinality)。结果是一个近似值,标准误差小于 1%。

用例: 统计每日独立活跃用户、统计独立搜索查询。

127.0.0.1:6379> PFADD unique:logins:2024-01-01 'user1' 'user2' 'user3'
(integer) 1
127.0.0.1:6379> PFADD unique:logins:2024-01-01 'user1' # 不会增加计数
(integer) 0
127.0.0.1:6379> PFCOUNT unique:logins:2024-01-01
(integer) 3

9. 位图(Bitmaps)和位字段(Bitfields)

Section titled “9. 位图(Bitmaps)和位字段(Bitfields)”

它不是一个独立的数据类型,而是在字符串(String)类型上进行一系列位级操作。它允许你将字符串视为位图,设置和获取单个位。

用例: 追踪用户每日活动(是否登录)、功能开关(feature flags)、实时分析。

# 将用户 1、5 和 10 标记为今天活跃(用户 ID 即为位偏移量)
127.0.0.1:6379> SETBIT daily:active:2024-01-01 1 1
(integer) 0
127.0.0.1:6379> SETBIT daily:active:2024-01-01 5 1
(integer) 0
127.0.0.1:6379> SETBIT daily:active:2024-01-01 10 1
(integer) 0
# 检查用户 5 是否活跃
127.0.0.1:6379> GETBIT daily:active:2024-01-01 5
(integer) 1
# 统计活跃用户总数
127.0.0.1:6379> BITCOUNT daily:active:2024-01-01
(integer) 3