Redis的redis.conf配置注释详解(四) - 云+社区 - 腾讯云



Redis使用——Redis的redis.conf配置注释详解(四)

背景

日常我们开发时,我们会遇到各种各样的奇奇怪怪的问题(踩坑o(╯□╰)o),这个常见问题系列就是我日常遇到的一些问题的记录文章系列,这里整理汇总后分享给大家,让其还在深坑中的小伙伴有绳索能爬出来。 同时在这里也欢迎大家把自己遇到的问题留言或私信给我,我看看其能否给大家解决。

开发环境

  • 系统:Ubuntu
  • 工具:Docker
  • 镜像:Redis
  • 官方配置:redis.conf

内容

本节对于其Redis的redis.conf配置进行注释翻译,确定各个配置的主要用途,便于日后配置使用,由于redis.conf中的配置较多,因此我们拆分为四节进行,话不多说下面开始。

################################ LATENCY MONITOR ##############################

# Redis延迟监控子系统在运行时采样不同的操作,以收集与Redis实例的可能延迟源相关的数据。
#
# 通过LATENCY命令,用户可以使用这些信息来打印图表和获取报告。
#
# 系统只记录在等于或大于通过latency-monitor-threshold配置指令指定的毫秒数的时间内执行的操作。
# 当它的值设置为0时,延迟监视器将关闭。
#
# 默认情况下,延迟监视是禁用的,
# 因为如果没有延迟问题,则基本不需要监视,
# 而且收集数据对性能有影响,虽然影响很小,但在大负载下可以测量。
# 如果需要,可以在运行时使用命令“CONFIG SET Latency -monitor-threshold <milliseconds>”轻松启用延迟监视。
latency-monitor-threshold 0

############################# EVENT NOTIFICATION ##############################

# Redis可以通知Pub/Sub客户端在密钥空间发生的事件。
# 这个特性在http://redis.io/topics/notifications上有记录
#
# 例如,如果启用了keyspace事件通知,
# 并且客户端对存储在数据库0中的键“foo”执行DEL操作,两条消息将通过Pub/Sub发布:
#
# PUBLISH __keyspace@0__:foo del
# PUBLISH __keyevent@0__:del foo
#
# 在一组类中选择Redis要通知的事件是可能的。
# 每个职业都由一个单一的字符来标识:
#
#  K     Keyspace events, published with __keyspace@<db>__ prefix.
#  E     Keyevent events, published with __keyevent@<db>__ prefix.
#  g     Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...
#  $     String commands
#  l     List commands
#  s     Set commands
#  h     Hash commands
#  z     Sorted set commands
#  x     Expired events (events generated every time a key expires)
#  e     Evicted events (events generated when a key is evicted for maxmemory)
#  t     Stream commands
#  m     Key-miss events (Note: It is not included in the 'A' class)
#  A     Alias for g$lshzxet, so that the "AKE" string means all the events
#        (Except key-miss events which are excluded from 'A' due to their
#         unique nature).
#
#  "notify-keyspace-events"的参数是一个由零或多个字符组成的字符串。
# 空字符串表示禁用通知。
#
#  例如:要启用列表和通用事件,从事件名称的角度来看,使用:
#
#  notify-keyspace-events Elg
#
#  Example 2: to get the stream of the expired keys subscribing to channel
#             name __keyevent@0__:expired use:
#
#  notify-keyspace-events Ex
#
#  默认情况下,所有通知都是禁用的,因为大多数用户不需要这个功能,而且这个功能有一些开销。
# 请注意,如果您不指定KE中的至少一个,则不会交付任何事件。
notify-keyspace-events ""

############################### GOPHER SERVER #################################

