Redis的核心数据结构包括String、List、Set、Hash、Sorted Set和Bitmap等,这些结构在数据库优化中应用广泛。比如在缓存用户session时,用String类型简单高效;在排行榜场景,用Sorted Set按分数排序实时更新数据。实战中,结合GEO位置服务,可以快速查询附近用户,实现外卖推荐或打车匹配。优化技巧:用管道批量操作减少网络往返,设置key过期时间避免内存爆炸。通过这些,数据库查询速度可提升10倍以上,是优化必读。
Redis String 类型详解
String 是 Redis 最简单的数据结构,实际上是字节数组,可以存储字符串、整数或序列化对象。最大容量 512MB,常用于缓存、计数器、分布式锁。实战场景:网站访问计数用 INCR 命令原子递增;session 存储用 SETEX 设置过期时间自动清理;分布式锁用 SETNX + EXPIRE 实现互斥。优化点:避免大 key,用 hash 分片存储大对象。
Redis List 队列应用
List 是一个双向链表,支持从两端推入弹出元素,完美实现队列和栈。常见场景:消息队列用 LPUSH + BRPOP 阻塞读取;最新新闻列表用 LPUSH + LTRIM 保持固定长度;任务队列处理异步任务。实战中,电商订单处理用 List 作为待处理队列,消费者多进程消费提高吞吐。注意:List 不适合随机访问,用时评估数据规模。
Redis Hash 对象存储
Hash 像一个 mini dict,field-value 存储,适合存对象属性。比 String 序列化更省空间。场景:用户信息存储,HSET user:100 name 张三 age 25;购物车 HSET cart:100 goods:1 2。优化数据库:热点数据全放 Redis,减少 MySQL 压力。HINCRBY 原子更新库存计数器,防止超卖。
Redis Set 去重集合
Set 是无序不重复集合,支持交并差运算。标签系统用 SADD 添加,SINTER 求共同标签推荐;抽奖去重用 SISMEMBER 检查中奖。实战:实时统计访问 IP 用 SADD,SINTER 找共同访客。比 List 高效,避免重复元素浪费空间。
Redis Sorted Set 排行榜
Sorted Set 带分数的集合,按分数自动排序。游戏排行 ZADD score 100 player1,ZRANGE 0 9 获取前10。电商热销榜 ZINCRBY 销量+1。支持范围查询 ZRANGEBYSCORE,高效分页。优化:用多 ZSet 分段存储海量数据。
Redis GEO 地理位置
GEO 基于 Sorted Set 存储经纬度,用 GEOADD 添加位置,GEORADIUS 查询半径内点,实现 LBS 服务。外卖 APP GEORADIUS china 116.3 39.9 5000 km 返回5km内商家。距离计算精确,结合 ZRANGE 排序最近优先。实战提升用户体验,数据库优化神器。
Redis 缓存策略实战
缓存穿透:用布隆过滤器预判不存在 key;缓存击穿:加互斥锁单线程加载;雪崩:随机过期时间+热点降级。写策略:Cache Aside 先更新缓存再数据库;读策略:先查缓存 miss 回源。结合 Lua 脚本原子执行多命令,确保一致性。实际项目中,QPS 从 1000 升到 50000。
FAQ
Q: Redis 适合存哪些数据?
A: 小型结构化数据如 session、配置、排行,热点读多写少场景。
Q: 如何避免 Redis 内存不足?
A: 设置 maxmemory 和淘汰策略如 allkeys-lru,监控 bigkey。
Q: Redis 和 MySQL 如何协作?
A: 读热点数据放 Redis,双写一致用 Canal 同步或延迟双删。
Q: GEO 如何提高查询效率?
A: 预计算附近点,用 pipeline 批量查询,结合 Sorted Set 排序。
Q: 分布式锁怎么实现?
A: 用 SET key value NX PX 30000,解锁用 Lua 脚本判断 value 匹配。