Redis 数据结构与使用场景
五大基础数据类型
1. String(字符串)
最基本的数据类型,可以存储字符串、整数或浮点数。
bash
# 基本操作
SET name "Tom"
GET name
# 计数器
INCR page_view
INCRBY page_view 10
# 分布式锁
SET lock_key unique_value NX EX 30使用场景:
- 缓存对象(JSON 序列化)
- 计数器(点赞数、访问量)
- 分布式锁
- Session 共享
2. Hash(哈希)
键值对集合,适合存储对象。
bash
# 存储用户信息
HSET user:1001 name "Tom" age 25 email "tom@example.com"
HGET user:1001 name
HGETALL user:1001
# 购物车
HSET cart:user1001 product:001 2
HINCRBY cart:user1001 product:001 1使用场景:
- 存储对象(比 String 更节省内存)
- 购物车
3. List(列表)
双向链表,支持从两端插入和删除。
bash
# 消息队列
LPUSH queue:msg "message1"
RPOP queue:msg
# 阻塞读取(消费者)
BRPOP queue:msg 0
# 最新列表
LPUSH latest:news "news1"
LTRIM latest:news 0 99 # 只保留最新 100 条
LRANGE latest:news 0 9 # 获取最新 10 条使用场景:
- 消息队列(简单场景)
- 最新动态列表
- 文章评论列表
4. Set(集合)
无序集合,元素唯一,支持集合运算。
bash
# 标签系统
SADD post:1001:tags "java" "redis" "backend"
SMEMBERS post:1001:tags
# 共同关注
SADD user:1001:following "user1002" "user1003"
SADD user:1002:following "user1003" "user1004"
SINTER user:1001:following user:1002:following # 共同关注
# 抽奖
SADD lottery:users "user1" "user2" "user3"
SRANDMEMBER lottery:users 1 # 随机抽取 1 人
SPOP lottery:users 1 # 抽取并移除使用场景:
- 标签系统
- 共同好友/关注
- 抽奖活动
- 去重
5. ZSet(有序集合)
有序集合,每个元素关联一个分数(score),按分数排序。
bash
# 排行榜
ZADD rank:game 1000 "player1" 900 "player2" 800 "player3"
ZREVRANGE rank:game 0 9 WITHSCORES # Top 10
ZINCRBY rank:game 100 "player1" # 加分
# 延迟队列
ZADD delay:queue 1705123456 "task1" # score 为执行时间戳
ZRANGEBYSCORE delay:queue 0 1705123456 # 获取到期任务使用场景:
- 排行榜
- 延迟队列
- 时间线
三种特殊数据类型
1. Bitmap(位图)
使用 String 类型存储二进制位,非常节省空间。
bash
# 用户签到
SETBIT sign:user1001:202401 0 1 # 1月1日签到
SETBIT sign:user1001:202401 1 1 # 1月2日签到
BITCOUNT sign:user1001:202401 # 统计签到天数
# 用户在线状态
SETBIT online:users 1001 1
GETBIT online:users 10012. HyperLogLog
基数统计,用于统计不重复元素的个数,误差约 0.81%。
bash
# UV 统计(占用空间固定 12KB)
PFADD uv:page:1001 "user1" "user2" "user3"
PFCOUNT uv:page:10013. GEO(地理位置)
存储地理位置信息,支持距离计算、范围查询。
bash
# 添加位置
GEOADD city 116.405285 39.904989 "beijing"
GEOADD city 121.472644 31.231706 "shanghai"
# 计算距离
GEODIST city beijing shanghai km
# 附近的人
GEORADIUS city 116.405285 39.904989 100 km底层数据结构
| 类型 | 编码方式 | 适用场景 |
|---|---|---|
| String | int / embstr / raw | 数字/短字符串/长字符串 |
| Hash | ziplist / hashtable | 小于 512 个元素 / 大量元素 |
| List | quicklist | 双向链表 + 压缩列表 |
| Set | intset / hashtable | 全是整数/包含字符串 |
| ZSet | ziplist / skiplist | 小于 128 个元素/大量元素 |
