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

Redis配置怎么调才顺手,查询设置那些坑和技巧分享

说到Redis配置,很多人一开始都是直接用默认配置,结果用着用着就发现不对劲了,要么是内存莫名其妙满了,要么是偶尔卡一下,或者数据莫名其妙就消失了,其实想把Redis调顺手,避开那些坑,真不用成为专家,记住几个关键点就行。

第一大坑:内存管理,别等爆了再哭

Redis最核心的资源就是内存,内存满了是所有问题的根源,默认配置下,如果内存用完了,再有新的写入命令,Redis就直接报错了,这很可能导致整个服务挂掉,你得主动设置内存上限,在配置文件里找到 maxmemory 这个参数,根据你服务器的实际内存设一个值,比如服务器有8G,你留给Redis 6G,那就设成 6gb,关键来了,光设上限还不够,还得告诉Redis内存快满的时候怎么办,这就是 maxmemory-policy 参数,它有几种策略,你得挑个合适的。

  • noeviction:这是默认值,就是内存满了就报错,不推荐。
  • allkeys-lru:这是最常用、最省心的策略,它会尝试淘汰掉最近最少使用的键,管你这个键有没有设过期时间,都可能被淘汰,适合那种你希望所有数据都能被自动管理的场景。
  • volatile-lru:只淘汰那些设置了过期时间的键中,最近最少使用的,如果你有些关键数据是永久有效的,可以用这个策略保护一下。
  • allkeys-random:随机淘汰,这个不太智能,除非你明确知道你的访问是绝对随机的,否则不推荐。
  • volatile-ttl:淘汰那些设置了过期时间,并且剩余寿命最短的键,这个策略比较有意思,能更快地清理掉快过期的数据。

根据IBM开发者社区的一篇文章建议,对于大多数应用场景,使用 allkeys-lru 策略是一个稳妥的选择,你得根据自己的业务特点来选,比如你的数据是不是有冷热区分,有没有绝对不能丢的核心数据。

第二大坑:持久化配置,关乎数据安全

Redis虽然快,但它是内存数据库,一断电数据就没了,所以要把数据存到硬盘上,这叫持久化,Redis有两种持久化方式:RDB和AOF。

  • RDB:就像是给数据库拍一张快照,你可以配置隔多长时间、有多少次写操作就拍一次快照。save 900 1 表示900秒内至少有1个键被改动就拍一次,RDB的优点是恢复速度快,文件也小,但缺点是可能会丢失最后一次快照之后的数据。
  • AOF:像是写日记,把每一个写命令都记录下来,这样数据安全性高很多,最多损失一秒的数据(如果你配置了 appendfsync everysec),但缺点是文件会越来越大,恢复起来慢。

很多人纠结用哪个,其实可以两个都开启,用混合持久化,这是Redis后期版本的一个好功能,在AOF重写的时候,会先把当前数据用RDB格式存下来,然后再增量记录新的写命令,这样既保证了安全,恢复速度也快,记得检查 aof-use-rdb-preamble 这个配置项是不是 yes

第三大坑:慢查询,性能的隐形杀手

有时候你觉得Redis变慢了,但又找不到原因,很可能是遇到了慢查询,Redis提供了一个慢查询日志功能,能帮你抓到那些执行时间过长的命令,你需要关注两个参数:

  • slowlog-log-slower-than:单位是微秒,默认是10000微秒(10毫秒),意思是执行时间超过10毫秒的命令就算慢查询,会被记录下来,对于高性能要求的场景,这个值可以设得更小,比如1毫秒甚至更低。
  • slowlog-max-len:这个列表最多能存多少条慢查询记录,默认是128,有点少,建议设大一点,比如1000,防止有用的记录被顶掉。

定期用 SLOWLOG GET 命令看看慢查询日志,你可能会发现一些意想不到的问题,比如有人在生产环境执行 KEYS * 这种会阻塞整个服务的命令,或者有些复杂查询没用好索引。

一些让你更顺手的小技巧

  1. 给键设置过期时间:这是个好习惯,不仅能自动清理不用的数据节省内存,也是一种数据安全的措施,用 EXPIRE 命令或者SET命令直接带过期时间参数。
  2. 避免大键:一个键对应的value值太大,比如一个list里存了几十万条数据,在进行操作时可能会阻塞Redis很久,尽量把大对象拆成多个小键。
  3. 谨慎使用危险命令:像 KEYSFLUSHALL 这种命令,在生产环境一定要禁用或者重命名,可以在配置文件中用 rename-command 给它们换个特别复杂的名字,rename-command KEYS "” 直接禁用,或者 rename-command FLUSHALL “A_VERY_COMPLEX_PASSWORD123”
  4. 调整TCP backlog:如果你的应用连接Redis经常超时或者连不上,可以看看 tcp-backlog 这个参数,默认是511,在高并发场景下可能不够,可以适当调大,比如1024,但也要同步调整操作系统的 somaxconn 参数。

调Redis配置不是一劳永逸的事,你得结合自己的业务量、数据特点和服务器资源,边用边观察,最重要的就是管好内存、配好持久化、监控慢查询,这几步做到了,Redis用起来就顺手多了。

Redis配置怎么调才顺手,查询设置那些坑和技巧分享