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

Redis配置那些事儿,聊聊常用又实用的最佳设置经验分享

说到Redis配置,很多人一开始会觉得头疼,配置文件里选项一大堆,全是英文缩写,看着就晕,但其实不用怕,咱们今天就不讲那些高深莫测的原理,就聊聊在实际项目中,哪些设置是真正常用、实用,能帮你避免踩坑的。

第一件大事:内存管理,别让Redis“撑死”了

Redis最快,但它的强项是基于内存的,内存是有限的,而数据可能是无限的,你要是放任不管,Redis会用光所有内存,然后开始报错,或者直接被系统给“杀掉”,配置内存限制是头等大事。

在配置文件里,找到 maxmemory 这个参数,比如你服务器有8G内存,你打算分4G给Redis,就设成 maxmemory 4gb,光设上限还不够,关键是内存快满的时候,怎么办?这就涉及到 maxmemory-policy 这个策略了。

(来源:Redis官方文档关于内存管理的章节)这里有几个最常用的策略,你根据业务选一个:

  • volatile-lru:这是最常用的,它只对那些设置了过期时间(TTL)的键进行清理,挑最近最少使用的(LRU)那些键删除,适合你的业务里大部分数据都设置了过期时间的情况。
  • allkeys-lru:不管有没有设置过期时间,从所有键中挑最近最少使用的删除,如果你的业务需要缓存所有数据,但有些数据不重要可以丢,就用这个。
  • volatile-ttl:在设置了过期时间的键中,挑那些剩余寿命最短的优先删除。
  • noeviction:不删除任何数据,当内存不够时,新写入的操作会报错,这个策略最“保守”,除非你确定你的数据绝对不能丢,否则一般不用,因为会导致服务不可用。

我的经验是,对于常规缓存场景,用 volatile-lru 准没错,先把内存上限和淘汰策略配好,你的Redis就基本不会因为内存问题崩掉了。

Redis配置那些事儿,聊聊常用又实用的最佳设置经验分享

第二件大事:数据持久化,怎么选?RDB还是AOF?

Redis的数据是在内存里的,万一服务器重启或者宕机,数据就全没了,所以需要把内存数据存到硬盘上,这个过程叫持久化,Redis提供了两种主要方式:RDB和AOF。

  • RDB(快照):就像是给数据库拍一张完整的照片,你可以配置隔多长时间、有多少次写操作就自动拍一张快照。save 900 1 意思是900秒内如果至少有1个键被改变,就拍快照,RDB的优点是恢复大数据集时速度很快,文件也比较紧凑,缺点是可能会丢失最后一次快照之后的数据(比如你设置5分钟拍一次,服务器在第4分59秒宕机,这5分钟的数据就没了)。
  • AOF(追加日志):它不拍照片,而是把每一个写命令都记录到一个日志文件里,当Redis重启时,就把这个日志里的命令重新执行一遍,来恢复数据,AOF的优点是数据安全性高,最多丢失1秒的数据(可以配置),缺点是日志文件通常会比RDB文件大,而且恢复速度慢。

(来源:Redis官方文档关于持久化的章节)那到底用哪个呢?给你个实用的建议:

Redis配置那些事儿,聊聊常用又实用的最佳设置经验分享

  • 如果你对数据安全要求非常高,不能容忍任何数据丢失:就用AOF,配置 appendonly yesappendfsync everysec(每秒同步一次,在性能和数据安全间取得平衡)。
  • 如果你追求更快的重启速度,并且可以容忍丢失几分钟的数据:就用RDB。
  • 最保险的做法是两者都开启:用RDB做定期的冷备份,用AOF来保证数据不丢失,这是生产环境很多人的选择。

第三件大事:安全设置,别让Redis“裸奔”

千万别小看这个!很多新手图省事,装好Redis就直接用,这是非常危险的,你的Redis可能被黑客攻击,用来挖矿或者清空数据。

(来源:众多安全事件报告总结)最起码要做两件事:

  1. 设置密码:在配置文件里找到 requirepass,设一个复杂的密码,这样客户端连接时就必须先认证。
  2. 禁止外网访问:找到 bind 配置,默认是 bind 127.0.0.1,意思是只允许本机连接,如果你需要从其他服务器访问,可以绑定内网IP,bind 192.168.1.100 127.0.0.1,但千万不要改成 bind 0.0.0.0 让全世界都能连!

第四件大事:一些零碎但实用的小贴士

  • 给键设置过期时间:这是好习惯,无论是用 EXPIRE 命令,还是在写入时直接用 SET key value EX seconds,避免产生永远不死的“僵尸”数据,慢慢占满内存。
  • 慢查询日志:Redis可能变慢,怎么排查?用 slowlog-log-slower-than 参数,比如设置成10000(单位是微秒,即10毫秒),所有执行时间超过10毫秒的命令都会被记录下来,你用 SLOWLOG GET 命令就能查看是哪些操作慢了,针对性优化。
  • 最大客户端连接数maxclients 默认是10000,一般够用,但如果你的应用连接数异常多,可以适当调大,防止连接被拒绝。

配置Redis不用面面俱到,抓住核心几点就行:管好内存、定好持久化策略、做好安全防护,先把这几样配稳妥了,你的Redis就打下了坚实的基础,后续再根据具体业务需求去微调其他参数。