Redis实战之7种数据结构

  1. 字符串(String):不只是存文本

常用命令:

bash 复制代码
# 基础操作
SET user:1001 "张三"           # 设置值
GET user:1001                 # 获取值
DEL user:1001                 # 删除键

# 高级操作
INCR article:view:20240301    # 自增1(统计阅读量)
INCRBY article:view:20240301 10 # 自增10
SETEX captcha:135xxxx1234 300 "3845" # 5分钟过期

实战场景: 验证码、计数器、简单缓存

  1. 列表(List):消息队列的简单实现

常用命令:

bash 复制代码
# 模拟消息队列
LPUSH order:queue "订单1001"   # 左侧插入
RPOP order:queue              # 右侧取出(队列)
# 或
RPUSH order:queue "订单1001"   # 右侧插入
LPOP order:queue              # 左侧取出(栈)

# 其他操作
LRANGE order:queue 0 10       # 查看前10个
LLEN order:queue              # 获取长度

实战场景: 最新消息列表、简单任务队列

  1. 集合(Set):去重和关系运算

常用命令:

bash 复制代码
# 用户标签系统
SADD user:1001:tags "科技" "编程" "Java"
SADD user:1002:tags "科技" "旅游" "摄影"

# 查找共同兴趣
SINTER user:1001:tags user:1002:tags # 交集:"科技"
SUNION user:1001:tags user:1002:tags # 并集
SISMEMBER user:1001:tags "编程"      # 是否包含

实战场景: 标签系统、共同好友、抽奖去重

  1. 哈希表(Hash):存储对象的最佳选择

常用命令:

bash 复制代码
# 存储用户对象
HSET user:1001 name "张三" age 28 city "北京"
HGET user:1001 name                   # 获取字段
HGETALL user:1001                     # 获取所有
HINCRBY user:1001 age 1               # 年龄+1
HMSET user:1002 name "李四" age 25 city "上海" # 批量设置

实战场景: 用户信息、商品信息、配置存储

  1. 有序集合(ZSet):排行榜的核心

常用命令:

bash 复制代码
# 游戏排行榜
ZADD game:ranking 5000 "玩家A" 4800 "玩家B" 5200 "玩家C"
ZREVRANGE game:ranking 0 9 WITHSCORES # 前10名(带分数)
ZRANK game:ranking "玩家A"            # 查看排名
ZINCRBY game:ranking 100 "玩家A"      # 增加100分

# 时间范围查询
ZADD user:login 1740825600 "1001"    # 时间戳为分数
ZRANGEBYSCORE user:login 1740825600 1740912000 # 24小时内登录

实战场景: 实时排行榜、延迟队列、时间轴

  1. 发布订阅(Pub/Sub):实时消息系统

常用命令:

bash 复制代码
# 终端1:订阅频道
SUBSCRIBE news:sports news:tech

# 终端2:发布消息
PUBLISH news:sports "中国队夺冠!"
PUBLISH news:tech "Redis 7.0发布"

# 模式订阅
PSUBSCRIBE news:*  # 订阅所有news开头的频道

实战场景: 实时通知、聊天室、系统事件广播

  1. 数据过期策略:自动清理

实用命令:

bash 复制代码
# 设置过期时间
SET session:token "abc123"
EXPIRE session:token 3600      # 1小时后过期
TTL session:token              # 查看剩余时间

# 直接设置带过期时间的键
SETEX cache:data 300 "value"   # 5分钟过期

实战问题

问题1:Redis为什么快?

回答要点:内存操作、单线程避免上下文切换、IO多路复用

问题2:缓存穿透/雪崩/击穿怎么解决?

· 穿透:布隆过滤器

· 雪崩:随机过期时间

· 击穿:互斥锁或永不过期热点数据

问题3:选择合适的数据结构

bash 复制代码
# 场景分析:
用户会话 -> String(简单键值)
购物车 -> Hash(字段频繁更新)
好友关系 -> Set(去重和集合运算)
消息时间线 -> ZSet(按时间排序)

性能优化小贴士

  1. 键名设计:业务:类型:id(如 user:info:1001)
  2. 批量操作:使用Pipeline减少网络往返
  3. 内存控制:设置maxmemory和淘汰策略
  4. 连接复用:使用连接池

快速参考卡片

结构 特点 适用场景

String 简单键值 缓存、计数器

List 有序可重复 消息队列、最新列表

Set 无序去重 标签、共同好友

Hash 字段操作 对象存储、配置

ZSet 有序带分数 排行榜、优先级队列

Pub/Sub 发布订阅 实时通知、聊天

记住:根据业务场景选择数据结构,而不是硬套模式。一个精心选择的数据结构,胜过复杂的代码逻辑!

相关推荐
5***84642 小时前
Spring Boot的项目结构
java·spring boot·后端
SimonKing2 小时前
基于Netty的TCP协议的Socket客户端
java·后端·程序员
程序员飞哥2 小时前
几年没面试,这次真的被打醒了!
java·面试
Learner2 小时前
Python异常处理
java·前端·python
tao3556672 小时前
VS Code登录codex,报错(os error 10013)
java·服务器·前端
信创天地2 小时前
核心系统去 “O” 攻坚:信创数据库迁移的双轨运行与数据一致性保障方案
java·大数据·数据库·金融·架构·政务
mjhcsp2 小时前
C++ AC 自动机:原理、实现与应用全解析
java·开发语言·c++·ac 自动机
huihuihuanhuan.xin2 小时前
后端八股之java并发编程
java·开发语言
茶本无香2 小时前
设计模式之二—原型模式:灵活的对象克隆机制
java·设计模式·原型模式