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

Redis配置那些事儿,细节多到让你看得头大但超实用

主要参考自Redis官方文档、博客平台“阿里云开发者”的实践经验总结、以及技术社区“掘金”上的高赞配置解读文章)

咱们得明白,Redis装好就能用,但想让它在你自己的业务场景下跑得又快又稳,不折腾一下配置文件(通常是redis.conf)那是不可能的,这个文件里全是细节,一个个看下来确实头大,但改对了地方,效果立竿见影。

Redis配置那些事儿,细节多到让你看得头大但超实用

第一件大事:绑定的IP地址(bind) 默认配置经常是 bind 127.0.0.1,意思是只允许本机连接,你要是把Redis装在一台独立的服务器上,你的应用程序在另一台服务器上,那你的应用根本就连不上Redis!这时候你得把Redis服务器的内网IP地址加进去,bind 127.0.0.1 192.168.1.100,但这里有个大坑!参考阿里云开发者的警告:如果你直接写成 bind 0.0.0.0,虽然省事了,意味着允许所有IP连接,但这也太危险了,相当于把数据库大门敞开了,除非你前面有防火墙严格限制访问来源,否则千万别这么干,更安全的做法是绑定具体的内网IP,并配合密码认证。

说到密码,就得提认证(requirepass) 默认这一行是注释掉的,也就是没密码,这在生产环境是绝对不允许的,你得设置一个强密码,requirepass MySuperStrongPassword123!,设置了密码后,你的客户端连接时就必须先认证才能操作,不然,随便一个人只要能连接到你的Redis端口,就能看能改所有数据,想想都可怕。

Redis配置那些事儿,细节多到让你看得头大但超实用

然后是内存管理,这是重头戏(maxmemory) Redis是内存数据库,内存满了怎么办?默认配置是不设限制,这会导致Redis无限使用内存,最后可能把你的服务器内存吃光,引发系统崩溃,你必须根据服务器实际内存设置一个上限,maxmemory 2gb,光设上限还不够,还得指定内存满了之后的淘汰策略(maxmemory-policy),默认是 noeviction,意思是内存满了就拒绝所有写入操作,这虽然能保证现有数据不丢,但你的服务就不可写了,根据掘金上那篇高赞文章的建议,更常用的策略是 allkeys-lru,它会尝试淘汰最近最少使用的键,为新数据腾出空间,如果你的数据有冷热区分,这个策略很实用,如果有些数据设置了过期时间(TTL),也可以用 volatile-lru,只从设了过期时间的键里淘汰。

持久化配置,关乎数据安全 Redis有两种持久化方式:RDB和AOF,RDB是隔一段时间拍个快照,文件小,恢复快,但你可能担心万一两次快照之间宕机,数据会丢,配置里像 save 900 1 表示900秒内至少有1个键被改动就触发快照,你可以根据业务对数据丢失的容忍度调整这些时间点,AOF是记录 every write operation,数据安全级别更高,可以配置为每秒同步一次(appendfsync everysec),在性能和数据安全间取得平衡,但AOF文件会越来越大,官方文档建议是可以同时开启RDB和AOF,这样结合了两者的优点。

Redis配置那些事儿,细节多到让你看得头大但超实用

网络相关配置,影响连接效率 tcp-keepalive 这个参数,默认是300秒,它用来检测空闲连接是否还“活着”,如果设置得太小,可能会误杀健康的空闲连接;如果太大,网络出问题时,僵尸连接可能很久才被清理掉,一般保持默认或根据网络状况微调即可,还有 timeout,表示客户端空闲多少秒后关闭连接,默认是0(不关闭),在生产环境,为了避免连接数被空闲连接占满,可以设置一个合理的值,比如300秒。

慢查询日志(slowlog-log-slower-than) 这个功能超实用,用来记录执行时间超过指定微秒的命令,默认是10000微秒(10毫秒),对于高性能的Redis来说,一个命令执行10毫秒已经算很慢了,你可以把它调小,比如调到5毫秒甚至1毫秒,这样才能抓到那些潜在的性能瓶颈命令,比如发现某个复杂的KEYS操作(顺便说一句,生产环境禁止用KEYS *)或者大集合操作很慢,就能及时优化。

别忘了把守护进程模式打开(daemonize) 默认是 no,意思是Redis在前台运行,你关掉终端Redis就停了,生产环境必须设为 daemonize yes,让它在后台默默运行。

这些只是Redis配置里最常用也最关键的几个点,像主从复制、安全相关的命令重命名、Lua脚本执行限制等等,每一个展开又是一大片内容,配置Redis没有放之四海而皆准的模板,都得根据你的数据量、访问模式、硬件条件和安全要求来慢慢调整,虽然过程繁琐,但每调优一个参数,可能就是为线上避免了一次故障,这笔时间投资绝对是值得的。