黄光星带你揭开Redis里那些鲜为人知的芝麻级秘密,催熟你的理解和应用
- 问答
- 2026-01-23 10:58:38
- 2
黄光星在他的分享里提到,Redis虽然大家天天用,但有些细节就像藏在芝麻里的小秘密,不仔细看根本发现不了,他说,很多人以为Redis就是个缓存,但其实它肚子里的小机关可多了,你以为SET命令就是存个键值对?其实没那么简单,黄光星指出,Redis的SET命令有个NX和XX选项,NX是只有键不存在时才设置,XX是只有键存在时才设置(来源:黄光星公开技术讲座),这听起来简单,但实际用起来能避免很多坑,比如做分布式锁的时候,用SET key value NX EX 10,就能原子性地实现加锁和超时设置,不用像以前那样先SETNX再EXPIRE分两步走,避免了竞争条件,黄光星说,这个小技巧很多人没留意,结果代码里埋了雷。

再说说Redis的持久化,黄光星调侃道,很多人只知道RDB和AOF,但具体怎么选就蒙圈了,他打了个比方:RDB像拍照,定期拍个快照,恢复快但可能丢数据;AOF像写日记,每条命令都记下来,安全但文件大,秘密在于,Redis 4.0引入了混合持久化(来源:黄光星博客文章),重启时可以先加载RDB快照,再重放AOF增量,这样既保证速度又减少数据丢失,黄光星提醒,这个功能默认没开,得手动配置aof-use-rdb-preamble为yes,他见过不少团队因为没开这个,故障恢复时傻眼了。

还有键过期的事儿,黄光星说,Redis过期键的删除不是实时的,而是懒汉式加定期打扫,懒汉式是等你访问键时才检查过期;定期打扫是Redis每秒随机抽一些键看看是否到期(来源:黄光星在技术社群的问答),这就有个秘密:如果过期键太多又没人访问,它们可能占着内存不释放,黄光星建议,如果应用有大量过期键,最好用SCAN命令定期扫描清理,别等Redis自己慢吞吞处理,他分享了个案例:有个电商平台促销后库存键过期了但没及时删,内存居高不下,最后用脚本扫了一遍才解决。

管道(pipeline)功能,黄光星说很多人以为用了管道就万事大吉,但其实管道不保证原子性(来源:黄光星线上分享会),它只是把多个命令打包发送,减少网络往返,但中间可能被其他客户端命令插队,如果非要原子性,得用MULTI/EXEC事务,不过黄光星透露个小秘密:事务里的命令会排队执行,但遇到错误不会回滚——Redis事务没回滚机制!比如你DECR一个字符串键,Redis只会报错继续执行后续命令,这点坑过不少人,所以他用事务前都先测试好命令格式。
关于内存优化,黄光星提到了ziplist的妙用(来源:黄光星技术笔记),他说小数据用ziplist比hashtable省内存,比如哈希表元素少于512且值小于64字节时,Redis默认用ziplist存储,但很多人不知道,这个阈值可以配置,根据业务调整能省不少钱,他举例说,有个社交应用存用户资料,把hash-max-ziplist-entries调大后,内存降了30%,不过ziplist查询慢,得权衡利弊。
黄光星聊起Redis的慢查询日志(来源:黄光星答疑文档),他说日志里不光记录超时命令,还能看到命令参数,但默认只存128条,秘密在于,可以通过slowlog-log-slower-than设置阈值,比如10000微秒,再通过slowlog-max-len调整队列长度,他建议生产环境设大点,不然慢查询被覆盖了都发现不了,有次他们团队就是靠这个日志逮到一个O(N)的KEYS命令,换成SCAN后性能立马提升。
黄光星总结说,这些芝麻秘密看似小,但堆起来就能催熟你对Redis的理解,他鼓励大家多翻文档、多实验,别光会用GET/SET,毕竟,Redis的深度决定了你系统的稳定性。
本文由邝冷亦于2026-01-23发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://www.haoid.cn/wenda/84416.html
