数据结构与常用命令

String:万能基础

最常用的结构,可存文本、数字、二进制(序列化对象图片等)。

SET user:1:name "Alice"
GET user:1:name

SET counter 0
INCR counter            # 原子自增,计数器
INCRBY counter 10
DECR counter

SETNX lock:order:1 "1"  # 不存在才设置(简易锁)
SET session:abc "data" EX 3600   # 带过期时间
SETNX session:abc "data"         # 配合 EXPIRE 的旧写法

MSET k1 v1 k2 v2        # 批量
MGET k1 k2

GETSET counter 0        # 返回旧值并设置新值
Tip

SET key value EX seconds NX原子的「设置并加过期」,等价于分布式锁的加锁原语;SETNX + EXPIRE 两步在崩溃时可能留下永不过期的锁。

Hash:对象存储

适合存储对象的多个字段,可单独读写字段,省内存。

HSET user:1 name "Alice" age 30
HGET user:1 name
HMGET user:1 name age
HGETALL user:1
HINCRBY user:1 age 1     # 字段级原子自增
HDEL user:1 age
HLEN user:1

List:列表 / 队列

双向链表,适合消息队列、最新列表、栈。

LPUSH queue job1 job2    # 左侧入队
RPUSH queue job3
LPOP queue               # 左侧出队
RPOPLPUSH src dst        # 原子移动(可靠队列)

LRANGE queue 0 -1        # 查看全部(大列表慎用)
LTRIM queue 0 99         # 只保留前 100 个
LLEN queue

Set:无序集合

去重与集合运算,适合标签、共同好友、抽奖。

SADD tags go redis database
SMEMBERS tags
SISMEMBER tags go        # 是否存在

SADD user:1:follow 100 200
SADD user:2:follow 200 300
SINTER user:1:follow user:2:follow   # 交集(共同关注)
SUNION user:1:follow user:2:follow
SDIFF  user:1:follow user:2:follow

SRANDMEMBER tags 1       # 随机(抽奖,不删除)
SPOP tags 1              # 随机弹出(抽奖,删除)
SCARD tags               # 基数

ZSet:有序集合

带分数的集合,适合排行榜、延时队列、范围查询。

ZADD rank 100 alice 90 bob 80 carol
ZINCRBY rank 5 bob

ZREVRANGE rank 0 9 WITHSCORES        # 排行榜前 10
ZRANGEBYSCORE rank 80 100            # 按分数范围
ZRANK rank bob                       # 升序排名
ZREVRANK rank bob                    # 降序排名
ZCARD rank
ZREM rank carol
Tip

排行榜用 ZINCRBY + ZREVRANGE,分页与实时排名都能优雅解决。延时队列可用 ZSet:score 存「执行时间戳」,消费者用 ZRANGEBYSCORE key 0 now LIMIT 0 10 拉取到期任务,配合 Lua 保证原子弹出。

高级结构

结构用途命令示例
Bitmap位操作:签到、活跃统计SETBIT / BITCOUNT / BITOP
HyperLogLog基数估计(UV),极小内存PFADD / PFCOUNT
GEO地理位置距离/范围GEOADD / GEOSEARCH
Stream消息流,支持消费组XADD / XREADGROUP
# Bitmap:用户 1001 第 3 天签到
SETBIT sign:1001 3 1
BITCOUNT sign:1001                 # 统计签到天数

# HyperLogLog:统计 UV(误差约 0.81%)
PFADD uv:20260101 user1 user2 user3
PFCOUNT uv:20260101

# GEO
GEOADD shops 116.40 39.90 "shop1"
GEOSEARCH shops FROMMEMBER shop1 BYRADIUS 5 km ASC

# Stream:生产者/消费者组
XADD stream:* field value
XGROUP CREATE stream group1 0
XREADGROUP GROUP group1 consumer1 COUNT 10 STREAMS stream >
XACK stream group1 <id>
Warning

HyperLogLog 不精确(标准误差 0.81%)且无法枚举元素,只适合基数估算(如 UV)。需要精确去重时必须用 Set。Bitmap 只适合「离散 ID 不大、可映射为位偏移」的场景。

键管理与过期

EXPIRE user:1:name 60     # 设置过期(秒)
TTL  user:1:name          # 剩余时间;-1 永久,-2 不存在
PERSIST user:1:name       # 移除过期
TYPE user:1:name
EXISTS user:1:name

# 用 SCAN 代替 KEYS(渐进式、不阻塞)
SCAN 0 MATCH user:* COUNT 100

小结

  • String 万能、Hash 存对象、List 做队列、Set 去重集合运算、ZSet 做排行榜。
  • Bitmap、HyperLogLog、GEO、Stream 覆盖位统计、基数估算、地理位置与消息流。
  • 加锁用 SET NX EX 保证原子;遍历用 SCAN 而非 KEYS
  • 一切键都应设置合理过期,避免内存无限增长。