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

Redis性能提升那些配置技巧和实操经验分享,帮你优化运行效率

说到提升Redis的性能,其实有很多简单直接的办法,不用太深究那些复杂的概念,这些方法大多来自Redis官方文档的建议,以及很多开发者在实际项目中摸爬滚打总结出的经验。

别让内存拖后腿:优化内存就是优化性能

Redis最快的时候,就是所有数据都在内存里的时候,一旦内存不够用,Redis就要开始折腾了,性能会急剧下降。

  1. 设置最大内存,并选择合适的淘汰策略 这是最基本也最重要的一步,你必须在配置文件(redis.conf)里用 maxmemory 参数给Redis设一个内存上限,不然,它可能会吃光你服务器的所有内存,导致系统崩溃。 光设上限还不够,还得告诉Redis内存满了之后怎么办,这就是“内存淘汰策略”,用 maxmemory-policy 设置,根据官方文档,常用的有几种:

    • volatile-lru:这是最常用的,它只从那些设置了过期时间(TTL)的键中,挑最近最少使用的淘汰掉,如果你的数据有些重要、有些不重要,给不重要的数据设个过期时间,然后用这个策略就很合适。
    • allkeys-lru:如果所有数据都可能被淘汰,就用这个,它从所有键中淘汰最近最少使用的。
    • volatile-ttl:从设置了过期时间的键中,挑剩余寿命最短的淘汰。
    • noeviction:这是默认策略,但生产环境基本不能用!它表示内存一满,任何写命令都会报错,只允许读操作,这很容易导致服务不可用。 根据Antirez(Redis之父)在博客中的建议,对于大多数情况,使用 allkeys-lru 策略是个比较稳妥的选择。
  2. 让数据变得更“瘦”:精简键值对 存东西之前,先想想能不能让它变小点。

    • 缩短Key的名字:Key是字符串,也占内存,别用 user:1000:profile:name 这么长的,用 u:1000:p:n 也能看懂,但省了不少空间,要在可读性和大小之间平衡。
    • 压缩Value:如果Value是大的文本(比如HTML、JSON),可以考虑在存入前用Gzip、Snappy等算法压缩一下,取出来再解压,这用一点CPU时间换来了巨大的内存节省,在网络传输上也更快,很多互联网公司在对大数据块存储时都会这么做。
    • 使用更高效的数据结构:比如存储一堆真假值,可以用Redis的Bitmap(位图)来代替一堆单独的字符串键,能节省极多的内存,HyperLogLog用来做基数统计,也只需要很小的空间。

不让持久化成为性能瓶颈

Redis性能提升那些配置技巧和实操经验分享,帮你优化运行效率

Redis为了数据不丢,提供了RDB快照和AOF日志两种持久化方式,但如果配置不当,它们会严重拖慢Redis。

  1. RDB配置技巧 RDB是某个时间点的全量数据快照。

    • 避免频繁快照:默认配置可能每分钟保存一次快照(如果数据有变化),如果数据量大,每次生成RDB文件会fork一个子进程,可能导致Redis主进程短暂停顿,可以根据业务重要性调整 save 配置,比如改成5分钟或15分钟一次,在《Redis设计与实现》一书中也提到,fork操作在数据量大时会有延迟。
    • 放在高速磁盘:RDB文件生成后要写入磁盘,如果磁盘IO速度慢,也会阻塞进程,确保Redis的数据目录在一个IO性能好的磁盘上(比如SSD)。
  2. AOF配置技巧 AOF记录每一个写操作,更安全但通常更慢。

    • 调整刷盘策略appendfsync 这个配置是关键。
      • always:每个写命令都刷盘,最安全,但慢得没法用,除非你对数据丢失零容忍。
      • everysec:每秒刷一次盘,这是默认值,也是性能和安全的良好折衷,最多丢失1秒数据,绝大多数场景都用这个。
      • no:让操作系统决定何时刷盘,性能最好,但可能丢失较多数据。
    • 重写AOF:AOF文件会越来越大,Redis提供了 BGREWRITEAOF 命令来重写一个更精简的版本,要设置自动重写的触发条件(auto-aof-rewrite-percentageauto-aof-rewrite-min-size),避免文件过大。

实战中的小窍门

Redis性能提升那些配置技巧和实操经验分享,帮你优化运行效率

  1. 警惕慢查询 有些命令天生就慢,KEYS *,它会遍历所有键,数据量一大就直接把Redis打趴下,绝对不要在线上环境用!可以用 SCAN 命令来替代,它不会阻塞服务,用 slowlog get 命令定期检查慢查询日志,找出那些执行时间长的命令,看看能不能优化。

  2. 使用管道(Pipeline) 如果你需要一口气执行很多个命令,别一个个地发,每个命令都有网络往返的时间,使用管道可以把多个命令打包,一次发送给Redis,大大减少网络开销,这在高并发场景下对性能提升非常明显,这个技巧在Redis官方文档的优化建议里被重点提及。

  3. 避免大的集合键 一个Hash键里面存了几十万个字段,或者一个List有几百万个元素,这样的“大Key”在删除、过期、序列化时都会引起长时间的阻塞,尽量把数据合理地分散到多个Key中。

  4. 升级硬件 如果预算允许,最简单的提升性能的方法就是升级硬件:更快的CPU、更大的内存,以及最重要的——把磁盘换成SSD,这对持久化和主从复制的速度提升是立竿见影的。

优化Redis性能的核心思路就是:管好内存,配好持久化,避免慢操作,先从这些基础的配置和操作入手,往往就能解决大部分的性能问题。