# Redis包含了一个在RFC 1436 (https://www.ietf.org/rfc/rfc1436.txt)中指定的Gopher协议的实现。
#
# Gopher协议在90年代末非常流行。
# 它是web的另一种选择,服务器端和客户端实现都非常简单,Redis服务器只需要100行代码就可以实现这种支持。
#
# 你现在什么对付Gopher? 好吧,Gopher从未“really”消亡,最近有一场运动,旨在让Gopher更多由纯文本文档组成的分层内容复活。
# 一些人想要一个更简单的互联网,另一些人认为主流互联网变得过于受控,为想要一点新鲜空气的人创造一个替代空间是很酷的。
#
# 总之,为了庆祝Redis十岁生日,我们把Gopher protocol作为礼物送给了它。
#
# --- HOW IT WORKS? ---
#
# Redis Gopher支持使用Redis的内联协议,特别是两种内联请求,无论如何都是非法的:空请求或任何以“/”开头的请求(没有Redis命令以这样的斜杠开头)。
# 正常的RESP2/RESP3请求完全超出了Gopher协议实现的路径,并照常提供服务。
#
# 如果你打开一个连接到Redis时,Gopher是启用的,并发送一个字符串,如"/foo",如果有一个键名为"/foo",它是通过Gopher协议提供的。
#
# 为了创建一个真正的Gopher "hole"(Gopher site中Gopher站点的名称),您可能需要如下脚本:
#
#   https://github.com/antirez/gopher2redis
#
# --- SECURITY WARNING ---
#
# 如果你计划把Redis放在一个公开的地址到服务器Gopher页面,确保设置一个密码的实例。一旦设置了密码:
#
#   1. Gopher服务器(启用后,不是默认情况下)仍将通过Gopher提供内容。
#   2. 但是,在客户机进行身份验证之前,不能调用其他命令。
#
# 所以使用'requirepass'选项来保护实例。
#
# 注意,当'io-threads-do-reads'启用时,目前不支持Gopher。
#
# 要启用Gopher支持,取消注释以下行,并将选项从no(默认值)设置为yes。
#
# gopher-enabled no

############################### ADVANCED CONFIG ###############################

# 当哈希值只有少量条目且最大条目不超过给定阈值时,使用内存有效的数据结构对其进行编码。
# 可以使用以下指令配置这些阈值。
hash-max-ziplist-entries 512
hash-max-ziplist-value 64

# 列表也以一种特殊的方式进行编码,以节省大量空间。
# 每个内部列表节点允许的条目数量可以指定为固定的最大大小或元素的最大数量。
# 对于固定的最大大小,使用-5-1表示:
# -5: max size: 64 Kb  <-- 不推荐用于正常的工作负载
# -4: max size: 32 Kb  <-- 不建议的
# -3: max size: 16 Kb  <-- 可能不推荐
# -2: max size: 8 Kb   <-- 推荐
# -1: max size: 4 Kb   <-- 推荐
# 正数表示每个列表节点最多存储相同数量的元素。
# 最高性能的选项通常是-2 (8 Kb大小)-1 (4 Kb大小),但如果您的用例是惟一的,则根据需要调整设置。
list-max-ziplist-size -2

# 列表也可以被压缩。
# 压缩深度是指快速列表ziplist节点的数量,从列表的**侧排除*压缩。
# 对于快速的push/pop操作,列表的头和尾总是未压缩的。设置:
# 0: disable all list compression
# 1: depth 1 means "don't start compressing until after 1 node into the list,
#    going from either the head or tail"
#    So: [head]->node->node->...->node->[tail]
#    [head], [tail] will always be uncompressed; inner nodes will compress.
# 2: [head]->[next]->node->node->...->node->[prev]->[tail]
#    2 here means: don't compress head or head->next or tail->prev or tail,
#    but compress all nodes between them.
# 3: [head]->[next]->[next]->node->node->...->node->[prev]->[prev]->[tail]
# etc.
list-compress-depth 0

# 集合在一种情况下有一种特殊的编码:当集合由恰好是基数1064位有符号整数范围内的字符串组成时。
# 为了使用这种特殊的内存保存编码,下面的配置设置设置了集合大小的限制。
set-max-intset-entries 512

