Skip to content

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 1001

2. HyperLogLog

基数统计,用于统计不重复元素的个数,误差约 0.81%。

bash
# UV 统计(占用空间固定 12KB)
PFADD uv:page:1001 "user1" "user2" "user3"
PFCOUNT uv:page:1001

3. 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

底层数据结构

类型编码方式适用场景
Stringint / embstr / raw数字/短字符串/长字符串
Hashziplist / hashtable小于 512 个元素 / 大量元素
Listquicklist双向链表 + 压缩列表
Setintset / hashtable全是整数/包含字符串
ZSetziplist / skiplist小于 128 个元素/大量元素