两万字 redis.conf 7.0 配置和原理全解,生产王者必备(11)


10、maxmemory-clients
这是 7.0 版本特性,每个与服务端建立连接的客户端都会占用内存(查询缓冲区、输出缓冲区和其他缓冲区),大量的客户端可能会占用过大内存导致 OOM,为了避免这个情况,我提供了一种叫做(Client Eviction)客户端驱逐机制用于限制内存占用 。
配置方式有两种 。

  • 具体内存值, maxmemory-clients 1g来限制所有客户端占用内存总和 。
  • 百分比,maxmemory-clients 5% 表示客户端总和内存占用最多为 Redis 最大内存配置的 5% 。
默认配置是 maxmemory-clients 0 表示无限制 。
MySQL:“达到最大内存限制,你会把所有客户端连接都释放么?”
不是的,一旦达到限制,我会优先尝试断开使用内存最多的客户端 。
11、proto-max-bulk-len
批量请求(单个字符串的元素)内存大小限制,默认是 proto-max-bulk-len 512mb,你可以修改限制,但必须大于等于 1mb 。
12、hz
我会在后台调用一些函数来执行很多后台任务,比如关闭超时连接,清理不再被请求的过期的 key,rehash、执行 RDB 内存快照和 AOF 持久化等 。
并不是所有的后台任务都需要使用相同的频率来执行,你可以使用 hz 参数来决定执行这些任务的频率 。
默认配置是 hz 10,表示每秒执行 10 次,更大的值会消耗更多的 CPU 来处理后台任务,带来的效果就是更快的清理过期 key,清理的超时连接更精确 。
这个值的范围是 1~500,不过并不推荐设置大于 100 的值 。大家使用默认值就好,或者最多调高到 100 。
13、dynamic-hz
默认配置是 dynamic-hz yes,启用 dynamic-hz 后,将启用自适应 HZ 值的能力 。hz 的配置值将会作为基线,Redis 服务中的实际 hz 值会在基线值的基础上根据已连接到 Redis 的客户端数量自动调整,连接的客户端越多,实际 hz 值越高,Redis 执行定期任务的频率就越高 。
14、
aof-rewrite-incremental-fsync
当子进程进行 AOF 重写时,如果配置成
aof-rewrite-incremental-fsync yes,每生成 4 MB 数据就执行一次 fsync操作,分批提交到硬盘来避免高延迟峰值,推荐开启 。
15、
rdb-save-incremental-fsync
当我在保存 RDB 内存快照文件时,如果配置成 db-save-incremental-fsync yes,每生成 4MB 文件就执行一次 fsync操作,分批提交到硬盘来避免高延迟峰值,推荐开启 。
16、LFU 调优
这个配置生效的前提是内存淘汰策略设置的是 volatile-lfu或allkeys-lfu 。
  • lfu-log-factor 用于调整 Logistic Counter 的增长速度,lfu-log-factor 值越大,Logistic Counter 增长越慢 。默认配置 10 。
  • 以下是表格是官方不同 factor 配置下,计数器的改变频率 。注意:表格是通过如下命令获得的: redis-benchmark -n 1000000 incr foo redis-cli object freq foo 。
  • factor100 hits1000 hits100K hits1M hits10M hits01042552552552551184925525525510101814225525510081149143255
  • lfu-decay-time 用于调整 Logistic Counter 的衰减速度,它是一个以分钟为单位的数值,默认值为 1;lfu-decay-time 值越大,衰减越慢 。
十一、在线内存碎片整理
MySQL:“什么是在线内存碎片整理?”
Active (online) defragmentation 在线内存碎片整理指的是自动压缩内存分配器分配和 Redis 频繁做更新操作、大量过期数据删除,释放的空间(不够连续)无法得到复用的内存空间 。
通常来说当碎片化达到一定程度(查看下面的配置)Redis 会使用 Jemalloc 的特性创建连续的内存空间,并在此内存空间对现有的值进行拷贝,拷贝完成后会释放掉旧的数据 。这个过程会对所有的导致碎片化的 key 以增量的形式进行 。
需要注意的是
  1. 这个功能默认是关闭的,并且只有在编译 Redis 时使用我们代码中的 Jemalloc 版本才生效 。(这是 Linux 下的默认行为) 。
  2. 在实际使用中,建议是在 Redis 服务出现较多的内存碎片时启用(内存碎片率大于 1.5),正常情况下尽量保持禁用状态 。
  3. 如果你需要试验这项特性,可以通过命令 CONFIG SET activefrag yes来启用 。
清理的条件
activefrag yes:内存碎片整理总开关,默认为禁用状态 no 。

active-defrag-ignore-bytes 200mb:内存碎片占用的内存达到 200MB 。

active-defrag-threshold-lower 20:内存碎片的空间占比超过系统分配给 Redis 空间的 20%。


推荐阅读