Redis基础数据结构
Redis7九大核心数据结构深度解析与操作指南
数据结构全景图
1. String(字符串)
核心命令与操作
# 基础操作
SET user:1 "{\"name\":\"roy\",\"age\":28}" # 存储对象
GET user:1 # 获取值
MSET config:timeout 30 config:max_conn 100 # 批量存储
MGET config:timeout config:max_conn # 批量获取# 原子计数
INCR article:1001:views # 自增1
INCRBY inventory:1001 5 # 增加指定数量
DECR stock:1001 # 自减1# 分布式锁
SETNX lock:order true # 获取锁(1成功/0失败)
EXPIRE lock:order 10 # 设置过期时间
DEL lock:order # 释放锁
应用场景
- 缓存穿透解决方案:空值缓存
SET user:-1 "" EX 60
- 分布式ID生成器:
INCR global:id
- 秒杀库存计数:
DECR stock:seckill:1001
2. Hash(哈希表)
常用操作命令
# 对象存储
HSET user:1 name "roy" age 28 balance 1888
HGET user:1 name
HMGET user:1 name age# 购物车实现
HSET cart:1001 10088 1 # 添加商品
HINCRBY cart:1001 10088 1 # 增加数量
HDEL cart:1001 10088 # 删除商品
HGETALL cart:1001 # 获取全量# 字段操作
HEXISTS user:1 email # 检查字段是否存在
HKEYS user:1 # 获取所有字段名
HVALS user:1 # 获取所有字段值
优缺点分析
✅ 节省内存空间(相比多个String)
✅ 同类数据聚合存储
❌ 不支持field级别过期
❌ 集群环境下慎用大Hash
3. List(列表)
消息队列实现命令
# 基础操作
LPUSH msg:queue "task1" "task2" # 左侧插入
RPOP msg:queue # 右侧取出
LRANGE msg:queue 0 -1 # 获取全部元素# 阻塞队列
BLPOP msg:queue 30 # 阻塞式左弹出(30秒超时)
BRPOP msg:queue 0 # 无限阻塞右弹出# 栈结构
LPUSH + LPOP = Stack
应用场景
- 最新消息列表:
LPUSH news:latest <new_id>
- 消息确认机制:双队列模式
- 历史记录:固定长度列表
LTRIM history:user1 0 49
4. Set(集合)
社交场景命令
# 点赞系统
SADD like:1001 user1 user2 # 添加点赞
SREM like:1001 user1 # 取消点赞
SMEMBERS like:1001 # 获取点赞列表
SCARD like:1001 # 统计点赞数# 关系运算
SINTER follow:1001 follow:1002 # 共同关注
SUNION friend:1001 friend:1002 # 合并好友
SDIFF follow:1001 follow:1002 # 差异关注# 抽奖系统
SADD lottery:0504 user1 user2 user3 # 参与抽奖
SRANDMEMBER lottery:0504 3 # 随机选取3个(不删除)
SPOP lottery:0504 2 # 随机选取并删除2个
5. ZSet(有序集合)
排行榜实现命令
# 基础操作
ZADD rank:game 3000 "player1" 2500 "player2" # 添加分数
ZINCRBY rank:game 500 "player1" # 增加分数
ZREVRANGE rank:game 0 9 WITHSCORES # 获取TOP10# 热搜榜
ZINCRBY hot:202405 1 "华为发布会" # 热度增加
ZREVRANGE hot:202405 0 4 WITHSCORES # 前五热搜# 多日数据聚合
ZUNIONSTORE hot:week 7 hot:0501 hot:0502 ... hot:0507
ZREVRANGE hot:week 0 9 WITHSCORES # 周榜TOP10
6. Bitmap(位图)
签到系统命令
# 每日签到
SETBIT sign:202405:user1 1 1 # 第1天签到
GETBIT sign:202405:user1 1 # 检查是否签到# 统计操作
BITCOUNT sign:202405:user1 # 本月签到总数
BITPOS sign:202405:user1 1 # 首次签到日期# 批量统计
BITOP AND sign:202405:active sign:202405:user1 sign:202405:user2
7. HyperLogLog
UV统计命令
# UV统计
PFADD uv:20240501 user1 user2 user3 # 添加访问记录
PFCOUNT uv:20240501 # 统计独立访客# 多日合并统计
PFMERGE uv:week uv:0501 uv:0502 uv:0503
PFCOUNT uv:week # 周UV统计
8. Geo(地理空间)
附近商家命令
# 地理位置存储
GEOADD shops 116.404269 39.91582 "王府井店" 121.473701 31.230416 "上海店"# 距离计算
GEODIST shops "王府井店" "上海店" km # 计算距离# 附近搜索
GEORADIUS shops 116.40 39.91 5 km WITHDIST ASC COUNT 10 # 5km内最近10家
GEOSEARCH shops FROMMEMBER "王府井店" BYRADIUS 3 km # 王府井店3km范围
9. Stream(流)
消息队列命令
# 生产者
XADD orders * item "手机" price 5999 # 添加消息(*自动生成ID)# 消费者
XREAD COUNT 2 STREAMS orders 0-0 # 读取前2条
XREAD BLOCK 0 STREAMS orders $ # 阻塞监听新消息# 消费组
XGROUP CREATE orders order_group $ # 创建消费组
XREADGROUP GROUP order_group consumer1 COUNT 1 STREAMS orders > # 消费消息
XACK orders order_group 1640995200000-0 # 消息确认
数据结构选择矩阵:
场景 推荐结构 备选方案 对象缓存 Hash String(JSON) 排行榜 ZSet - 消息队列 Stream List 去重统计 Set/HyperLogLog - 签到系统 Bitmap Set 地理位置 Geo ZSet(GeoHash)
通过合理选择数据结构,可提升性能30%~50%!