Redis 数据类型
2025/12/12大约 5 分钟
Redis 数据类型
Redis 5 种基本数据类型 + 4 种特殊类型。
String 字符串
最基本的类型,可以存储字符串、整数、浮点数。
基本命令
# 设置/获取
SET key value # 设置值
GET key # 获取值
MSET k1 v1 k2 v2 # 批量设置
MGET k1 k2 # 批量获取
GETSET key value # 设置新值,返回旧值
SETNX key value # 不存在才设置
SETEX key seconds value # 设置值和过期时间
# 追加/获取长度
APPEND key value # 追加
STRLEN key # 长度
# 数值操作
INCR key # +1
DECR key # -1
INCRBY key increment # +n
DECRBY key decrement # -n
INCRBYFLOAT key increment # +浮点数
# 位操作
SETRANGE key offset value # 替换部分
GETRANGE key start end # 截取部分应用场景
# 1. 缓存对象(JSON)
SET user:1001 '{"id":1001,"name":"张三","age":25}'
# 2. 计数器
SET article:1001:views 0
INCR article:1001:views
# 3. 分布式锁
SET lock:order:1001 uuid NX EX 30 # NX:不存在才设置,EX:过期时间
# 4. 限流
INCR rate:user:1001
EXPIRE rate:user:1001 60 # 每分钟限流Hash 哈希
字段-值映射,适合存储对象。
基本命令
# 设置/获取
HSET key field value # 设置单个字段
HMSET key f1 v1 f2 v2 # 设置多个字段
HGET key field # 获取单个字段
HMGET key f1 f2 # 获取多个字段
HGETALL key # 获取所有字段和值
HKEYS key # 所有字段名
HVALS key # 所有值
HLEN key # 字段数量
# 判断/删除
HEXISTS key field # 字段是否存在
HDEL key field [field ...] # 删除字段
HSETNX key field value # 不存在才设置
# 数值操作
HINCRBY key field increment # 字段 +n
HINCRBYFLOAT key field increment # 字段 +浮点数应用场景
# 1. 存储对象
HSET user:1001 name "张三" age 25 email "zhangsan@test.com"
HGET user:1001 name
# 2. 购物车
HSET cart:user:1001 goods:1001 2 # 商品ID -> 数量
HINCRBY cart:user:1001 goods:1001 1 # 数量 +1
HDEL cart:user:1001 goods:1001 # 删除商品
HGETALL cart:user:1001 # 获取购物车List 列表
有序列表,支持头尾操作。
基本命令
# 插入
LPUSH key value [value ...] # 左插入
RPUSH key value [value ...] # 右插入
LINSERT key BEFORE|AFTER pivot value # 在指定元素前/后插入
# 弹出
LPOP key [count] # 左弹出
RPOP key [count] # 右弹出
BLPOP key [key ...] timeout # 阻塞左弹出
BRPOP key [key ...] timeout # 阻塞右弹出
# 获取
LRANGE key start stop # 获取范围(0 -1 获取全部)
LINDEX key index # 获取指定位置
LLEN key # 列表长度
# 修改
LSET key index value # 修改指定位置
LTRIM key start stop # 保留范围内的元素
LREM key count value # 删除指定值应用场景
# 1. 消息队列
LPUSH queue:order order_data # 生产者
BRPOP queue:order 30 # 消费者(阻塞等待 30 秒)
# 2. 最新列表(时间线)
LPUSH timeline:user:1001 post_id
LTRIM timeline:user:1001 0 99 # 只保留最新 100 条
LRANGE timeline:user:1001 0 9 # 获取最新 10 条Set 集合
无序、不重复的字符串集合。
基本命令
# 添加/删除
SADD key member [member ...] # 添加成员
SREM key member [member ...] # 删除成员
SPOP key [count] # 随机弹出
# 查询
SMEMBERS key # 所有成员
SISMEMBER key member # 是否存在
SCARD key # 成员数量
SRANDMEMBER key [count] # 随机获取
# 集合运算
SINTER key [key ...] # 交集
SUNION key [key ...] # 并集
SDIFF key [key ...] # 差集
SINTERSTORE dest key [key ...] # 交集存储
SUNIONSTORE dest key [key ...] # 并集存储
SDIFFSTORE dest key [key ...] # 差集存储应用场景
# 1. 标签
SADD user:1001:tags "Go" "Redis" "MySQL"
SMEMBERS user:1001:tags
# 2. 共同关注
SADD follow:user:1001 2001 2002 2003
SADD follow:user:1002 2001 2004 2005
SINTER follow:user:1001 follow:user:1002 # 共同关注
# 3. 抽奖
SADD lottery:1 user1 user2 user3
SRANDMEMBER lottery:1 3 # 随机抽 3 人(不移除)
SPOP lottery:1 1 # 随机抽 1 人(移除)ZSet 有序集合
带分数的有序集合,按分数排序。
基本命令
# 添加/删除
ZADD key score member [score member ...] # 添加
ZREM key member [member ...] # 删除
ZINCRBY key increment member # 分数 +n
# 查询
ZSCORE key member # 获取分数
ZRANK key member # 获取排名(升序,从 0 开始)
ZREVRANK key member # 获取排名(降序)
ZCARD key # 成员数量
ZCOUNT key min max # 分数范围内的数量
# 范围查询
ZRANGE key start stop [WITHSCORES] # 按排名升序
ZREVRANGE key start stop [WITHSCORES] # 按排名降序
ZRANGEBYSCORE key min max [WITHSCORES] # 按分数范围
ZRANGEBYLEX key min max # 按字典序
# 集合运算
ZINTERSTORE dest numkeys key [key ...] # 交集
ZUNIONSTORE dest numkeys key [key ...] # 并集应用场景
# 1. 排行榜
ZADD rank:game 1000 user1 800 user2 1200 user3
ZREVRANGE rank:game 0 9 WITHSCORES # Top 10
ZINCRBY rank:game 50 user1 # 加分
ZREVRANK rank:game user1 # 我的排名
# 2. 延迟队列
ZADD delay:queue <timestamp> task_data # 添加任务
ZRANGEBYSCORE delay:queue 0 <now> LIMIT 0 10 # 获取到期任务
# 3. 限流(滑动窗口)
ZADD rate:user:1001 <timestamp> <uuid> # 记录请求
ZREMRANGEBYSCORE rate:user:1001 0 <now-60s> # 移除 60 秒前的
ZCARD rate:user:1001 # 统计请求数特殊类型
Bitmap 位图
SETBIT key offset value # 设置位
GETBIT key offset # 获取位
BITCOUNT key [start end] # 统计 1 的数量
BITOP AND|OR|XOR|NOT dest key [key ...] # 位运算应用场景
# 用户签到
SETBIT sign:user:1001:202401 0 1 # 1月1日签到
SETBIT sign:user:1001:202401 1 1 # 1月2日签到
BITCOUNT sign:user:1001:202401 # 1月签到天数
# 在线状态
SETBIT online:users 1001 1 # 用户1001在线
GETBIT online:users 1001 # 查询在线状态HyperLogLog 基数统计
基数统计(不精确),误差率约 0.81%,占用固定 12KB。
PFADD key element [element ...] # 添加元素
PFCOUNT key [key ...] # 统计基数
PFMERGE dest key [key ...] # 合并应用场景
# UV 统计
PFADD uv:page:1001 user1 user2 user3
PFCOUNT uv:page:1001Geo 地理位置
GEOADD key longitude latitude member # 添加位置
GEOPOS key member [member ...] # 获取位置
GEODIST key member1 member2 [unit] # 计算距离(m/km/mi/ft)
GEORADIUS key longitude latitude radius unit # 范围查询
GEOSEARCH key FROMMEMBER member BYRADIUS 5 km # 附近的人应用场景
# 附近的人
GEOADD location 116.397128 39.916527 user1
GEOADD location 116.405285 39.904989 user2
GEOSEARCH location FROMMEMBER user1 BYRADIUS 5 kmStream 消息流
Redis 5.0+ 的消息队列,支持消费组。
# 生产者
XADD stream * field value # 添加消息(* 自动生成 ID)
# 消费者
XREAD COUNT 10 STREAMS stream 0 # 读取消息
XREAD BLOCK 5000 STREAMS stream $ # 阻塞读取新消息
# 消费组
XGROUP CREATE stream group 0 # 创建消费组
XREADGROUP GROUP group consumer COUNT 10 STREAMS stream > # 消费
XACK stream group id # 确认消息