Redis - 数据类型
Redis - 现代数据结构
Section titled “Redis - 现代数据结构”Redis 不仅仅是一个简单的键值(key-value)存储系统,它还是一个数据结构服务器。理解其丰富的数据类型是构建强大高效应用的关键。现代 Redis 在原有五种数据类型的基础上,支持了多种更高级的数据结构。
核心数据类型
Section titled “核心数据类型”1. 字符串(Strings)
Section titled “1. 字符串(Strings)”最基本的 Redis 类型。它们是二进制安全的(binary-safe),可以存储任何类型的数据,从文本到序列化对象或 JPEG 文件,最大可达 512MB。
用例: 缓存 HTML 片段、存储会话数据、使用 INCR/DECR 进行计数。
127.0.0.1:6379> SET cache:user:123 "...user profile data..." EX 3600OK127.0.0.1:6379> GET cache:user:123"...user profile data..."2. 散列(Hashes)
Section titled “2. 散列(Hashes)”在字符串字段(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) 3127.0.0.1:6379> HGETALL user:10011) "username"2) "alex"3) "email"4) "alex@example.com"5) "points"6) "1500"3. 列表(Lists)
Section titled “3. 列表(Lists)”一个字符串列表,按插入顺序排序。你可以从头部(左侧)或尾部(右侧)推入/弹出元素。
用例: 实现消息队列、存储时间线或活动动态。
127.0.0.1:6379> LPUSH tasks:queue 'process_video_1.mp4'(integer) 1127.0.0.1:6379> LPUSH tasks:queue 'generate_report_3.pdf'(integer) 2127.0.0.1:6379> RPOP tasks:queue"process_video_1.mp4"4. 集合(Sets)
Section titled “4. 集合(Sets)”无序的唯一字符串集合。它们经过高度优化,适用于成员资格测试、查找不同集合的并集和交集操作。
用例: 存储文章标签、追踪独立访客、实现访问控制列表(ACL)。
127.0.0.1:6379> SADD article:1:tags 'nosql' 'database' 'redis'(integer) 3127.0.0.1:6379> SADD article:1:tags 'redis' # This will be ignored(integer) 0127.0.0.1:6379> SISMEMBER article:1:tags 'database'(integer) 15. 有序集合(Sorted Sets/ZSETs)
Section titled “5. 有序集合(Sorted Sets/ZSETs)”与集合(Sets)类似,它们是唯一字符串的集合。但每个成员都关联一个浮点分数(floating-point score)。成员总是根据此分数进行排序。
用例: 排行榜、限流器、二级索引。
127.0.0.1:6379> ZADD leaderboard:2024 1550 'player1' 2100 'player2' 1800 'player3'(integer) 3# Get top 2 players127.0.0.1:6379> ZREVRANGE leaderboard:2024 0 1 WITHSCORES1) "player2"2) "2100"3) "player3"4) "1800"高级数据类型
Section titled “高级数据类型”6. 流(Streams)
Section titled “6. 流(Streams)”一种强大的、只追加(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 km1) "Brandenburg Gate"8. HyperLogLogs
Section titled “8. HyperLogLogs”一种概率型数据结构,用于以极小的内存估算集合中唯一元素的数量(基数/cardinality)。结果是一个近似值,标准误差小于 1%。
用例: 统计每日独立活跃用户、统计独立搜索查询。
127.0.0.1:6379> PFADD unique:logins:2024-01-01 'user1' 'user2' 'user3'(integer) 1127.0.0.1:6379> PFADD unique:logins:2024-01-01 'user1' # 不会增加计数(integer) 0127.0.0.1:6379> PFCOUNT unique:logins:2024-01-01(integer) 39. 位图(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) 0127.0.0.1:6379> SETBIT daily:active:2024-01-01 5 1(integer) 0127.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