# 与哈希和列表类似,为了节省大量空间,也对排序集进行了专门的编码。
# 这种编码仅在长度和元素低于以下限制时使用:
zset-max-ziplist-entries 128
zset-max-ziplist-value 64

# HyperLogLog稀疏表示字节限制。限制包括16字节的头。
# 当使用稀疏表示的HyperLogLog超过这个极限时,它被转换为稠密表示。
#
# 大于16000的值是完全无用的,因为在那一点上,密集表示的内存效率更高。
#
# 建议的值为~ 3000,以便在不降低PFADD太多速度的情况下获得空间有效编码的好处,而稀疏编码的PFADDO(N)。
# 当不考虑CPU而考虑空间时,该值可以提高到~ 10000,且数据集由许多HyperLogLogs组成,基数在0 - 15000之间。
hll-sparse-max-bytes 3000

# 流宏节点的最大大小/项。流数据结构是一个大节点的基数树,其中编码多个项目。
# 使用此配置,可以配置单个节点的字节大小,以及在添加新流项时切换到新节点之前,该节点可能包含的最大项数。
# 如果将以下任何设置设置为0,则忽略该限制,因此可以通过将max-bytes设置为0并将max-entries设置为所需的值来设置最大整数限制。
stream-node-max-bytes 4096
stream-node-max-entries 100

# 主动重哈希每100毫秒使用1毫秒的CPU时间,以帮助重哈希主Redis哈希表(一个映射顶级键值的表)。
# 哈希表实现复述,使用(见dict.c)执行一个懒惰改作:
# 操作越多改作遇到一个哈希表,越改作“步骤”执行,如果服务器空闲时再处理就不算完整和一些更多的内存使用哈希表。
#
# 默认值是每秒钟使用10毫秒,以便主动地重新散列主字典,尽可能释放内存。
#
# 如不确定:
# 如果你有硬延迟要求,使用“activerehashing no”,在你的环境中,Redis有时会回复2毫秒的请求,这不是一件好事。
#
# 如果你没有这样的硬性要求,但又想尽快释放内存,请使用“activerehashing yes”。
activerehashing yes

# 客户端输出缓冲区限制可用于强制断开由于某种原因而不能足够快地从服务器读取数据的客户端(一个常见的原因是Pub/Sub客户端不能像发布者生成消息那样快地使用消息)。
#
# 对于三种不同类型的客户端,可以设置不同的限制:
#
# normal -> 正常客户端,包括MONITOR客户端
# replica  -> 复制客户端
# pubsub -> 客户端订阅了至少一个发布频道或模式
#
# 每个client-output-buffer-limit指令的语法如下:
#
# client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>
#
# 一旦达到硬限制,客户端将立即断开连接,或者如果达到软限制并持续达到指定的秒数(连续)。
# 比如如果硬限制是32字节和软限制是16 mb / 10,客户端会立即断开输出缓冲区的大小达到32字节,但也会断开如果客户达到16字节,不断克服了限制10秒钟。
#
# 默认情况下,普通客户端不会受到限制,因为它们不会在没有请求(以push方式)的情况下接收数据,
# 而是在请求之后才接收数据,所以只有异步客户端才会创建数据请求速度比读取速度快的场景。
#
# 相反,pubsub和副本客户机有一个默认限制,因为订阅者和副本以push方式接收数据。
#
# 可以通过将硬限制或软限制设置为零来禁用它们。
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

# 客户端查询缓冲区积累新命令。默认情况下,它们被限制在一个固定的数量,
# 以避免协议去同步(例如由于客户机中的一个错误)将导致查询缓冲区中未绑定的内存使用。
# 不过,如果您有非常特殊的需求,例如巨大的多/exec请求等,您可以在这里配置它。
#
# client-query-buffer-limit 1gb

# 在Redis协议中,批量请求,即代表单个字符串的元素,通常被限制为512mb。
# 但是你可以在这里更改这个限制,但必须是1mb或更大
#
# proto-max-bulk-len 512mb

