当前位置:首页 > 问答 > 正文

Redis那些编程和运维的坑,书单推荐给你参考下吧

Redis那些编程和运维的坑

编程上的“坑”

  1. 键名设计太随意,后期维护头疼 很多人刚开始用Redis,随便起键名,key1, user,等业务复杂了,根本记不住哪个键是干什么的,来自《Redis开发与运维》的建议是,使用统一的命名规范,业务名:对象名:id:[属性]mall:user:1001:name,这样一看就知道是商城业务下ID为1001的用户的姓名,而且方便用 keys mall:user:* 模式匹配。

  2. 误用KEYS命令,线上服务被拖垮 这是一个非常经典的坑,Redis是单线程的,KEYS * 这个命令会一次性列出所有匹配的键,如果Redis里存了几百万个键,这个命令会阻塞住整个Redis服务器,导致所有其他请求超时,付磊在书中强调,线上环境绝对禁止使用KEYS,替代方案是使用SCAN命令,它虽然慢,但是非阻塞的,分批遍历,不会影响服务。

  3. 以为Redis是万能数据库,什么数据都往里塞 Redis很快,但内存很贵,有些人把整个用户对象、大篇文章、甚至图片的Base64编码都往Redis里塞,很快内存就报警了。《Redis深度历险》指出,Redis应该用来存热数据(频繁访问的数据)和小数据,大的、不常访问的数据应该存在MySQL等数据库中,要时刻记得数据过期时间(TTL)的设置。

    Redis那些编程和运维的坑,书单推荐给你参考下吧

  4. 忘记设置过期时间,导致内存泄漏 很多临时数据,比如短信验证码、会话Session,存进去的时候想着用完就删,但代码逻辑可能出问题,忘了删除,这些数据就永远留在内存里了,成了“僵尸数据”,最终撑爆内存,只要可能,就给键设置一个过期时间,让Redis自动清理。

  5. 事务陷阱:它不像数据库事务 Redis的事务(MULTI/EXEC)没有回滚(Rollback)功能,如果在事务队列中有命令执行失败了,Redis不会自动撤销之前成功的命令,它会继续执行后面的命令,老钱在他的博客里提到,这要求开发者必须保证入队的每条命令语法都是正确的,否则后果需要自己承担。

  6. 持久化误区:配置不当导致数据丢失 很多人以为开了持久化(RDB或AOF)就高枕无忧了,其实不然,比如默认的RDB策略可能几分钟才保存一次,如果在这期间服务器宕机,就会丢失这几分钟的数据,AOF的同步策略如果设置为每秒一次(appendfsync everysec),也可能丢失1秒的数据。《Redis开发与运维》详细解释了不同配置的权衡,需要根据业务对数据安全性的要求来谨慎选择。

运维上的“坑”

Redis那些编程和运维的坑,书单推荐给你参考下吧

  1. 内存耗尽,后果很严重 这是最危险的坑,当Redis所用内存超过maxmemory限制时,会根据配置的淘汰策略(maxmemory-policy)来删除数据,如果策略没配好,比如默认的noeviction(不淘汰),那么写请求会直接报错,读请求正常,服务相当于半瘫痪,必须根据业务重要性,提前配置好合适的淘汰策略,比如淘汰最久未使用的键(LRU)。

  2. 网络带宽成为瓶颈 只顾着提升Redis本身性能,却忘了网络,如果Redis实例和应用服务器不在同一台机器上,当需要频繁读取大量数据(比如一个包含几万元素的Set)时,网络传输可能成为最慢的一环,钱文品在书中建议,要警惕大Key( value很大的键)的产生,它们会严重消耗带宽。

  3. 持久化操作引发停顿 RDB持久化需要fork一个子进程来生成快照,如果Redis内存很大(比如几十GB),fork操作本身可能会因为复制父进程的内存页表而短暂阻塞主进程(虽然现在用写时复制技术好了很多,但仍有影响),AOF重写同样如此,这可能导致服务有几百毫秒甚至上秒的延迟,运维时需要监控这些操作对服务的影响。

  4. 主从复制配置不当 主从架构中,如果从节点挂掉一段时间后重启,它会尝试全量同步主节点的数据,如果主节点数据量很大,这个同步过程会占用大量主节点的网络带宽,可能影响主节点对外提供服务,如果主节点宕机,需要手动或通过哨兵(Sentinel)进行故障切换,如果自动化没做好,会导致服务长时间不可用。

    Redis那些编程和运维的坑,书单推荐给你参考下吧

  5. 安全配置疏忽 很多开发为了省事,直接把Redis暴露在公网上,并且没有设置密码(requirepass),这是极其危险的,攻击者可以轻易连上你的Redis,清空你的数据,甚至利用Redis漏洞在服务器上执行任意命令(提权攻击)。《Redis开发与运维》强烈建议,Redis必须设强密码,并尽可能限制可访问的IP地址。

书单推荐给你参考下吧

  1. 《Redis开发与运维》 by 付磊,张益军 来源标注:这本书是很多国内Redis使用者的入门和进阶宝典。 推荐理由:这本书非常全面和实用,一半讲开发(数据类型、命令、客户端),一半讲运维(持久化、复制、集群、监控),书中包含了大量作者在美团点评大规模使用Redis的实际案例和踩坑经验,语言平实,问题导向,非常适合从入门到实践的工程师,上面提到的很多“坑”在书中都有详细解释和解决方案。

  2. 《Redis深度历险:核心原理与应用实践》 by 钱文品(老钱) 来源标注:作者是资深技术专家,网名“老钱”,有非常丰富的缓存架构经验。 推荐理由:这本书的特点是“深度”,它不止告诉你怎么用,更花大量篇幅讲清楚Redis内部的核心原理,比如线程模型、数据结构实现、持久化机制、哨兵和集群的原理等,理解了原理,你才能更好地预见和规避那些“坑”,文风生动,用很多有趣的比喻来解释复杂概念,读起来不枯燥。

  3. 《Redis设计与实现》 by 黄健宏 来源标注:这本书被誉为理解Redis源码的“圣经”。 推荐理由:如果你想深入到底层,搞清楚Redis的每一行代码(用C语言写的)是怎么工作的,那就看这本,它详细剖析了Redis的数据结构、数据库实现、RDB/AOF文件格式等,虽然相对硬核,但对于想成为Redis专家或者进行二次开发的工程师来说,是不可多得的好书,可以先看前面两本打好基础,再看这本。

  4. 官方文档(Redis Documentation) 来源标注:这是最权威、最及时的信息来源。 推荐理由:无论什么书,其内容都基于某个版本的Redis,而Redis本身在快速迭代,新功能、新命令不断加入,官方文档永远是最新、最准确的,养成遇到问题先查官方文档的习惯,能避免很多因为信息过时导致的错误,它的命令参考部分尤其有用,对每个命令的复杂度、返回值、例子都有清晰说明。