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

  • slowlog-max-len:设定最多保存多少条慢查询的日志,slowlog 本身是一个 FIFO 队列,当超过设定的最大值后,我会把最旧的一条日志删除 。默认配置 128,如果设置太大会占用多大内存 。
  • 2、延迟监控
    延迟监控(LATENCY MONITOR)系统会在运行时抽样部分命令来帮助你分析 Redis 卡顿的原因 。
    通过 LATENCY命令,可以打印一些视图和报告,系统只会记录大于等于指定值的命令 。
    默认配置 latency-monitor-threshold 0,设置 0 表示关闭这个功能 。没有延迟问题,没必要开启开启监控,因为会对性能造成很大影响 。
    在运行过程中你怀疑有延迟性能问题,想要监控的话可以使用 CONFIG SET latency-monitor-threshold <milliseconds>开启,单位是毫秒 。
    十、高级设置这部分配置主要围绕以下几个方面 。
    • 指定不同数据类型根据不同条数下使用不同的数据结构存储,合理配置能做到更快和更省内存 。
    • 客户端缓冲区相关配置 。
    • 渐进式 rehash 资源控制 。
    • LFU 调优 。
    • RDB 内存快照文件、AOF 文件同步策略 。
    1、Hashes(散列表)
    在 Redis 7.0 版本散列表数据类型有两种数据结构保存数据,分别为散列表和 listpack 。当数据量很小时,可以使用更高效的数据结构存储,从而达到在不影响性能的情况下节省内存 。
    • hash-max-listpack-entries 512:指定使用 listpack 存储的最大条目数 。
    • hash-max-listpack-value 64:listpack 中,条目 value 值最大字节数,建议设置成 1024 。
    在 7.0 版本以前,使用的是 ziplist 数据结构,配置如下 。
    hash-max-ziplist-entries 512hash-max-ziplist-value 642、Lists(列表)
    Lists 也可以使用一种特殊方式进行编码来节省大量内存空间 。在 Redis 7.0 之后,Lits 底层的数据结构使用 linkedlist 或者 listpack。
    Redis 3.2 版本,List 内部是通过 linkedlist 和 quicklist 实现,quicklist 是一个双向链表,quicklist 的每个节点都是一个 ziplist,从而实现节省内存 。
    元素少时用 quicklist,元素多时用 linkedlist 。listpack 的目的就是用于替代 ziplist 和 quicklist 。listpack 也叫紧凑列表,它的特点就是用一块连续的内存空间来紧凑地保存数据,同时为了节省内存空间
    list-max-ziplist-size
    7.0 版本之前list-max-ziplist-size 用于配置 quicklist 中的每个节点的 ziplist 的大小 。当这个值配置为正数时表示 quicklist 每个节点的 ziplist 最多可存储元素数量,超过该值就会使用 linkedlist 存储 。
    当 list-max-ziplist-size 为负数时表示限制每个 quicklistNode 的 ziplist 的内存大小,超过这个大小就会使用 linkedlist 存储数据,每个值有以下含义:
    • -5:每个 quicklist 节点上的 ziplist 大小最大 64 kb <--- 正常环境不推荐
    • -4:每个 quicklist 节点上的 ziplist 大小最大 32 kb <--- 不推荐
    • -3:每个 quicklist 节点上的 ziplist 大小最大 16 kb <--- 可能不推荐
    • -2:每个 quicklist 节点上的 ziplist 大小最大 8 kb <--- 不错
    • -1:每个 quicklist 节点上的 ziplist 大小最大 4kb <--- 不错
    默认值为 -2,也是官方最推荐的值,当然你可以根据自己的实际情况进行修改 。
    list-max-listpack-size
    7.0 之后,配置修改为list-max-listpack-size -2则表示限制每个 listpack 大小,不再赘述 。
    list-compress-depth
    压缩深度配置,用来配置压缩 Lists 的,当 Lists 底层使用 linkedlist 也是可以压缩的,默认是 list-compress-depth 0表示不压缩 。一般情况下,Lists 的两端访问的频率高一些,所以你可以考虑把中间的数据进行压缩 。
    不同参数值的含义如下 。
    • 0,关闭压缩,默认值 。
    • 1,两端各有一个节点不压缩 。
    • 2,两端各有两个节点不压缩 。
    • N,依次类推,两端各有 N 个节点不压缩 。
    需要注意的是,head 和 tail 节点永远都不会被压缩 。
    3、Sets(无序集合)
    Sets 底层的数据结构可以是 intset(整形数组)和 Hashtable(散列表),intset 你可以理解成数组,Hashtable 就是普通的散列表(key 存的是 Sets 的值,value 为 null) 。有没有觉得 Sets 使用散列表存储是意想不到的事情?
    set-max-intset-entries
    当集合的元素都是 64 位以内的十进制整数时且长度不超过 set-max-intset-entries 配置的值(默认 512),Sets 的底层会使用 intset 存储节省内存 。添加的元素大于 set-max-intset-entries配置的值,底层实现由 intset 转成散列表存储 。


    推荐阅读