lazy free能监控的数据指标 , 只有一个值:lazyfree_pending_objects,表示redis执行lazy free操作,在等待被实际回收内容的键个数 。并不能体现单个大键的元素个数或等待lazy free回收的内存大小 。所以此值有一定参考值,可监测redis lazy free的效率或堆积键数量;比如在flushall async场景下会有少量的堆积 。
# info memory# Memorylazyfree_pending_objects:0
注意事项:unlink命令入口函数unlinkCommand()和del调用相同函数delGenericCommand()进行删除KEY操作,使用lazy标识是否为lazyfree调用 。如果是lazyfree,则调用dbAsyncDelete()函数 。
但并非每次unlink命令就一定启用lazy free,redis会先判断释放KEY的代价(cost),当cost大于LAZYFREE_THRESHOLD(64)才进行lazy free.
释放key代价计算函数lazyfreeGetFreeEffort(),集合类型键,且满足对应编码,cost就是集合键的元数个数,否则cost就是1 。
举例:
- 一个包含100元素的list key, 它的free cost就是100
- 一个512MB的string key, 它的free cost是1 所以可以看出,redis的lazy free的cost计算主要时间复杂度相关 。
9.AOF优化
Redis 提供了一个配置项,当子进程在 AOF rewrite 期间,可以让后台子线程不执行刷盘(不触发 fsync 系统调用)操作 。
这相当于在 AOF rewrite 期间,临时把 appendfsync 设置为了 none,配置如下:
# AOF rewrite 期间 , AOF 后台子线程不进行刷盘操作# 相当于在这期间,临时把 appendfsync 设置为了 noneno-appendfsync-on-rewrite yes 当然 , 开启这个配置项,在 AOF rewrite 期间 , 如果实例发生宕机,那么此时会丢失更多的数据,性能和数据安全性,你需要权衡后进行选择 。
如果占用磁盘资源的是其他应用程序,那就比较简单了,你需要定位到是哪个应用程序在大量写磁盘,然后把这个应用程序迁移到其他机器上执行就好了 , 避免对 Redis 产生影响 。
当然,如果你对 Redis 的性能和数据安全都有很高的要求,那么建议从硬件层面来优化,更换为 SSD 磁盘,提高磁盘的 IO 能力,保证 AOF 期间有充足的磁盘资源可以使用 。同时尽可能让Redis运行在独立的机器上 。
10.Swap优化
1)增加机器的内存,让 Redis 有足够的内存可以使用
2)整理内存空间,释放出足够的内存供 Redis 使用,然后释放 Redis 的 Swap,让 Redis 重新使用内存
释放 Redis 的 Swap 过程通常要重启实例,为了避免重启实例对业务的影响 , 一般会先进行主从切换,然后释放旧主节点的 Swap,重启旧主节点实例,待从库数据同步完成后 , 再进行主从切换即可 。
预防的办法就是,你需要对 Redis 机器的内存和 Swap 使用情况进行监控 , 在内存不足或使用到 Swap 时报警出来,及时处理 。
Redis变慢了排查步骤1.获取 Redis 实例在当前环境下的基线性能 。
2.是否用了慢查询命令?如果是的话,就使用其他命令替代慢查询命令,或者把聚合计算命令放在客户端做 。
3.是否对过期 key 设置了相同的过期时间?对于批量删除的 key,可以在每个 key 的过期时间上加一个随机数 , 避免同时删除 。
4.是否存在 bigkey?对于 bigkey 的删除操作,如果你的 Redis 是 4.0 及以上的版本,可以直接利用异步线程机制减少主线程阻塞;如果是 Redis 4.0 以前的版本,可以使用 SCAN 命令迭代删除;对于 bigkey 的集合查询和聚合操作,可以使用 SCAN 命令在客户端完成 。
5.Redis AOF 配置级别是什么?业务层面是否的确需要这一可靠性级别?如果我们需要高性能,同时也允许数据丢失,可以将配置项 no-appendfsync-on-rewrite 设置为 yes , 避免 AOF 重写和 fsync 竞争磁盘 IO 资源,导致 Redis 延迟增加 。当然 , 如果既需要高性能又需要高可靠性,最好使用高速固态盘作为 AOF 日志的写入盘 。
6.Redis 实例的内存使用是否过大?发生 swap 了吗?如果是的话,就增加机器内存 , 或者是使用 Redis 集群,分摊单机 Redis 的键值对数量和内存压力 。同时,要避免出现 Redis 和其他内存需求大的应用共享机器的情况 。
7.在 Redis 实例的运行环境中,是否启用了透明大页机制?如果是的话,直接关闭内存大页机制就行了 。
8.是否运行了 Redis 主从集群?如果是的话,把主库实例的数据量大小控制在 2~4GB,以免主从复制时 , 从库因加载大的 RDB 文件而阻塞 。
推荐阅读
- 如何构建六层大数据堆栈架构
- Python之Redis操作
- java中如何实现本地缓存?
- 没有门厅如何设计玄关,入户没有玄关可以摆放大绿植
- 教你如何给冰箱除冰 冰箱除冰小技巧
- 如何养育男孩儿
- 相机照片删除了怎么恢复 相机照片删除了如何恢复
- 发黄的衣服如何洗掉 发黄的衣服如何洗
- 如何清除衣服上的口香糖 如何清除衣服上的口香糖污渍
- 三门青蟹如何保存不会死 三门青蟹怎样才能放长时间
