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


16、tracking-table-max-keys
我在 Redis 6.0 版本,实现了服务端辅助实现客户端缓存的特性,需要追踪客户端有哪些 key 。当某个 key 被修改,我需要把这个失效信息发送到对应的客户端将本地缓存失效,这个配置就是用于指定追踪表保存的最大 key 数量,一旦超过这个数量,即使这个 key 没有被修改,为了回收内存我也会强制这个 key 所在的客户端缓存值失效 。
设置 0 表示不限制,需要注意的是,如果使用广播模式实现键追踪,则不需要额外内存,忽略这个配置 。
使用广播模式的不足就是与这个 key 无关的客户端也会收到失效消息 。
四、安全正是由于我快的一塌糊涂,攻击者一秒钟可以尝试 100 万个密码,所以你应该使用非常健壮的密码 。
1、ACL
ACL 日志的最大长度,默认配置 acllog-max-len 128 表示最大 128 mb 。
另外,使用 aclfile /etc/redis/users.acl 配置 ACL 文件所在位置 。
2、requirepass
当前 Redis 服务器的访问密码,默认是不需要密码访问,网络危险,必须设置,如 requirepass magebyte660设置密码为 “magebyte666” 。
3、maxclients
设置客户端同时连接的最大数量,默认设置是 maxclients 10000 。达到最大值,我将关闭客户端新的连接,并发送一个 max number of clients reached 错误给客户端 。
五、内存管理作为用内存保存数据的我,这部分的配置也相当重要 。
1、maxmemory
设置使用内存最大字节,当内存达到限制,我将尝试根据配置的内存淘汰策略(参见 maxmemory-policy)删除一些 key 。建议你不要设置太大的内存,防止执行 RDB 内存快照文件或者 AOF 重写的时候因数据太大而阻塞过长时间 。
推荐最大设置为 maxmemory 6GB 。
如果淘汰策略是 noeviction,当收到写请求,我将回复错误给客户端,读请求依然可以执行 。
如果你把我当做一个 LRU 或 LFU 缓存系统的时候,那请用心关注以下配置 。
2、maxmemory-policy
设置内存淘汰策略,定义当内存满时如何淘汰 key,默认配置是 noeviction 。

  • volatile-lru -> 在设置过期时间的 key 中使用近似 LRU 驱逐 。
  • allkeys-lru -> 在所有 key 中使用近似 LRU 驱逐 。
  • volatile-lfu -> 在过期 key 中使用近似 LFU 驱逐 。
  • allkeys-lfu -> 在所有 key 中使用近似 LFU 。
  • volatile-random -> 在设置了过期时间的 key 中随机删除一个 。
  • allkeys-random -> 在所有的 key 中随机删除一个 。
  • volatile-ttl -> 谁快过期就删谁 。
  • noeviction -> 不删除任何 key,内存满了直接返回报错 。
3、maxmemory-samples
LRU, LFU and minimal TTL algorithms 不是精确的算法,是一个近似的算法(主要为了节省内存) 。
所以需要你自己权衡速度和精确度 。默认会抽取 5 个 key,选择一个最近最少使用的 key 淘汰,你可以改变这个数量 。
默认的 5 可以提供不错的结果 。配置 10 会非常接近真实的 LRU 但是会耗费更多的 CPU,配置 3 会更快,但是就不那么精确了 。
4、replica-ignore-maxmemory
从 Redis 5.0 开始,默认情况下 slave 节点会忽略 maxmemory 配置,除非在故障转移后或手动将其提升为 master 。这意味着只有 master 才会执行内存淘汰策略,当 master 删除 key 后会发送 DEL指令给 slave 。
默认配置replica-ignore-maxmemory yes 。
5、active-expire-effort
我有两种方式删除过期数据 。
  • 后台周期性选取部分数据删除 。
  • 惰性删除,当访问请求到某个 key 的时候,发现该 key 已经过期则删除 。
这个配置用于指定过期 key 滞留在内存中的比例,默认值是 1,表示最多只能有 10 % 的过期 key 驻留在内存中,值设置的越小,那么一次淘汰周期内需需要消耗的 CPU 将会更多,因为需要删除更多的过期数据 。
六、惰性释放
MySQL:“ 可以使用非阻塞的方式删除 bigkey 么?”
我提供了两种删除 key 的基本命令用于删除数据 。