如何进行Redis性能优化?这一篇就够了( 六 )


第一种方案,在设置 key 的过期时间时,增加一个随机时间,伪代码可以这么写:
# 在过期时间点之后的 5 分钟内随机过期掉redis.expireat(key, expire_time + random(300)) 
第二种方案,Redis 4.0 以上版本,开启 lazy-free 机制:
# 释放过期 key 的内存,放到后台线程执行lazyfree-lazy-expire yes运维层面,你需要把 Redis 的各项运行状态数据监控起来,在 Redis 上执行 INFO 命令就可以拿到这个实例所有的运行状态数据 。
在这里我们需要重点关注 expired_keys 这一项 , 它代表整个实例到目前为止,累计删除过期 key 的数量 。
你需要把这个指标监控起来,当这个指标在很短时间内出现了突增,需要及时报警出来,然后与业务应用报慢的时间点进行对比分析,确认时间是否一致,如果一致,则可以确认确实是因为集中过期 key 导致的延迟变大 。
3.实例内存达到上限优化
1)避免存储 bigkey,降低释放内存的耗时
2)淘汰策略改为随机淘汰,随机淘汰比 LRU 要快很多(视业务情况调整)
3)拆分实例,把淘汰 key 的压力分摊到多个实例上
4)如果使用的是 Redis 4.0 以上版本,开启 layz-free 机制,把淘汰 key 释放内存的操作放到后台线程中执行(配置 lazyfree-lazy-eviction = yes)
 
4.fork耗时严重优化
1)控制 Redis 实例的内存:尽量在 10G 以下,执行 fork 的耗时与实例大小有关,实例越大,耗时越久 。
2)合理配置数据持久化策略:在 slave 节点执行 RDB 备份,推荐在低峰期执行 , 而对于丢失数据不敏感的业务(例如把 Redis 当做纯缓存使用),可以关闭 AOF 和 AOF rewrite 。
3)Redis 实例不要部署在虚拟机上:fork 的耗时也与系统也有关 , 虚拟机比物理机耗时更久 。
4)降低主从库全量同步的概率:适当调大 repl-backlog-size 参数,避免主从全量同步 。
从建立同步时,优先检测是否可以尝试只同步部分数据 , 这种情况就是针对于之前已经建立好了复制链路 , 只是因为故障导致临时断开 , 故障恢复后重新建立同步时 , 为了避免全量同步的资源消耗 , Redis会优先尝试部分数据同步,如果条件不符合,才会触发全量同步 。
这个判断依据就是在master上维护的复制缓冲区大?。?绻?飧龌撼迩?渲玫墓? 。?苡锌赡茉谥鞔佣峡?粗频恼舛问奔淠?,master产生的写入导致复制缓冲区的数据被覆盖,重新建立同步时的slave需要同步的offset位置在master的缓冲区中找不到,那么此时就会触发全量同步 。
如何避免这种情况?解决方案就是适当调大复制缓冲区repl-backlog-size的大小,这个缓冲区的大小默认为1MB , 如果实例写入量比较大 , 可以针对性调大此配置 。
5.多核CPU优化
那如何解决这个问题呢?
如果你确实想要绑定 CPU,可以优化的方案是 , 不要让 Redis 进程只绑定在一个 CPU 逻辑核上 , 而是绑定在多个逻辑核心上,而且,绑定的多个逻辑核心最好是同一个物理核心 , 这样它们还可以共用 L1/L2 Cache 。
当然,即便我们把 Redis 绑定在多个逻辑核心上,也只能在一定程度上缓解主线程、子进程、后台线程在 CPU 资源上的竞争 。
因为这些子进程、子线程还是会在这多个逻辑核心上进行切换,存在性能损耗 。?
如何再进一步优化?
可能你已经想到了,我们是否可以让主线程、子进程、后台线程,分别绑定在固定的 CPU 核心上,不让它们来回切换,这样一来 , 他们各自使用的 CPU 资源互不影响 。
其实,这个方案 Redis 官方已经想到了 。
Redis 在 6.0 版本已经推出了这个功能,我们可以通过以下配置,对主线程、后台线程、后台 RDB 进程、AOF rewrite 进程,绑定固定的 CPU 逻辑核心:
 

  • Redis6.0 前绑定CPU核
taskset -c 0 ./redis-server
  • Redis6.0 后绑定CPU核
# Redis Server 和 IO 线程绑定到 CPU核心 0,2,4,6server_cpulist 0-7:2# 后台子线程绑定到 CPU核心 1,3bio_cpulist 1,3# 后台 AOF rewrite 进程绑定到 CPU 核心 8,9,10,11aof_rewrite_cpulist 8-11# 后台 RDB 进程绑定到 CPU 核心 1,10,11# bgsave_cpulist 1,10-1 
如果你使用的正好是 Redis 6.0 版本,就可以通过以上配置,来进一步提高 Redis 性能 。
这里我需要提醒你的是,一般来说,Redis 的性能已经足够优秀,除非你对 Redis 的性能有更加严苛的要求,否则不建议你绑定 CPU 。


推荐阅读