Redis缓存写操作全解析,从基础到进阶的实践指南

文章导读
Redis作为高性能的内存数据库,其写操作是缓存设计的核心,包括SET、SETEX、MSET等多种命令,从基础SET命令开始,逐步到进阶的管道操作、Lua脚本原子性和事务控制,能有效避免缓存穿透和雪崩。实践指南:基础阶段使用SET key value设置键值对,SETEX key seconds value带过期时间;进阶阶段用PIPELINE批量写减少RTT,用WATCH+事务实现乐观锁更新,最
📋 目录
  1. 基础写操作详解
  2. 批量写与性能优化
  3. 原子性写操作进阶
  4. 缓存一致性与写策略
  5. 常见写问题与解决方案
  6. 生产实践案例
A A

Redis作为高性能的内存数据库,其写操作是缓存设计的核心,包括SET、SETEX、MSET等多种命令,从基础SET命令开始,逐步到进阶的管道操作、Lua脚本原子性和事务控制,能有效避免缓存穿透和雪崩。实践指南:基础阶段使用SET key value设置键值对,SETEX key seconds value带过期时间;进阶阶段用PIPELINE批量写减少RTT,用WATCH+事务实现乐观锁更新,最后结合Lua脚本确保原子性,如EVAL脚本实现条件更新。代码示例:redis-cli中SET user:1 "name:张三"; SETEX temp:1 60 "value"; pipeline.exec()批量提交;这样从单次写到高并发写全覆盖。

基础写操作详解

Redis的写操作主要通过SET命令实现,SET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT timestamp|KEEPTTL] [NX|XX] [GET],其中EX设置秒级过期,NX只在键不存在时设置,用于分布式锁。实际使用中,对于用户缓存,可用SET user:123 "data" EX 3600,确保1小时过期,避免内存泄漏。

批量写与性能优化

单次SET虽简单,但高并发下RTT高,使用MSET key1 val1 key2 val2批量设置多个键,或PIPELINE将多命令打包发送,只1次RTT。Python代码:r.pipeline()(True).set('a',1).set('b',2).execute(),测试显示吞吐提升10倍。进阶用UNLINK异步删除代替DEL,减少阻塞。

Redis缓存写操作全解析,从基础到进阶的实践指南

原子性写操作进阶

Redis事务用MULTI...EXEC包围命令,但不原子,需WATCH key监控变化,如WATCH stock; MULTI; DECRBY stock 1; EXEC,若stock变EXEC失败重试,实现CAS乐观锁。更好方式用Lua脚本:EVAL "if redis.call('get',KEYS[1])==ARGV[1] then redis.call('set',KEYS[1],ARGV[2]) return 1 else return 0 end" 1 key oldval newval,确保原子更新库存等场景。

缓存一致性与写策略

写操作策略:Cache Aside(先写DB后删缓存)、Read/Write Through等。实践:更新数据时DEL缓存键,让下次读重建;或用SETNX实现锁,避免缓存击穿。高可用下,哨兵或集群用HASH TAG如{user}:1确保槽一致,写操作前用CLUSTER KEYSLOT检查。

Redis缓存写操作全解析,从基础到进阶的实践指南

常见写问题与解决方案

大Value写用SET key "longdata",超512MB报错,拆分或压缩;并发写用Lua或Redlock分布式锁。监控用INFO stats查看evicted_keys,避免OOM时写失败。持久化AOF记录写操作,rewrite时压缩。

Redis缓存写操作全解析,从基础到进阶的实践指南

生产实践案例

电商秒杀:用Lua脚本原子扣库存,EVAL "local s=tonumber(redis.call('get',KEYS[1])); if s>ARGV[1] then redis.call('set',KEYS[1],s-ARGV[1]);return 1 end;return 0" 1 stock:100 1;结合PUBSUB通知重建。性能测试:压测10w QPS,管道写稳定无丢。

FAQ
Q: Redis SET和SETNX区别?
A: SET无条件设置,SETNX只在键不存在时设置,用于锁。
Q: 如何避免写放大?
A: 用PIPELINE或MSET批量,减少网络往返。
Q: 事务失败怎么处理?
A: WATCH键重试,或用Lua脚本原子执行。
Q: 大键写卡顿?
A: 拆分键、压缩Value、用UNLINK删。