Redis用了很多年,但很多人对它的配置只停留在"改个端口、设个密码"的层面。实际上Redis的配置项非常多,调好了性能翻倍,调不好各种问题。

Redis 7.2发布之后,有些配置项有了变化,也新增了一些功能。这篇文章从基础到高级,系统梳理一下核心配置,希望能帮你更好地使用Redis。

基础配置

先从最基础的说起。

网络配置是第一步。bind决定了Redis监听哪些网卡,默认是127.0.0.1,只能本机访问。如果需要远程访问,要改成对应的IP或者0.0.0.0,但一定要配合密码和防火墙,不然就是裸奔。port是端口,默认6379,生产环境建议改一下,减少被扫描的概率。

timeout是客户端空闲超时时间,默认是0,也就是永不超时。生产环境建议设一个合理的值,比如300秒,不然空闲连接一直占着,连接数会越来越多。

tcp-keepalive也建议设一下,比如60秒。这样能检测到死连接,及时释放资源。

maxclients是最大客户端连接数,默认10000。根据服务器的文件描述符限制来设,不要设得超过系统限制。

内存配置

内存配置是Redis的重中之重。

maxmemory是最关键的配置,决定了Redis能用多少内存。不设的话Redis会吃光所有内存,最后被OOM Killer干掉。生产环境一定要设,一般设成服务器内存的60%到70%,留一些给系统和其他进程。

maxmemory-policy是内存淘汰策略,当内存达到上限时,Redis按什么规则淘汰数据。可选的策略有好几种,最常用的是allkeys-lru,淘汰最近最少使用的所有key。如果有一些key是不能丢的,可以用volatile-lru,只淘汰设了过期时间的key。

7.2版本对LRU算法有优化,淘汰的精准度比老版本更好。还有一个新的策略是allkeys-lfu,按使用频率淘汰,适合访问频率差异大的场景。

maxmemory-samples是淘汰时采样的数量,默认5。设得越大淘汰越精准,但CPU消耗也越高。一般用默认值就够了,对淘汰精准度要求高的话可以调到10。

持久化配置

Redis是内存数据库,持久化决定了宕机之后能恢复多少数据。

RDB是快照持久化,在指定时间点把内存数据写到磁盘文件里。配置方式是save指令,比如"save 900 1"表示900秒内至少有1个key变化就触发快照。RDB的优点是文件小、恢复快,缺点是可能丢失最后一次快照之后的数据。

AOF是追加持久化,把每条写命令都记录下来。appendonly设为yes开启。AOF的优点是数据更安全,最多丢一秒的数据,缺点是文件大、恢复慢。

appendfsync是AOF的刷盘策略,有三个选项:always每条都刷,最安全但最慢;everysec每秒刷一次,是默认值,平衡了安全和性能;no由操作系统决定,最快但最不安全。生产环境一般用everysec。

7.2版本对AOF有优化,支持了多线程AOF重写,重写的时候对性能的影响更小了。

我的建议是,对数据安全要求高的场景,RDB和AOF都开。RDB做冷备,AOF做实时恢复。两者结合,既保证了恢复速度,又保证了数据安全。

主从复制配置

主从复制是高可用的基础。

replicaof指定主节点的地址和端口,从节点启动后会自动同步主节点的数据。注意7.2版本把slaveof改成了replicaof,老的配置项还能用但已经废弃了。

replica-read-only设为yes,从节点只读,这是默认值也是推荐值。从节点只用来读,写操作都走主节点,避免数据不一致。

repl-diskless-sync是无磁盘复制,主节点直接把RDB发送给从节点,不写本地磁盘。在磁盘慢但网络快的环境下,这个选项能提升同步速度。7.2版本对这个功能有改进,更稳定了。

repl-backlog-size是复制积压缓冲区的大小,默认1mb。如果主从之间网络不稳定,或者从节点经常短暂断开,可以调大这个值,比如64mb或者128mb,这样从节点重连的时候可以部分同步,不用全量同步。

集群配置

Redis Cluster是官方的分布式方案。

cluster-enabled设为yes开启集群模式。开启之后,数据会自动分片到多个节点,每个节点负责一部分slot。

cluster-config-file是集群配置文件的名字,这个文件是Redis自动维护的,不要手动编辑。每个节点要有自己独立的配置文件。

cluster-node-timeout是节点超时时间,默认15秒。如果一个节点超过这个时间没响应,就认为它挂了。网络不稳定的环境可以调大一点,但太大了故障转移就慢了。

cluster-require-full-coverage设为no的话,部分slot不可用时集群还能继续服务剩下的slot。默认是yes,只要有一个slot不可用整个集群就只读。生产环境建议设为no,提高可用性。

集群模式下,key的设计很重要。相关的key要放在同一个slot里,可以用hash tag来实现,比如{user1}:name和{user1}:age会被分到同一个slot。

安全配置

安全是最容易被忽略但最重要的。

requirepass设置密码,客户端连接后要先AUTH。生产环境一定要设,而且密码要足够复杂。

rename-command可以重命名或者禁用危险命令,比如把FLUSHALL、CONFIG、KEYS这些命令重命名成复杂的名字,或者直接禁用。这能防止误操作或者恶意攻击。

protected-mode是保护模式,默认开启。如果没有设密码也没有绑定IP,Redis只允许本机访问。这个功能很有用,不要随便关掉。

还有一点,不要把Redis暴露在公网上。即使设了密码,也不要直接让公网访问。用防火墙限制来源IP,或者放在内网通过VPN访问。

性能优化配置

最后说几个性能相关的配置。

lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-server-del这三个选项,设为yes之后,淘汰、过期、删除大key的时候会用异步线程,不会阻塞主线程。生产环境建议都打开。

io-threads是IO线程数,7.2版本对多线程IO有优化。设成CPU核心数减一比较合适,但不要超过8。开启多线程IO之后,读性能会有明显提升。

hash-max-ziplist-entries和hash-max-ziplist-value控制hash结构使用ziplist编码的阈值。小的hash用ziplist更省内存,但太大了性能会下降。根据业务数据的特点调整这两个值。

activedefrag是主动碎片整理,开启后Redis会自动整理内存碎片。内存碎片率高的时候可以打开,但会消耗一些CPU。7.2版本的碎片整理算法有改进,比以前更高效了。

写在最后

Redis的配置项很多,这篇文章只覆盖了最核心的部分。实际使用的时候,还是要根据业务场景和服务器配置来调整,没有万能的配置。

我的建议是,先搞清楚每个配置项的含义,再在测试环境里实验,确认没问题了再上生产。Redis的官方文档写得很详细,遇到不确定的配置,先查文档再改。

配置不是一劳永逸的。业务在变,数据在涨,配置也要跟着调整。定期监控Redis的内存、命中率、响应时间这些指标,发现问题及时调整配置,才能让Redis一直保持好的状态。