# Redis调用一个内部函数来执行许多后台任务,比如在超时时关闭客户端连接,清除从未被请求的过期密钥,等等。
#
# 并非所有的任务都以相同的频率执行,但Redis根据指定的“hz”值检查要执行的任务。
#
# 默认情况下,“hz”设置为10。提高这个值会在Redis空闲的时候占用更多的CPU,
# 但同时也会让Redis在有很多键同时过期的时候响应更快,并且可以更精确的处理超时。
#
# 范围在1500之间,但是值超过100通常不是一个好主意。大多数用户应该使用缺省值10,
# 只有在需要非常低延迟的环境中,才应该将此值提高到100。
hz 10

# 通常,HZ值与连接的客户端数量成比例是有用的。这是有用的,
# 例如,为了避免每个后台任务调用处理太多客户端,以避免延迟高峰。
#
# 由于默认的HZ值在默认情况下被保守地设置为10,Redis提供并默认启用了使用自适应HZ值的能力,当有很多连接的客户端时,这将临时提高。
#
# 当启用动态HZ时,实际配置的HZ将被用作基线,但一旦连接了更多客户端,实际将使用多个配置的HZ值。
# 通过这种方式,空闲实例将使用很少的CPU时间,而忙碌实例的响应速度将更快。
dynamic-hz yes

# 当一个子文件重写AOF文件时,如果启用以下选项,该文件将每生成32 MB的数据进行fsync。
# 这对于以增量的方式将文件提交到磁盘并避免较大的延迟峰值非常有用。
aof-rewrite-incremental-fsync yes

# 当redis保存RDB文件时,如果启用以下选项,该文件将每32mb的数据生成一次fsync。
# 这对于以增量的方式将文件提交到磁盘并避免较大的延迟峰值非常有用。
rdb-save-incremental-fsync yes

# Redis LFU驱逐(见maxmemory设置)可以调整。不过,最好从默认设置开始,
# 然后在研究了如何改进性能以及键LFU随时间变化的情况后才更改它们,这可以通过OBJECT FREQ命令进行检查。
#
# 在Redis LFU实现中有两个可调参数:计数器对数因子和计数器衰减时间。
# 在更改这两个参数之前,理解它们的含义是很重要的。
#
# LFU计数器每个密钥只有8位,它的最大值是255,所以Redis使用了一个带有对数行为的概率增量。
# 给定旧计数器的值,当一个键被访问时,计数器以这样的方式递增:
#
# 1. A random number R between 0 and 1 is extracted.
# 2. A probability P is calculated as 1/(old_value*lfu_log_factor+1).
# 3. The counter is incremented only if R < P.
#
# 默认的lfu-log-factor是10。这是一个表,频率计数器如何改变不同的访问次数与不同的对数因素:
#
# +--------+------------+------------+------------+------------+------------+
# | factor | 100 hits   | 1000 hits  | 100K hits  | 1M hits    | 10M hits   |
# +--------+------------+------------+------------+------------+------------+
# | 0      | 104        | 255        | 255        | 255        | 255        |
# +--------+------------+------------+------------+------------+------------+
# | 1      | 18         | 49         | 255        | 255        | 255        |
# +--------+------------+------------+------------+------------+------------+
# | 10     | 10         | 18         | 142        | 255        | 255        |
# +--------+------------+------------+------------+------------+------------+
# | 100    | 8          | 11         | 49         | 143        | 255        |
# +--------+------------+------------+------------+------------+------------+
#
# 注意:上表是通过以下命令获取的:
#
#   redis-benchmark -n 1000000 incr foo
#   redis-cli object freq foo
#
# NOTE 2: 计数器的初始值是5,以便给新对象一个累积命中的机会。
#
# 计数器衰减时间是以分钟为单位的,键计数器要被2除(如果它的值小于= 10则会被减)所花费的时间。
#
# lfu-decay-time的默认值是1。一个特殊的0值意味着每次扫描计数器时都会使其衰减。
#
# lfu-log-factor 10
# lfu-decay-time 1

########################### ACTIVE DEFRAGMENTATION #######################
#
# 什么是活动碎片整理?
# -------------------------------
#
# 主动(在线)碎片整理允许Redis服务器压缩小的分配和内存中数据的释放之间的空间,从而允许回收内存。
#
# 碎片是每个分配器(幸运的是,Jemalloc的情况不那么严重)和某些工作负载都会发生的自然过程。
# 通常需要重启服务器以降低碎片,或者至少清除所有数据并重新创建。
# 然而,多亏了Oran Agra为Redis 4.0实现的这个特性,这个过程可以在运行时以“热”的方式进行,而服务器正在运行。
#
# 分裂时基本上超过一定水平(见下面的配置选项)复述,将开始创建新副本的值在连续的内存区域利用特定Jemalloc特性
# (为了理解如果一个分配导致分裂和分配在一个更好的地方),与此同时,会发布旧的数据副本。
# 这个过程,对所有键递增地重复,将导致碎片回落到正常值。
#
# 需要了解的重要事情:
#
# 1. 这个功能在默认情况下是禁用的,并且只有在你编译Redis时使用我们与Redis源代码一起提供的Jemalloc副本时才有效。
# 这是Linux构建的默认值。
#
# 2. 如果没有碎片问题,就不需要启用这个功能。
#
# 3. 一旦您经历了碎片化,您可以在需要时使用命令“CONFIG SET activedefrag yes”启用该功能。
#
# 配置参数能够对碎片整理过程的行为进行微调。如果你不确定它们是什么意思,最好保留默认值不变。

# 使活跃的碎片整理
# activedefrag no

# 启动活动碎片整理所需的最小碎片浪费量
# active-defrag-ignore-bytes 100mb

# 启动活动碎片整理的最小碎片百分比
# active-defrag-threshold-lower 10

# 最大百分比的碎片,我们使用最大的努力
# active-defrag-threshold-upper 100

# 在达到较低阈值时,在CPU百分比中进行碎片整理的工作量最小
# active-defrag-cycle-min 1

# 达到上限阈值时使用的最大碎片整理工作量(CPU百分比计)
# active-defrag-cycle-max 25

# 将从主字典扫描中处理的set/hash/zset/list字段的最大数量
# active-defrag-max-scan-fields 1000

# 默认情况下,Jemalloc用于清除的后台线程将被启用
jemalloc-bg-thread yes

# 为了最大化服务器的性能,可以将Redis的不同线程和进程固定到你系统中的特定cpu上。
# 这既可以将不同的Redis线程固定在不同的cpu上,也可以确保在同一个主机上运行的多个Redis实例被固定在不同的cpu上。
#
# 通常情况下,你可以使用“taskset”命令来实现,但是也可以通过Redis配置直接实现,无论是在Linux还是FreeBSD中。
#
# 你可以固定服务器/IO线程、生物线程、aof重写子进程和bgsave子进程。指定cpu列表的语法与taskset命令相同:
#
# 设置redis服务器/io线程为cpu亲和性0,2,4,6:
# server_cpulist 0-7:2
#
# 将生物线程设置为cpu亲和性1,3:
# bio_cpulist 1,3
#
# 将重写子进程的aof设置为cpu亲和力 8,9,10,11:
# aof_rewrite_cpulist 8-11
#
# 设置bgsave子进程为cpu亲和性1,10,11
# bgsave_cpulist 1,10-11

# 在某些情况下,redis会发出警告,甚至拒绝启动,如果它检测到系统处于坏的状态,
# 可以通过设置下面的配置来抑制这些警告,它接受一个空格分隔的警告列表
#
# ignore-warnings ARM64-COW-BUG

yg9538 2022年7月22日 22:48 380 收藏文档