Redis配置文档中文翻译

Redis配置文档中文翻译

各参数配置解读可参考:https://cloud.tencent.com/developer/article/2205116

# Redis 配置文件示例。
#
# 注意:为了读取配置文件,Redis 必须以文件路径作为第一个参数启动:
#
# ./redis-server /path/to/redis.conf

# 当需要指定内存大小时,可以使用常见的格式,如 1k、5GB、4M 等:
#
# 1k => 1000 字节
# 1kb => 1024 字节
# 1m => 1000000 字节
# 1mb => 1024*1024 字节
# 1g => 1000000000 字节
# 1gb => 1024*1024*1024 字节
#
# 单位不区分大小写,因此 1GB、1Gb、1gB 都是相同的。


################################## 包含其他配置文件 ###################################

# 在这里可以包含一个或多个其他配置文件。如果您有一个标准模板适用于所有 Redis 服务器,
# 但还需要为每个服务器自定义一些设置,这将非常有用。包含文件可以嵌套包含其他文件,
# 因此请谨慎使用。
#
# 注意:"include" 选项不会被管理员或 Redis Sentinel 的 "CONFIG REWRITE" 命令重写。
# 由于 Redis 总是使用最后处理的行作为配置指令的值,因此最好将包含文件放在此文件的开头,
# 以避免在运行时覆盖配置更改。
#
# 如果您希望使用包含文件来覆盖配置选项,最好将包含文件放在最后一行。
#
# 包含路径可以包含通配符。所有匹配通配符的文件将按字母顺序包含。
# 注意:如果包含路径包含通配符,但在服务器启动时没有匹配的文件,
# 则包含语句将被忽略,并且不会发出错误。因此,从空目录中包含通配符文件是安全的。
#
# include /path/to/local.conf
# include /path/to/other.conf
# include /path/to/fragments/*.conf

################################## 模块 #####################################

# 在启动时加载模块。如果服务器无法加载模块,它将中止。
# 可以使用多个 loadmodule 指令。
#
# loadmodule /path/to/my_module.so
# loadmodule /path/to/other_module.so

################################## 网络配置 #####################################

# 默认情况下,如果没有指定 "bind" 配置指令,Redis 将监听主机上所有可用网络接口的连接。
# 可以使用 "bind" 配置指令监听一个或多个选定的接口,后跟一个或多个 IP 地址。
# 每个地址可以前缀 "-",这意味着如果地址不可用,Redis 不会启动失败。
# 不可用仅指不对应任何网络接口的地址。已经使用的地址将始终失败,
# 不支持的协议将始终被静默跳过。
#
# 示例:
#
# bind 192.168.1.100 10.0.0.1     # 监听两个特定的 IPv4 地址
# bind 127.0.0.1 ::1              # 监听回环 IPv4 和 IPv6
# bind * -::*                     # 类似于默认值,监听所有可用接口
#
# ~~~ 警告 ~~~ 如果运行 Redis 的计算机直接暴露在互联网上,
# 绑定到所有接口是危险的,并且会将实例暴露给互联网上的所有人。
# 因此,默认情况下我们取消注释以下 bind 指令,强制 Redis 仅监听
# IPv4 和 IPv6(如果可用)回环接口地址(这意味着 Redis 只能接受来自运行它的主机的客户端连接)。
#
# 如果您确定希望您的实例监听所有接口,请注释掉以下行。
#
# 您还需要设置密码,除非您明确禁用保护模式。
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bind 127.0.0.1 -::1

# 默认情况下,出站连接(从副本到主节点、从 Sentinel 到实例、集群总线等)
# 不绑定到特定的本地地址。在大多数情况下,这意味着操作系统将根据路由和连接出去的接口来处理。
#
# 使用 bind-source-addr 可以配置要绑定的特定地址,这也可能影响连接的路径。
#
# 示例:
#
# bind-source-addr 10.0.0.1

# 保护模式是一层安全保护,旨在避免暴露在互联网上的 Redis 实例被访问和利用。
#
# 当保护模式开启且默认用户没有密码时,服务器仅接受来自 IPv4 地址(127.0.0.1)、
# IPv6 地址(::1)或 Unix 域套接字的本地连接。
#
# 默认情况下,保护模式是启用的。只有在您确定希望其他主机的客户端连接到 Redis
# 时,才应禁用它,即使没有配置身份验证。
protected-mode yes

# Redis 使用默认的强化安全配置指令来减少对无辜用户的攻击面。
# 因此,几个敏感的配置指令是不可变的,一些潜在危险的命令被阻止。
#
# 控制 Redis 写入文件的配置指令(例如 'dir' 和 'dbfilename')
# 并且在运行时通常不会修改的指令通过使其不可变来保护。
#
# 默认情况下,可以增加 Redis 攻击面且通常不由用户调用的命令被阻止。
#
# 这些可以通过将以下列出的每个配置设置为以下值之一来暴露给所有连接或仅本地连接:
#
# no    - 阻止任何连接(保持不可变)
# yes   - 允许任何连接(无保护)
# local - 仅允许本地连接。来自 IPv4 地址(127.0.0.1)、
#         IPv6 地址(::1)或 Unix 域套接字的连接。
#
# enable-protected-configs no
# enable-debug-command no
# enable-module-command no

# 接受指定端口的连接,默认是 6379(IANA #815344)。
# 如果指定端口 0,Redis 将不会监听 TCP 套接字。
port 6379

# TCP listen() 积压。
#
# 在高请求每秒的环境中,您需要高积压以避免慢客户端连接问题。
# 请注意,Linux 内核会静默将其截断为 /proc/sys/net/core/somaxconn 的值,
# 因此请确保提高 somaxconn 和 tcp_max_syn_backlog 的值以获得所需的效果。
tcp-backlog 511

# Unix 套接字。
#
# 指定用于监听传入连接的 Unix 套接字的路径。
# 没有默认值,因此如果未指定,Redis 不会监听 Unix 套接字。
#
# unixsocket /run/redis/redis-server.sock
# unixsocketperm 700

# 在客户端空闲 N 秒后关闭连接(0 表示禁用)。
timeout 0

# TCP keepalive。
#
# 如果非零,则在通信缺失时使用 SO_KEEPALIVE 向客户端发送 TCP ACK。
# 这有两个原因:
#
# 1) 检测死对等点。
# 2) 强制中间网络设备认为连接是活动的。
#
# 在 Linux 上,指定的值(以秒为单位)是用于发送 ACK 的周期。
# 请注意,要关闭连接,需要双倍的时间。
# 在其他内核上,周期取决于内核配置。
#
# 此选项的合理值是 300 秒,这是 Redis 3.2.1 开始的新默认值。
tcp-keepalive 300

# 应用操作系统特定的机制来标记监听套接字,以支持高级路由和过滤功能。
#
# 在 Linux 上,ID 表示连接标记。
# 在 FreeBSD 上,ID 表示套接字 cookie ID。
# 在 OpenBSD 上,ID 表示路由表 ID。
#
# 默认值为 0,这意味着不需要标记。
# socket-mark-id 0

################################# TLS/SSL配置 #####################################

# 默认情况下,TLS/SSL 被禁用。要启用它,可以使用 "tls-port" 配置指令
# 来定义 TLS 监听端口。要在默认端口上启用 TLS,请使用:
#
# port 0
# tls-port 6379

# 配置 X.509 证书和私钥以用于向连接的客户端、主节点或集群对等方进行身份验证。
# 这些文件应为 PEM 格式。
#
# tls-cert-file redis.crt
# tls-key-file redis.key
#
# 如果密钥文件使用密码加密,也可以在此处包含密码。
#
# tls-key-file-pass secret

# 通常 Redis 对服务器功能(接受连接)和客户端功能(从主节点复制、建立集群总线连接等)
# 使用相同的证书。
#
# 有时证书会带有属性,将其指定为仅客户端或仅服务器证书。
# 在这种情况下,可能希望为传入(服务器)和传出(客户端)连接使用不同的证书。
# 为此,请使用以下指令:
#
# tls-client-cert-file client.crt
# tls-client-key-file client.key
#
# 如果密钥文件使用密码加密,也可以在此处包含密码。
#
# tls-client-key-file-pass secret

# 配置 DH 参数文件以启用 Diffie-Hellman (DH) 密钥交换,
# 这是旧版 OpenSSL (<3.0) 所需的。新版本不需要此配置,并且不建议使用。
#
# tls-dh-params-file redis.dh

# 配置 CA 证书包或目录以验证 TLS/SSL 客户端和对等方。
# Redis 需要明确配置至少一个,并且不会隐式使用系统范围的配置。
#
# tls-ca-cert-file ca.crt
# tls-ca-cert-dir /etc/ssl/certs

# 默认情况下,TLS 端口上的客户端(包括副本服务器)需要使用有效的客户端证书进行身份验证。
#
# 如果指定 "no",则不需要也不接受客户端证书。
# 如果指定 "optional",则接受客户端证书,但如果提供则必须有效,但不是必需的。
#
# tls-auth-clients no
# tls-auth-clients optional

# 默认情况下,Redis 副本不会尝试与其主节点建立 TLS 连接。
#
# 使用以下指令在复制链接上启用 TLS。
#
# tls-replication yes

# 默认情况下,Redis 集群总线使用普通 TCP 连接。要为总线协议启用 TLS,请使用以下指令:
#
# tls-cluster yes

# 默认情况下,仅启用 TLSv1.2 和 TLSv1.3,强烈建议禁用旧版正式弃用的版本以减少攻击面。
# 您可以显式指定支持的 TLS 版本。
# 允许的值不区分大小写,包括 "TLSv1"、"TLSv1.1"、"TLSv1.2"、
# "TLSv1.3"(OpenSSL >= 1.1.1)或任何组合。
# 要仅启用 TLSv1.2 和 TLSv1.3,请使用:
#
# tls-protocols "TLSv1.2 TLSv1.3"

# 配置允许的密码。有关此字符串语法的更多信息,请参阅 ciphers(1ssl) 手册页。
#
# 注意:此配置仅适用于 <= TLSv1.2。
#
# tls-ciphers DEFAULT:!MEDIUM

# 配置允许的 TLSv1.3 密码套件。有关此字符串语法的更多信息,请参阅 ciphers(1ssl) 手册页,
# 特别是 TLSv1.3 密码套件。
#
# tls-ciphersuites TLS_CHACHA20_POLY1305_SHA256

# 在选择密码时,使用服务器的偏好而不是客户端的偏好。默认情况下,服务器遵循客户端的偏好。
#
# tls-prefer-server-ciphers yes

# 默认情况下,TLS 会话缓存已启用,以允许支持它的客户端更快且更便宜地重新连接。
# 使用以下指令禁用缓存。
#
# tls-session-caching no

# 更改默认的缓存 TLS 会话数。零值将缓存设置为无限大小。默认大小为 20480。
#
# tls-session-cache-size 5000

# 更改缓存 TLS 会话的默认超时时间。默认超时为 300 秒。
#
# tls-session-cache-timeout 60

################################# 通用配置 #####################################

# 默认情况下,Redis 不以守护进程方式运行。如果需要,请设置为 'yes'。
# 注意:当 Redis 以守护进程方式运行时,会在 /var/run/redis.pid 中写入一个 PID 文件。
# 当 Redis 由 upstart 或 systemd 管理时,此参数无效。
daemonize yes

# 如果您通过 upstart 或 systemd 运行 Redis,Redis 可以与您的监管系统交互。选项包括:
#   supervised no      - 不与监管系统交互。
#   supervised upstart - 通过将 Redis 置于 SIGSTOP 模式来通知 upstart
#                       需要在 upstart 作业配置中添加 "expect stop"。
#   supervised systemd - 通过向 $NOTIFY_SOCKET 写入 READY=1 来通知 systemd,
#                       并在启动时定期更新 Redis 状态。
#   supervised auto    - 根据 UPSTART_JOB 或 NOTIFY_SOCKET 环境变量自动检测 upstart 或 systemd 方法。
# 注意:这些监管方法仅用于通知“进程已就绪”。
#       它们不支持持续向监管系统发送心跳。
#
# 默认值为 "no"。要在 upstart/systemd 下运行,只需取消注释以下行:
#
# supervised auto

# 如果指定了 PID 文件,Redis 会在启动时将其写入指定位置,并在退出时删除。
#
# 当服务器以非守护进程方式运行时,如果未指定 PID 文件,则不会创建 PID 文件。
# 当服务器以守护进程方式运行时,即使未指定 PID 文件,也会使用默认的 "/var/run/redis.pid"。
#
# 创建 PID 文件是尽力而为的:如果 Redis 无法创建它,服务器仍会正常启动和运行。
#
# 注意:在现代 Linux 系统中,"/run/redis.pid" 更符合规范,应优先使用。
pidfile /run/redis/redis-server.pid

# 指定服务器的详细级别。
# 可以是以下之一:
# debug(大量信息,适用于开发/测试)
# verbose(许多很少有用的信息,但不像调试级别那样混乱)
# notice(适度详细,可能是生产环境中的理想选择)
# warning(仅记录非常重要/关键的消息)
loglevel notice

# 指定日志文件名。也可以使用空字符串强制 Redis 将日志输出到标准输出。
# 请注意,如果您使用标准输出进行日志记录但以守护进程方式运行,日志将发送到 /dev/null。
logfile /var/log/redis/redis-server.log

# 要启用日志记录到系统日志,只需将 'syslog-enabled' 设置为 yes,
# 并可选地更新其他 syslog 参数以满足您的需求。
# syslog-enabled no

# 指定 syslog 标识。
# syslog-ident redis

# 指定 syslog 设施。必须是 USER 或 LOCAL0-LOCAL7 之间。
# syslog-facility local0

# 要禁用内置的崩溃日志,这可能会在需要时生成更干净的核心转储,请取消注释以下内容:
#
# crash-log-enabled no

# 要禁用作为崩溃日志一部分运行的快速内存检查,这可能会让 Redis 更快终止,请取消注释以下内容:
#
# crash-memcheck-enabled no

# 设置数据库的数量。默认数据库是 DB 0,您可以使用 SELECT <dbid> 在每个连接的基础上选择不同的数据库,
# 其中 dbid 是介于 0 和 'databases'-1 之间的数字。
databases 16

# 默认情况下,Redis 仅在启动时将 ASCII 艺术徽标记录到标准输出,
# 并且如果标准输出是 TTY 并且 syslog 日志记录被禁用。
# 基本上,这意味着通常仅在交互式会话中显示徽标。
#
# 但是,可以通过将以下选项设置为 yes 来强制 Redis 4.0 之前的行为,
# 并在启动日志中始终显示 ASCII 艺术徽标。
always-show-logo no

# 默认情况下,Redis 修改进程标题(如在 'top' 和 'ps' 中看到的)以提供一些运行时信息。
# 可以通过将以下选项设置为 no 来禁用此功能,并保留执行的进程名称。
set-proc-title yes

# 更改进程标题时,Redis 使用以下模板构建修改后的标题。
#
# 模板变量用花括号指定。支持以下变量:
#
# {title}           执行的进程名称(如果是父进程)或子进程类型。
# {listen-addr}     绑定的地址或 '*' 后跟监听的 TCP 或 TLS 端口,或仅可用的 Unix 套接字。
# {server-mode}     特殊模式,例如 "[sentinel]" 或 "[cluster]"。
# {port}            监听的 TCP 端口,或 0。
# {tls-port}        监听的 TLS 端口,或 0。
# {unixsocket}      监听的 Unix 域套接字,或 ""。
# {config-file}     使用的配置文件名。
#
proc-title-template "{title} {listen-addr} {server-mode}"

################################ 快照  ################################

# 将数据库保存到磁盘。
#
# save <秒数> <更改次数> [<秒数> <更改次数> ...]
#
# 如果给定的秒数已过,并且对数据库的写操作超过了给定的次数,Redis将保存数据库。
#
# 可以通过一个空字符串参数完全禁用快照功能,如下例所示:
#
# save ""
#
# 除非另有说明,默认情况下Redis将保存数据库:
#   * 如果至少执行了1次更改,则在3600秒(1小时)后
#   * 如果至少执行了100次更改,则在300秒(5分钟)后
#   * 如果至少执行了10000次更改,则在60秒后
#
# 您可以通过取消注释以下行来显式设置这些值。
#
# save 3600 1 300 100 60 10000

# 默认情况下,如果启用了RDB快照(至少有一个保存点)并且最近的后台保存失败,Redis将停止接受写入。
# 这将使用户意识到(以一种强硬的方式)数据没有正确地持久化到磁盘,否则可能没有人会注意到,并且可能会发生一些灾难。
#
# 如果后台保存过程再次开始工作,Redis将自动允许写入。
#
# 但是,如果您已经设置了适当的Redis服务器监控和持久化,您可能希望禁用此功能,以便即使磁盘、权限等出现问题,Redis也能继续正常工作。
stop-writes-on-bgsave-error yes

# 在转储.rdb数据库时使用LZF压缩字符串对象?
# 默认情况下,压缩是启用的,因为它几乎总是有利的。
# 如果您想在保存子进程中节省一些CPU,请将其设置为“no”,但如果您有可压缩的值或键,数据集可能会更大。
rdbcompression yes

# 从RDB版本5开始,文件末尾放置了一个CRC64校验和。
# 这使得格式更抗损坏,但在保存和加载RDB文件时会付出性能代价(大约10%),因此您可以禁用它以获得最大性能。
#
# 禁用校验和创建的RDB文件的校验和为零,这将告诉加载代码跳过检查。
rdbchecksum yes

# 在加载RDB或RESTORE有效负载时,启用或禁用对ziplist和listpack等的完整清理检查。这减少了在处理命令时稍后出现断言或崩溃的可能性。
# 选项:
#   no         - 从不执行完整清理
#   yes        - 始终执行完整清理
#   clients    - 仅对用户连接执行完整清理。
#                排除:RDB文件,从主连接接收的RESTORE命令,以及具有skip-sanitize-payload ACL标志的客户端连接。
# 默认值应为“clients”,但由于它目前影响通过MIGRATE进行的集群重新分片,因此暂时默认设置为“no”。
#
# sanitize-dump-payload no

# 转储数据库的文件名
dbfilename dump.rdb

# 在没有启用持久化的实例中删除用于复制的RDB文件。默认情况下,此选项是禁用的,
# 但在某些环境中,出于法规或其他安全考虑,主服务器为了提供给副本而持久化到磁盘的RDB文件,
# 或副本为了初始同步而存储在磁盘上的RDB文件,应尽快删除。请注意,此选项仅在同时禁用AOF和RDB持久化的实例中有效,否则将被完全忽略。
#
# 另一种(有时更好)获得相同效果的方法是同时在主服务器和副本实例上使用无盘复制。然而,在副本的情况下,无盘并不总是一个选项。
rdb-del-sync-files no

# 工作目录。
#
# 数据库将写入此目录中,使用上面指定的'dbfilename'配置指令指定的文件名。
#
# 仅追加文件也将在此目录中创建。
#
# 请注意,您必须在此处指定一个目录,而不是文件名。
dir /var/lib/redis

################################# 复制 #################################

# 主从复制。使用replicaof使Redis实例成为另一个Redis服务器的副本。关于Redis复制,有几件事需要尽快了解。
#
#   +------------------+      +---------------+
#   |      主服务器     | ---> |     副本      |
#   | (接收写入)        |      |  (精确副本)   |
#   +------------------+      +---------------+
#
# 1) Redis复制是异步的,但您可以配置主服务器在似乎未连接到至少给定数量的副本时停止接受写入。
# 2) 如果复制链接在相对较短的时间内丢失,Redis副本能够与主服务器执行部分重新同步。
# 您可能希望根据您的需求配置复制积压大小(请参阅此文件的下一部分)。
# 3) 复制是自动的,不需要用户干预。在网络分区后,副本会自动尝试重新连接到主服务器并与其重新同步。
#
# replicaof <主服务器IP> <主服务器端口>

# 如果主服务器受密码保护(使用下面的“requirepass”配置指令),可以告诉副本在开始复制同步过程之前进行身份验证,否则主服务器将拒绝副本请求。
#
# masterauth <主服务器密码>
#
# 但是,如果您使用的是Redis ACL(适用于Redis 6或更高版本),并且默认用户无法运行PSYNC命令和/或其他复制所需的命令,这还不够。
# 在这种情况下,最好配置一个特殊用户用于复制,并指定masteruser配置如下:
#
# masteruser <用户名>
#
# 当指定了masteruser时,副本将使用新的AUTH形式对其主服务器进行身份验证:AUTH <用户名> <密码>。

# 当副本失去与主服务器的连接,或者复制仍在进行时,副本可以以两种不同的方式操作:
#
# 1) 如果replica-serve-stale-data设置为“yes”(默认值),副本仍将回复客户端请求,可能使用过时的数据,或者如果这是第一次同步,数据集可能为空。
#
# 2) 如果replica-serve-stale-data设置为“no”,副本将对所有数据访问命令回复错误“MASTERDOWN 与主服务器的链接已断开
#    且replica-serve-stale-data设置为‘no’”,不包括以下命令:
#    INFO, REPLICAOF, AUTH, SHUTDOWN, REPLCONF, ROLE, CONFIG, SUBSCRIBE,
#    UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB, COMMAND, POST,
#    HOST和LATENCY。
#
replica-serve-stale-data yes

# 您可以配置副本实例是否接受写入。对副本实例进行写入可能对存储一些临时数据有用
# (因为在与主服务器重新同步后,写入副本的数据将很容易被删除),但如果客户端由于配置错误而向其写入,也可能导致问题。
#
# 自Redis 2.6以来,默认情况下副本是只读的。
#
# 注意:只读副本并不设计为暴露给互联网上的不受信任的客户端。它只是防止实例被滥用的保护层。
# 仍然,只读副本默认导出所有管理命令,如CONFIG、DEBUG等。您可以通过使用'rename-command'来隐藏所有管理/危险命令,
# 从而在一定程度上提高只读副本的安全性。
replica-read-only yes

# 复制SYNC策略:磁盘或套接字。
#
# 新副本和重新连接的副本如果无法继续仅接收差异的复制过程,则需要执行所谓的“完全同步”。RDB文件从主服务器传输到副本。
#
# 传输可以通过两种不同的方式进行:
#
# 1) 磁盘支持:Redis主服务器创建一个新进程,将RDB文件写入磁盘。随后,父进程将文件逐步传输到副本。
# 2) 无盘:Redis主服务器创建一个新进程,直接将RDB文件写入副本套接字,完全不接触磁盘。
#
# 使用磁盘支持的复制,在生成RDB文件时,更多的副本可以排队,并在当前生成RDB文件的子进程完成其工作后立即为其提供服务。
# 使用无盘复制,一旦传输开始,新到达的副本将排队,并在当前传输结束时开始新的传输。
#
# 使用无盘复制时,主服务器在开始传输之前等待可配置的时间(以秒为单位),希望多个副本到达并且传输可以并行化。
#
# 在慢速磁盘和快速(大带宽)网络的情况下,无盘复制效果更好。
repl-diskless-sync yes

# 启用无盘复制时,可以配置服务器等待生成通过套接字将RDB传输到副本的子进程的延迟。
#
# 这很重要,因为一旦传输开始,就无法为新到达的副本提供服务,这些副本将排队等待下一次RDB传输,因此服务器等待延迟以让更多副本到达。
#
# 延迟以秒为单位指定,默认情况下为5秒。要完全禁用它,只需将其设置为0秒,传输将尽快开始。
repl-diskless-sync-delay 5

# 启用带有延迟的无盘复制时,如果预期的最大副本数已连接,可以在达到最大延迟之前开始复制。默认值为0表示未定义最大值,Redis将等待完整的延迟。
repl-diskless-sync-max-replicas 0

# -----------------------------------------------------------------------------
# 警告:RDB无盘加载是实验性的。由于在此设置中副本不会立即将RDB存储在磁盘上,因此在故障转移期间可能会导致数据丢失。
# RDB无盘加载 + 不处理I/O读取的Redis模块也可能导致Redis在初始同步阶段与主服务器发生I/O错误时中止。仅在您知道自己在做什么时使用。
# -----------------------------------------------------------------------------
#
# 从节点(Replica)既可以直接通过套接字(socket)从复制链路实时加载接收的 RDB 数据,
# 也可以先将 RDB 存储为文件,待从主节点完整接收后再读取该文件。

#
# 在许多情况下,磁盘比网络慢,存储和加载RDB文件可能会增加复制时间(甚至增加主服务器的写时复制内存和副本缓冲区)。
# 但是,直接从套接字解析RDB文件可能意味着我们必须在完全接收RDB之前刷新当前数据库的内容。因此,我们有以下选项:
#
# "disabled"    - 不使用无盘加载(首先将RDB文件存储到磁盘)
# "on-empty-db" - 仅在完全安全时使用无盘加载。
# "swapdb"      - 在直接从套接字解析数据时,将当前数据库内容保留在RAM中。
# 				 在此模式下,从节点(Replica)可以在数据复制过程中继续对外提供当前数据集的服务;
# 				 但若从节点无法确认主节点(Master)的数据集与其属于同一复制历史(例如主从数据源不一致),则此功能不适用。
# 				 请注意,这需要足够的内存,如果您没有它,您可能会面临OOM终止的风险。
repl-diskless-load disabled

# 主服务器以预定义的时间间隔向其副本发送PING。可以使用repl_ping_replica_period选项更改此间隔。默认值为10秒。
#
# repl-ping-replica-period 10

# 以下选项设置复制的超时时间:
#
# 1) 从副本的角度来看,SYNC期间的批量传输I/O。
# 2) 从副本的角度来看,主服务器的超时(数据,PING)。
# 3) 从主服务器的角度来看,副本的超时(REPLCONF ACK PING)。
#
# 确保此值大于为repl-ping-replica-period指定的值非常重要,否则每次主服务器和副本之间的流量较低时都会检测到超时。默认值为60秒。
#
# repl-timeout 60

# 在SYNC后禁用副本套接字上的TCP_NODELAY?
#
# 如果选择“yes”,Redis将使用较少的TCP数据包和较少的带宽向副本发送数据。
# 但这可能会增加数据在副本端出现的延迟,使用默认配置的Linux内核最多可达40毫秒。
#
# 如果选择“no”,数据在副本端出现的延迟将减少,但复制将使用更多的带宽。
#
# 默认情况下,我们优化低延迟,但在非常高的流量条件下或当主服务器和副本相距多跳时,将其设置为“yes”可能是一个好主意。
repl-disable-tcp-nodelay no

# 设置复制积压大小。积压是一个缓冲区,当副本断开连接一段时间时,它会累积副本数据,
# 以便当副本想要重新连接时,通常不需要完全重新同步,而只需进行部分重新同步,只需传递副本在断开连接时错过的数据部分。
#
# 复制积压越大,副本可以承受断开连接的时间越长,并且稍后能够执行部分重新同步。
#
# 只有在至少有一个副本连接时,才会分配积压。
#
# repl-backlog-size 1mb

# 当主服务器在一段时间内没有连接的副本时,积压将被释放。以下选项配置从最后一个副本断开连接开始,积压缓冲区被释放所需的秒数。
#
# 请注意,副本永远不会因超时而释放积压,因为它们稍后可能会被提升为主服务器,
# 并且应该能够正确地与其他副本“部分重新同步”:因此它们应该始终累积积压。
#
# 值为0表示永不释放积压。
#
# repl-backlog-ttl 3600
#
# 副本优先级是 Redis 在 INFO 输出中发布的一个整数值。Redis Sentinel 使用它来选择在 master 无法正常工作时将哪个副本提升为 master。
#
# 优先级较低的副本被认为更适合提升,例如,如果有三个优先级分别为 10、100、25 的副本,Sentinel 会选择优先级为 10 的副本,因为它是最低的。
#
# 然而,优先级为 0 的特殊标记表示该副本不能担任 master 的角色,因此优先级为 0 的副本永远不会被 Redis Sentinel 选中进行提升。
#
# 默认优先级为 100。
replica-priority 100

# 传播错误行为控制 Redis 在无法处理从 master 复制流中处理的命令或从 AOF 文件中读取的命令时的行为。
# 传播过程中发生的错误是意外的,可能导致数据不一致。然而,在早期版本的 Redis 中,存在一些边缘情况,
# 服务器可能会复制或持久化在未来版本中会失败的命令。因此,默认行为是忽略此类错误并继续处理命令。
#
# 如果应用程序希望确保没有数据分歧,应将此配置设置为 'panic'。该值也可以设置为 'panic-on-replicas',
# 以仅在副本在复制流中遇到错误时 panic。一旦有足够的安全机制来防止误报崩溃,这两个 panic 值中的一个将成为未来的默认值。
#
# propagation-error-behavior ignore

# 副本忽略磁盘写入错误控制副本在无法将从 master 接收到的写入命令持久化到磁盘时的行为。
# 默认情况下,此配置设置为 'no',在这种情况下会崩溃副本。不建议更改此默认值,
# 但为了与旧版本的 Redis 兼容,可以将此配置切换为 'yes',这样只会记录警告并执行从 master 接收到的写入命令。
#
# replica-ignore-disk-write-errors no

# -----------------------------------------------------------------------------
# 默认情况下,Redis Sentinel 在其报告中包含所有副本。副本可以从 Redis Sentinel 的公告中排除。
# 未公告的副本将被 'sentinel replicas <master>' 命令忽略,并且不会暴露给 Redis Sentinel 的客户端。
#
# 此选项不会更改 replica-priority 的行为。即使将 replica-announced 设置为 'no',副本仍可以被提升为 master。
# 要防止此行为,请将 replica-priority 设置为 0。
#
# replica-announced yes

# 如果连接的副本少于 N 个,并且延迟小于或等于 M 秒,master 可能会停止接受写入。
#
# 这 N 个副本需要处于 "online" 状态。
#
# 延迟以秒为单位,必须 <= 指定的值,从副本接收到的最后一个 ping 计算,通常每秒发送一次。
#
# 此选项不保证 N 个副本会接受写入,但会在没有足够副本可用时将丢失写入的窗口限制为指定的秒数。
#
# 例如,要求至少 3 个副本,延迟 <= 10 秒:
#
# min-replicas-to-write 3
# min-replicas-max-lag 10
#
# 将其中一个设置为 0 会禁用该功能。
#
# 默认情况下,min-replicas-to-write 设置为 0(功能禁用),min-replicas-max-lag 设置为 10。

# Redis master 能够以不同方式列出连接的副本的地址和端口。例如,"INFO replication" 部分提供了此信息,
# Redis Sentinel 使用此信息来发现副本实例。另一个提供此信息的地方是 master 的 "ROLE" 命令的输出。
#
# 副本通常报告的 IP 地址和端口是通过以下方式获得的:
#
#   IP: 通过检查副本用于与 master 连接的套接字的对等地址自动检测。
#
#   Port: 端口在复制握手期间由副本通信,通常是副本用于监听连接的端口。
#
# 然而,当使用端口转发或网络地址转换(NAT)时,副本实际上可能通过不同的 IP 和端口对访问。
# 以下两个选项可以由副本使用,以向其 master 报告特定的 IP 和端口集,以便 INFO 和 ROLE 都会报告这些值。
#
# 如果只需要覆盖端口或 IP 地址,则无需同时使用这两个选项。
#
# replica-announce-ip 5.5.5.5
# replica-announce-port 1234

############################### 键跟踪 #################################

# Redis 实现了服务器辅助的客户端缓存支持。这是通过使用一个失效表来实现的,该表通过键名索引的基数键记住哪些客户端拥有哪些键。
# 反过来,这用于向客户端发送失效消息。请查看此页面以了解更多关于该功能的信息:
#   https://redis.io/topics/client-side-caching
#
# 当为客户端启用跟踪时,所有只读查询都被假定为缓存:这将强制 Redis 在失效表中存储信息。
# 当键被修改时,此类信息将被清除,并向客户端发送失效消息。
# 然而,如果工作负载主要由读取操作主导,Redis 可能会使用越来越多的内存来跟踪许多客户端获取的键。
# 因此,可以为失效表配置最大填充值。默认情况下,它设置为 100 万个键,
# 一旦达到此限制,Redis 将开始从失效表中驱逐键,即使它们未被修改,只是为了回收内存:这将反过来强制客户端使缓存的值失效。
# 基本上,表的最大大小是服务器端用于跟踪谁缓存了什么信息的内存与客户端在内存中保留缓存对象的能力之间的权衡。
#
# 如果将值设置为 0,则表示没有限制,Redis 将在失效表中保留尽可能多的键。
# 在 "stats" INFO 部分中,您可以找到有关失效表中键数的信息。
#
# 注意:当键跟踪以广播模式使用时,服务器端不使用内存,因此此设置无用。
#
# tracking-table-max-keys 1000000

################################## 安全性 ###################################

# 警告:由于 Redis 非常快,外部用户可以在现代机器上每秒尝试多达 100 万个密码。
# 这意味着您应该使用非常强的密码,否则它们将很容易被破解。
# 请注意,由于密码实际上是客户端和服务器之间的共享秘密,不应由任何人记住,
# 密码可以很容易地是来自 /dev/urandom 或其他来源的长字符串,因此通过使用长且不可猜测的密码,暴力攻击将不可能成功。
# Redis ACL 用户按以下格式定义:
#
#   user <用户名> ... acl 规则 ...
#
# 例如:
#
#   user worker +@list +@connection ~jobs:* on >ffa9203c493aa99
#
# 特殊用户名 "default" 用于新连接。如果此用户具有 "nopass" 规则,则新连接将立即作为 "default" 用户进行身份验证,
# 而无需通过 AUTH 命令提供任何密码。否则,如果 "default" 用户未标记为 "nopass",连接将以未认证状态启动,
# 并且需要 AUTH(或 HELLO 命令的 AUTH 选项)才能进行身份验证并开始工作。
#
# 描述用户可以执行的操作的 ACL 规则如下:
#
#  on           启用用户:可以以此用户身份进行身份验证。
#  off          禁用用户:不再可以以此用户身份进行身份验证,但已认证的连接仍将工作。
#  skip-sanitize-payload    RESTORE dump-payload 的清理被跳过。
#  sanitize-payload         RESTORE dump-payload 被清理(默认)。
#  +<命令>      允许执行该命令。
#               可以与 `|` 一起使用以允许子命令(例如 "+config|get")
#  -<命令>      禁止执行该命令。
#               可以与 `|` 一起使用以阻止子命令(例如 "-config|set")
#  +@<类别>     允许执行该类别中的所有命令
#               有效类别如 @admin, @set, @sortedset, ...
#               等等,请参阅 server.c 文件中的完整列表,其中描述了 Redis 命令表。
#               特殊类别 @all 表示所有命令,但当前存在于服务器中,并且将来会通过模块加载。
#  +<命令>|first-arg  允许特定命令的第一个参数,否则该命令被禁用。
#               仅支持没有子命令的命令,并且不允许以负形式使用,如 -SELECT|1,只能以 "+" 开头添加。此功能已弃用,可能会在未来移除。
#  allcommands  +@all 的别名。请注意,它意味着能够执行通过模块系统加载的所有未来命令。
#  nocommands   -@all 的别名。
#  ~<模式>      添加可以作为命令一部分提及的键模式。例如 ~* 允许所有键。模式是类似于 KEYS 的 glob 风格模式。
#               可以指定多个模式。
# %R~<模式>     添加键读取模式,指定可以从哪些键读取。
# %W~<模式>     添加键写入模式,指定可以写入哪些键。
#  allkeys      ~* 的别名。
#  resetkeys    清除允许的键模式列表。
#  &<模式>      添加用户可以访问的 Pub/Sub 频道的 glob 风格模式。可以指定多个频道模式。
#  allchannels  &* 的别名。
#  resetchannels            清除允许的频道模式列表。
#  ><密码>      将此密码添加到用户的有效密码列表中。
#               例如 >mypass 将 "mypass" 添加到列表中。
#               此指令清除 "nopass" 标志(见下文)。
#  <<密码>      从有效密码列表中删除此密码。
#  nopass       用户的所有设置密码都被移除,并且用户被标记为不需要密码:这意味着每个密码都可以对此用户进行身份验证。
#               如果此指令用于默认用户,则每个新连接将立即以默认用户身份进行身份验证,而无需任何显式的 AUTH 命令。
#               请注意,"resetpass" 指令将清除此条件。
#  resetpass    清除允许的密码列表。此外,移除 "nopass" 状态。在 "resetpass" 之后,用户没有关联的密码,
#               并且无法在不添加某些密码(或稍后将其设置为 "nopass")的情况下进行身份验证。
#  reset        执行以下操作:resetpass, resetkeys, off, -@all。用户返回到创建后立即所处的状态。
# (<选项>)      使用括号内指定的选项创建一个新的选择器,并将其附加到用户。每个选项应空格分隔。第一个字符必须是 (,最后一个字符必须是 )。
# clearselectors            移除所有当前附加的选择器。
#                           请注意,这不会更改 "root" 用户权限,这些权限是直接应用于用户的权限(括号外)。
#
# ACL 规则可以按任何顺序指定:例如,您可以从密码开始,然后是标志或键模式。
# 但请注意,加法和减法规则的含义将根据顺序而变化。例如,请参见以下示例:
#
#   user alice on +@all -DEBUG ~* >somepassword
#
# 这将允许 "alice" 使用除 DEBUG 命令之外的所有命令,因为 +@all 将所有命令添加到 alice 可以使用的命令集中,随后 DEBUG 被移除。
# 然而,如果我们颠倒两个 ACL 规则的顺序,结果将不同:
#
#   user alice on -DEBUG +@all ~* >somepassword
#
# 现在 DEBUG 在 alice 尚未有任何允许的命令集时被移除,随后所有命令被添加,因此用户将能够执行所有操作。
#
# 基本上,ACL 规则从左到右处理。
#
# 以下是命令类别及其含义的列表:
# * keyspace - 以类型无关的方式写入或读取键、数据库或其元数据。
# 包括 DEL, RESTORE, DUMP, RENAME, EXISTS, DBSIZE, KEYS, EXPIRE, TTL, FLUSHALL 等。
# 可能修改键空间、键或元数据的命令也将具有 `write` 类别。仅读取键空间、键或元数据的命令将具有 `read` 类别。
# * read - 从键(值或元数据)读取。请注意,不与键交互的命令将不具有 `read` 或 `write`。
# * write - 写入键(值或元数据)
# * admin - 管理命令。普通应用程序通常不需要使用这些。包括 REPLICAOF, CONFIG, DEBUG, SAVE, MONITOR, ACL, SHUTDOWN 等。
# * dangerous - 潜在危险的命令(每个都应仔细考虑各种原因)。
#               包括 FLUSHALL, MIGRATE, RESTORE, SORT, KEYS, CLIENT, DEBUG, INFO, CONFIG, SAVE, REPLICAOF 等。
# * connection - 影响连接或其他连接的命令。包括 AUTH, SELECT, COMMAND, CLIENT, ECHO, PING 等。
# * blocking - 可能阻塞连接直到被另一个命令释放。
# * fast - 快速的 O(1) 命令。可能会在参数数量上循环,但不会在键中的元素数量上循环。
# * slow - 所有非快速命令。
# * pubsub - PUBLISH / SUBSCRIBE 相关
# * transaction - WATCH / MULTI / EXEC 相关命令。
# * scripting - 脚本相关。
# * set - 数据类型:集合相关。
# * sortedset - 数据类型:有序集合相关。
# * list - 数据类型:列表相关。
# * hash - 数据类型:哈希相关。
# * string - 数据类型:字符串相关。
# * bitmap - 数据类型:位图相关。
# * hyperloglog - 数据类型:hyperloglog 相关。
# * geo - 数据类型:地理相关。
# * stream - 数据类型:流相关。
#
# 有关 ACL 配置的更多信息,请参阅 Redis 网站 https://redis.io/topics/acl

# ACL 日志
#
# ACL 日志跟踪与 ACL 相关的失败命令和身份验证事件。ACL 日志对于排查被 ACL 阻止的失败命令非常有用。
# ACL 日志存储在内存中。您可以使用 ACL LOG RESET 回收内存。定义 ACL 日志的最大条目长度如下。
acllog-max-len 128

# 使用外部 ACL 文件
#
# 可以在此文件中配置用户,也可以使用单独的文件列出用户。
# 这两种方法不能混合使用:如果您在此文件中配置用户,同时激活外部 ACL 文件,服务器将拒绝启动。
#
# 外部 ACL 用户文件的格式与 redis.conf 中用于描述用户的格式完全相同。
#
# aclfile /etc/redis/users.acl

# 重要提示:从 Redis 6 开始,"requirepass" 只是新 ACL 系统上的兼容层。
# 该选项的效果只是为默认用户设置密码。客户端仍然可以使用 AUTH <密码> 进行身份验证,
# 或者更明确地使用 AUTH default <密码>(如果它们遵循新协议):两者都可以工作。
#
# requirepass 与 aclfile 选项和 ACL LOAD 命令不兼容,这些将导致 requirepass 被忽略。
#
# requirepass foobared

# 新用户默认以限制性权限初始化,通过等效的 ACL 规则 'off resetkeys -@all'。
# 从 Redis 6.2 开始,还可以通过 ACL 规则管理对 Pub/Sub 频道的访问。
# 新用户的默认 Pub/Sub 频道权限由 acl-pubsub-default 配置指令控制,该指令接受以下值之一:
#
# allchannels: 授予对所有 Pub/Sub 频道的访问权限
# resetchannels: 撤销对所有 Pub/Sub 频道的访问权限
#
# 从 Redis 7.0 开始,acl-pubsub-default 默认为 'resetchannels' 权限。
#
# acl-pubsub-default resetchannels

# 命令重命名(已弃用)。
#
# ------------------------------------------------------------------------
# 警告:尽可能避免使用此选项。相反,使用 ACL 从默认用户中移除命令,并将它们仅放在您为管理目的创建的某个管理员用户中。
# ------------------------------------------------------------------------
#
# 可以在共享环境中更改危险命令的名称。例如,可以将 CONFIG 命令重命名为难以猜测的名称,以便它仍然可用于内部工具,但不适用于一般客户端。
#
# 示例:
#
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
#
# 也可以通过将命令重命名为空字符串来完全禁用命令:
#
# rename-command CONFIG ""
#
# 请注意,更改记录到 AOF 文件或传输到副本的命令的名称可能会导致问题。

################################### 客户端 ####################################

# 设置同时连接的最大客户端数量。默认情况下,这个限制设置为10000个客户端。
# 然而,如果Redis服务器无法将进程文件限制配置为允许指定的限制,
# 则允许的最大客户端数量将设置为当前文件限制减去32(因为Redis保留了一些文件描述符供内部使用)。
#
# 一旦达到限制,Redis将关闭所有新连接,并发送错误信息“达到最大客户端数量”。
#
# 重要提示:当使用Redis集群时,最大连接数也与集群总线共享:
# 集群中的每个节点将使用两个连接,一个用于传入,另一个用于传出。在非常大的集群中,适当调整此限制非常重要。
#
# maxclients 10000

############################## 内存管理 ################################

# 将内存使用限制设置为指定的字节数。当达到内存限制时,Redis将根据选择的驱逐策略尝试删除键(参见maxmemory-policy)。
#
# 如果Redis无法根据策略删除键,或者策略设置为“noeviction”,Redis将开始对使用更多内存的命令(如SET、LPUSH等)返回错误,
# 并继续响应只读命令(如GET)。
#
# 此选项通常在将Redis用作LRU或LFU缓存时有用,或者为实例设置硬内存限制(使用“noeviction”策略)。
#
# 警告:如果您将副本附加到启用了maxmemory的实例,则用于向副本提供数据的输出缓冲区的大小将从已用内存计数中减去,
# 以便网络问题/重新同步不会触发一个循环,其中键被驱逐,进而副本的输出缓冲区充满了被驱逐键的DEL命令,触发更多键的删除,
# 依此类推,直到数据库完全清空。
#
# 简而言之...如果您附加了副本,建议为maxmemory设置较低的限制,
# 以便系统上有一些空闲的RAM用于副本的输出缓冲区(但如果策略是“noeviction”,则不需要这样做)。
#
# maxmemory <字节数>

# MAXMEMORY策略:当达到maxmemory时,Redis将如何选择要删除的内容。您可以从以下行为中选择一个:
#
# volatile-lru -> 使用近似LRU驱逐,仅驱逐设置了过期时间的键。
# allkeys-lru -> 使用近似LRU驱逐任何键。
# volatile-lfu -> 使用近似LFU驱逐,仅驱逐设置了过期时间的键。
# allkeys-lfu -> 使用近似LFU驱逐任何键。
# volatile-random -> 随机删除设置了过期时间的键。
# allkeys-random -> 随机删除任何键。
# volatile-ttl -> 删除具有最近过期时间的键(较小的TTL)。
# noeviction -> 不驱逐任何内容,仅在写操作时返回错误。
#
# LRU表示最近最少使用
# LFU表示最不经常使用
#
# LRU、LFU和volatile-ttl都是使用近似的随机算法实现的。
#
# 注意:对于上述任何策略,当没有合适的键可以驱逐时,Redis将对需要更多内存的写操作返回错误。
# 这些通常是创建新键、添加数据或修改现有键的命令。
# 一些示例包括:SET、INCR、HSET、LPUSH、SUNIONSTORE、SORT(由于STORE参数)和EXEC(如果事务包含任何需要内存的命令)。
#
# 默认值为:
#
# maxmemory-policy noeviction

# LRU、LFU和最小TTL算法不是精确算法,而是近似算法(为了节省内存),因此您可以调整它以获得速度或准确性。
# 默认情况下,Redis将检查五个键并选择最近最少使用的键,您可以使用以下配置指令更改样本大小。
#
# 默认值为5,产生足够好的结果。10非常接近真正的LRU,但消耗更多的CPU。3更快但不太准确。
#
# maxmemory-samples 5

# 驱逐处理设计为在默认设置下运行良好。如果有异常大量的写流量,可能需要增加此值。减少此值可能会降低延迟,但会降低驱逐处理的有效性。
#   0 = 最小延迟,10 = 默认值,100 = 不考虑延迟的处理
#
# maxmemory-eviction-tenacity 10

# 从Redis 5开始,默认情况下副本将忽略其maxmemory设置(除非在故障转移后或手动提升为主节点)。
# 这意味着键的驱逐将由主节点处理,主节点在驱逐键时向副本发送DEL命令。
#
# 这种行为确保主节点和副本保持一致,通常是您想要的,但如果您的副本是可写的,
# 或者您希望副本具有不同的内存设置,并且您确定对副本执行的所有写操作都是幂等的,那么您可以更改此默认值(但请确保您理解自己在做什么)。
#
# 请注意,由于副本默认情况下不驱逐键,它最终可能会使用比通过maxmemory设置的更多的内存
#(某些缓冲区在副本上可能更大,或者数据结构有时可能占用更多内存等)。
# 因此,请确保您监控您的副本,并确保它们有足够的内存,以便在主节点达到配置的maxmemory设置之前永远不会遇到真正的内存不足情况。
#
# replica-ignore-maxmemory yes

# Redis以两种方式回收过期键:在访问时发现这些键已过期,以及在后台进行所谓的“主动过期键”操作。
# 键空间被缓慢且交互式地扫描,寻找要回收的过期键,以便可以释放那些已过期且短时间内不会再被访问的键的内存。
#
# 默认的过期周期努力避免内存中有超过10%的过期键,并尝试避免消耗超过总内存的25%并增加系统延迟。
# 然而,可以增加通常设置为“1”的过期“努力”值,最大值为“10”。
# 在最大值时,系统将使用更多的CPU,更长的周期(技术上可能会引入更多的延迟),并且将容忍更少的已过期键仍然存在于系统中。
# 这是在内存、CPU和延迟之间的权衡。
#
# active-expire-effort 1

############################# 延迟释放 ####################################

# Redis有两个删除键的原语。一个称为DEL,是对象的阻塞删除。
# 这意味着服务器停止处理新命令,以便以同步方式回收与对象关联的所有内存。
# 如果删除的键与一个小对象关联,则执行DEL命令所需的时间非常短,并且与Redis中的大多数其他O(1)或O(log_N)命令相当。
# 然而,如果键与包含数百万个元素的聚合值关联,则服务器可能会阻塞很长时间(甚至几秒钟)以完成操作。
#
# 出于上述原因,Redis还提供了非阻塞删除原语,例如UNLINK(非阻塞DEL)和FLUSHALL和FLUSHDB命令的ASYNC选项,以便在后台回收内存。
# 这些命令在恒定时间内执行。另一个线程将尽可能快地在后台逐步释放对象。
#
# DEL、UNLINK和FLUSHALL和FLUSHDB的ASYNC选项由用户控制。
# 应用程序的设计需要理解何时使用其中一个或另一个是一个好主意。
# 然而,Redis服务器有时必须作为其他操作的副作用删除键或刷新整个数据库。具体来说,Redis在以下情况下独立于用户调用删除对象:
#
# 1) 在驱逐时,由于maxmemory和maxmemory策略配置,为了为新数据腾出空间,而不超过指定的内存限制。
# 2) 由于过期:当必须从内存中删除具有关联生存时间的键时(参见EXPIRE命令)。
# 3) 由于存储数据的命令的副作用,该命令可能已经存在的键。例如,RENAME命令可能会在替换旧键内容时删除旧键内容。
#    同样,SUNIONSTORE或带有STORE选项的SORT可能会删除现有键。SET命令本身会删除指定键的任何旧内容,以便用指定的字符串替换它。
# 4) 在复制期间,当副本与其主节点执行完全重新同步时,整个数据库的内容将被删除,以便加载刚刚传输的RDB文件。
#
# 在上述所有情况下,默认是以阻塞方式删除对象,就像调用了DEL一样。
# 然而,您可以使用以下配置指令专门配置每种情况,以便以非阻塞方式释放内存,就像调用了UNLINK一样。

lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no

# 对于替换用户代码中的DEL调用为UNLINK调用不容易的情况,还可以使用以下配置指令修改DEL命令的默认行为,使其完全像UNLINK一样:

lazyfree-lazy-user-del no

# FLUSHDB、FLUSHALL、SCRIPT FLUSH和FUNCTION FLUSH支持异步和同步删除,可以通过向命令传递[SYNC|ASYNC]标志来控制。
# 当未传递任何标志时,将使用此指令来确定是否应异步删除数据。

lazyfree-lazy-user-flush no

################################ 线程化 I/O #################################

# Redis 主要是单线程的,但有一些线程化的操作,例如 UNLINK、慢速 I/O 访问等,这些操作在辅助线程中执行。
#
# 现在也可以在多个 I/O 线程中处理 Redis 客户端的套接字读写。
# 由于写操作特别慢,通常 Redis 用户使用流水线来加速每个核心的 Redis 性能,并通过生成多个实例来扩展。
# 使用 I/O 线程可以轻松地将 Redis 性能提高两倍,而无需使用流水线或实例分片。
#
# 默认情况下线程化是禁用的,我们建议仅在至少有 4 个或更多核心的机器上启用,并至少保留一个备用核心。
# 使用超过 8 个线程不太可能有太大帮助。我们还建议仅在确实存在性能问题时使用线程化 I/O,
# Redis 实例能够使用相当大比例的 CPU 时间,否则使用此功能没有意义。
#
# 例如,如果你有一个四核机器,尝试使用 2 或 3 个 I/O 线程;如果你有一个八核机器,尝试使用 6 个线程。
# 要启用 I/O 线程,请使用以下配置指令:
#
# io-threads 4
#
# 将 io-threads 设置为 1 将像往常一样仅使用主线程。
# 当启用 I/O 线程时,我们仅将线程用于写操作,即线程化 write(2) 系统调用并将客户端缓冲区传输到套接字。
# 然而,也可以通过将以下配置指令设置为 yes 来启用读操作和协议解析的线程化:
#
# io-threads-do-reads no
#
# 通常线程化读操作没有太大帮助。
#
# 注意 1:此配置指令无法在运行时通过 CONFIG SET 更改。此外,当前在启用 SSL 时此功能无法使用。
#
# 注意 2:如果你想使用 redis-benchmark 测试 Redis 加速效果,请确保你也在线程模式下运行基准测试,
# 使用 --threads 选项来匹配 Redis 线程数,否则你将无法注意到改进。

############################ 内核 OOM 控制 ##############################

# 在 Linux 上,可以提示内核 OOM 杀手在内存不足时应首先杀死哪些进程。
#
# 启用此功能后,Redis 会根据其角色主动控制所有进程的 oom_score_adj 值。
# 默认分数将尝试在所有其他进程之前杀死后台子进程,并在主进程之前杀死副本。
#
# Redis 支持以下选项:
#
# no:       不更改 oom-score-adj(默认)。
# yes:      "relative" 的别名,见下文。
# absolute: oom-score-adj-values 中的值按原样写入内核。
# relative: 值相对于服务器启动时 oom_score_adj 的初始值使用,然后被限制在 -1000 到 1000 的范围内。
# 因为通常初始值为 0,它们通常与绝对值匹配。
oom-score-adj no

# 当使用 oom-score-adj 时,此指令控制用于主进程、副本和后台子进程的特定值。值范围为 -2000 到 2000(值越高越容易被杀死)。
#
# 非特权进程(非 root,且没有 CAP_SYS_RESOURCE 能力)可以自由增加其值,但不能将其降低到初始设置以下。
# 这意味着将 oom-score-adj 设置为 "relative" 并将 oom-score-adj-values 设置为正值将始终成功。
oom-score-adj-values 0 200 800


#################### 内核透明大页控制 ######################

# 通常内核透明大页控制默认设置为 "madvise" 或 "never"(/sys/kernel/mm/transparent_hugepage/enabled),在这种情况下此配置无效。
# 在设置为 "always" 的系统上,Redis 将尝试为 Redis 进程专门禁用它,以避免 fork(2) 和 CoW 的延迟问题。
# 如果出于某种原因你希望保持启用状态,可以将此配置设置为 "no",并将内核全局设置为 "always"。

disable-thp yes

############################## 仅追加模式 ###############################

# 默认情况下,Redis 异步将数据集转储到磁盘。这种模式在许多应用程序中已经足够好,
# 但 Redis 进程问题或电源故障可能导致几分钟的写入丢失(取决于配置的保存点)。
#
# 仅追加文件是一种替代的持久化模式,提供了更好的持久性。
# 例如,使用默认的数据 fsync 策略(见配置文件后面的部分),
# Redis 在服务器电源故障等严重事件中可能仅丢失一秒钟的写入,或者在 Redis 进程本身发生问题时仅丢失一次写入,但操作系统仍在正常运行。
#
# AOF 和 RDB 持久化可以同时启用而不会出现问题。如果在启动时启用了 AOF,Redis 将加载 AOF 文件,该文件具有更好的持久性保证。
#
# 更多信息请查看 https://redis.io/topics/persistence。

appendonly no

# 仅追加文件的基本名称。
#
# Redis 7 及更高版本使用一组仅追加文件来持久化数据集及其更改。使用的基本文件类型有两种:
#
# - 基本文件,表示文件创建时数据集的完整状态。基本文件可以是 RDB(二进制序列化)或 AOF(文本命令)形式。
# - 增量文件,包含在前一个文件之后应用于数据集的附加命令。
#
# 此外,清单文件用于跟踪文件及其创建顺序和应用顺序。
#
# 仅追加文件名由 Redis 根据特定模式创建。文件名的前缀基于 'appendfilename' 配置参数,后跟有关序列和类型的附加信息。
#
# 例如,如果 appendfilename 设置为 appendonly.aof,可以派生出以下文件名:
#
# - appendonly.aof.1.base.rdb 作为基本文件。
# - appendonly.aof.1.incr.aof, appendonly.aof.2.incr.aof 作为增量文件。
# - appendonly.aof.manifest 作为清单文件。

appendfilename "appendonly.aof"

# 为了方便,Redis 将所有持久化的仅追加文件存储在一个专用目录中。目录的名称由 appenddirname 配置参数确定。

appenddirname "appendonlydir"

# fsync() 调用告诉操作系统实际将数据写入磁盘,而不是等待输出缓冲区中的更多数据。
# 某些操作系统会真正将数据刷新到磁盘,而其他操作系统只会尽快尝试这样做。
#
# Redis 支持三种不同的模式:
#
# no: 不进行 fsync,让操作系统在需要时刷新数据。更快。
# always: 每次写入仅追加日志后进行 fsync。较慢,最安全。
# everysec: 每秒仅进行一次 fsync。折衷方案。
#
# 默认是 "everysec",因为这通常是速度和数据安全性之间的正确折衷。
# 你可以根据情况决定是否可以将其放宽为 "no",让操作系统在需要时刷新输出缓冲区,以获得更好的性能
# (但如果你能接受一些数据丢失,可以考虑使用默认的快照持久化模式),或者相反,使用 "always",虽然非常慢,但比 everysec 更安全。
#
# 更多详情请查看以下文章:
# http://antirez.com/post/redis-persistence-demystified.html
#
# 如果不确定,请使用 "everysec"。

# appendfsync always
appendfsync everysec
# appendfsync no

# 当 AOF fsync 策略设置为 always 或 everysec,并且后台保存进程(后台保存或 AOF 日志后台重写)正在对磁盘执行大量 I/O 操作时,
# 在某些 Linux 配置中,Redis 可能会在 fsync() 调用上阻塞太长时间。
# 请注意,目前没有解决此问题的方法,因为即使在不同的线程中执行 fsync 也会阻塞我们的同步 write(2) 调用。
#
# 为了缓解此问题,可以使用以下选项,该选项将防止在主进程中进行 BGSAVE 或 BGREWRITEAOF 时调用 fsync()。
#
# 这意味着当另一个子进程正在保存时,Redis 的持久性与 "appendfsync no" 相同。
# 实际上,这意味着在最坏的情况下(使用默认的 Linux 设置)可能会丢失最多 30 秒的日志。
#
# 如果你有延迟问题,请将其设置为 "yes"。否则,请保持为 "no",这是从持久性角度来看最安全的选择。

no-appendfsync-on-rewrite no

# 自动重写仅追加文件。
# Redis 能够在 AOF 日志大小增长到指定百分比时隐式调用 BGREWRITEAOF 自动重写日志文件。
#
# 工作原理如下:Redis 记住最新重写后的 AOF 文件大小(如果自重启以来未发生重写,则使用启动时的 AOF 大小)。
#
# 将此基本大小与当前大小进行比较。如果当前大小大于指定百分比,则触发重写。
# 此外,你还需要指定 AOF 文件重写的最小大小,这对于避免在达到百分比增长但文件仍然很小的情况下重写 AOF 文件非常有用。
#
# 指定百分比为零以禁用自动 AOF 重写功能。

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 在 Redis 启动过程中,当 AOF 数据加载回内存时,可能会发现 AOF 文件在末尾被截断。
# 这可能发生在运行 Redis 的系统崩溃时,特别是在 ext4 文件系统未使用 data=ordered 选项挂载时
# (然而,当 Redis 本身崩溃或中止但操作系统仍在正常运行时,这种情况不会发生)。
#
# Redis 可以在此情况下退出并报错,或者尽可能多地加载数据(现在是默认行为)并在发现 AOF 文件在末尾被截断时启动。以下选项控制此行为。
#
# 如果 aof-load-truncated 设置为 yes,则加载被截断的 AOF 文件,并且 Redis 服务器开始发出日志以通知用户该事件。
# 否则,如果选项设置为 no,服务器将报错并拒绝启动。当选项设置为 no 时,用户需要在重新启动服务器之前使用 "redis-check-aof" 工具修复 AOF 文件。
#
# 请注意,如果 AOF 文件在中间被发现损坏,服务器仍将报错退出。此选项仅适用于 Redis 尝试从 AOF 文件读取更多数据但未找到足够字节的情况。
aof-load-truncated yes

# Redis 可以以 RDB 或 AOF 格式创建仅追加基本文件。使用 RDB 格式总是更快、更高效,禁用此功能仅出于向后兼容的目的。
aof-use-rdb-preamble yes

# Redis 支持在 AOF 中记录时间戳注释,以支持从特定时间点恢复数据。然而,使用此功能会以可能不兼容现有 AOF 解析器的方式更改 AOF 格式。
aof-timestamp-enabled no

################################ 关闭 #####################################

# 关闭时等待副本的最长时间,以秒为单位。
#
# 在关闭期间,宽限期允许任何滞后的副本在主机退出之前赶上最新的复制偏移量。此期间可以防止数据丢失,特别是对于未配置磁盘备份的部署。
#
# 'shutdown-timeout' 值是宽限期的持续时间,以秒为单位。仅当实例有副本时适用。要禁用此功能,请将值设置为 0。
#
# shutdown-timeout 10

# 当 Redis 收到 SIGINT 或 SIGTERM 时,将启动关闭操作,默认情况下,如果配置了保存点,则会以阻塞操作将 RDB 快照写入磁盘。
# 在信号关闭时使用的选项可以包括以下值:
# default:  仅在配置了保存点时保存 RDB 快照。
#           等待滞后的副本赶上。
# save:     即使未配置保存点,也强制进行数据库保存操作。
# nosave:   即使配置了一个或多个保存点,也阻止数据库保存操作。
# now:      跳过等待滞后的副本。
# force:    忽略通常会阻止服务器退出的任何错误。
#
# 只要不同时设置 "save" 和 "nosave",任何组合值都是允许的。
# 例如:"nosave force now"
#
# shutdown-on-sigint default
# shutdown-on-sigterm default

################ 非确定性长阻塞命令 #####################

# EVAL 脚本、函数和某些情况下模块命令的最大时间(以毫秒为单位),在此之后 Redis 可以开始处理或拒绝其他客户端。
#
# 如果达到最大执行时间,Redis 将开始对大多数命令回复 BUSY 错误。
#
# 在此状态下,Redis 仅允许执行少数命令。例如,SCRIPT KILL、FUNCTION KILL、SHUTDOWN NOSAVE 以及可能的某些模块特定的 'allow-busy' 命令。
#
# SCRIPT KILL 和 FUNCTION KILL 只能停止尚未调用任何写命令的脚本,
# 因此 SHUTDOWN NOSAVE 可能是停止服务器的唯一方法,如果脚本在用户不想等待脚本自然终止时已经发出了写命令。
#
# 默认值为 5 秒。可以将其设置为 0 或负值以禁用此机制(不间断执行)。请注意,过去此配置有不同的名称,现在是别名,因此以下两者作用相同:
# lua-time-limit 5000
# busy-reply-threshold 5000

################################ REDIS 集群  ###############################

# 普通的 Redis 实例不能成为 Redis 集群的一部分;只有作为集群节点启动的节点才能加入集群。
# 要将 Redis 实例作为集群节点启动,请取消注释以下内容以启用集群支持:
#
# cluster-enabled yes

# 每个集群节点都有一个集群配置文件。该文件不应手动编辑。它由 Redis 节点创建和更新。
# 每个 Redis 集群节点都需要一个不同的集群配置文件。确保在同一系统中运行的实例没有重叠的集群配置文件名。
#
# cluster-config-file nodes-6379.conf

# 集群节点超时是指节点在多少毫秒内无法访问时被视为故障状态。
# 大多数其他内部时间限制是节点超时的倍数。
#
# cluster-node-timeout 15000

# 集群端口是集群总线监听入站连接的端口。当设置为默认值 0 时,它将绑定到命令端口 + 10000。
# 设置此值需要在执行 cluster meet 时指定集群总线端口。
# cluster-port 0

# 如果主节点故障,其副本的数据看起来太旧,副本将避免启动故障转移。
#
# 副本无法简单地精确测量其“数据年龄”,因此执行以下两项检查:
#
# 1) 如果有多个副本能够进行故障转移,它们会交换消息,以尝试让具有最佳复制偏移量(处理了更多主节点数据)的副本获得优势。
#    副本将尝试通过偏移量获得其排名,并在故障转移开始时应用与其排名成比例的延迟。
#
# 2) 每个副本计算与主节点的最后一次交互时间。这可以是最后一次 ping 或接收到的命令(如果主节点仍处于“连接”状态),
#    或者自与主节点断开连接以来经过的时间(如果复制链路当前已断开)。
#    如果最后一次交互时间太旧,副本将不会尝试进行故障转移。
#
# 第 2 点可以由用户调整。具体来说,如果自上次与主节点交互以来经过的时间大于以下值,副本将不会执行故障转移:
#
#   (node-timeout * cluster-replica-validity-factor) + repl-ping-replica-period
#
# 例如,如果 node-timeout 为 30 秒,cluster-replica-validity-factor 为 10,
# 并且假设默认的 repl-ping-replica-period 为 10 秒,则如果副本无法与主节点通信超过 310 秒,它将不会尝试进行故障转移。
#
# 较大的 cluster-replica-validity-factor 可能允许数据过旧的副本对主节点进行故障转移,而较小的值可能会阻止集群选举任何副本。
#
# 为了获得最大可用性,可以将 cluster-replica-validity-factor 设置为 0,
# 这意味着副本将始终尝试对主节点进行故障转移,无论它们上次与主节点交互的时间如何。
# (然而,它们总是会尝试应用与其偏移量排名成比例的延迟)。
#
# 0 是唯一能够保证在所有分区恢复后集群始终能够继续的值。
#
# cluster-replica-validity-factor 10

# 集群副本可以迁移到孤立的主节点,即没有工作副本的主节点。
# 这提高了集群的故障抵抗能力,否则在没有工作副本的情况下,孤立的主节点在发生故障时无法进行故障转移。
#
# 副本只有在旧主节点仍有至少给定数量的其他工作副本时才会迁移到孤立的主节点。这个数量是“迁移屏障”。
# 迁移屏障为 1 意味着副本只有在主节点至少有一个其他工作副本时才会迁移,依此类推。它通常反映了您希望集群中每个主节点拥有的副本数量。
#
# 默认值为 1(副本仅在其主节点至少保留一个副本时迁移)。
# 要禁用迁移,只需将其设置为非常大的值或将 cluster-allow-replica-migration 设置为 'no'。
# 可以设置为 0,但这仅对调试有用,在生产环境中是危险的。
#
# cluster-migration-barrier 1

# 关闭此选项可以减少自动集群配置的使用。它同时禁用了向孤立主节点的迁移和从空主节点的迁移。
#
# 默认值为 'yes'(允许自动迁移)。
#
# cluster-allow-replica-migration yes

# 默认情况下,如果 Redis 集群节点检测到至少有一个哈希槽未被覆盖(没有可用节点为其提供服务),它们将停止接受查询。
# 这样,如果集群部分宕机(例如,某个范围的哈希槽不再被覆盖),整个集群最终将变得不可用。
# 一旦所有槽再次被覆盖,它将自动恢复可用。
#
# 然而,有时您希望集群中仍在工作的部分继续接受对仍然覆盖的键空间的查询。为此,只需将 cluster-require-full-coverage 选项设置为 no。
#
# cluster-require-full-coverage yes

# 此选项设置为 yes 时,可以防止副本在主节点故障期间尝试对其进行故障转移。但是,副本仍然可以执行手动故障转移,如果被迫这样做。
#
# 这在不同的场景中很有用,尤其是在多数据中心操作的情况下,我们希望在一侧永远不会被提升,除非在完全数据中心故障的情况下。
#
# cluster-replica-no-failover no

# 此选项设置为 yes 时,允许节点在集群处于宕机状态时继续提供读取流量,只要它认为自己拥有这些槽。
#
# 这在两种情况下很有用。第一种情况是当应用程序在节点故障或网络分区期间不需要数据一致性时。
# 一个例子是缓存,只要节点有数据,它就应该能够提供服务。
#
# 第二种情况是对于不符合推荐的三分片配置但希望启用集群模式并在以后扩展的配置。
# 在 1 或 2 分片配置中,主节点故障会导致整个集群的读写中断,如果没有设置此选项,设置后只有写中断。
# 如果没有主节点的法定人数,槽的所有权不会自动更改。
#
# cluster-allow-reads-when-down no

# 此选项设置为 yes 时,允许节点在集群处于宕机状态时继续提供 pubsub 分片流量,只要它认为自己拥有这些槽。
#
# 如果应用程序希望在集群全局稳定状态不正常时仍使用 pubsub 功能,这很有用。
# 如果应用程序希望确保只有一个分片为给定频道提供服务,则应保持此功能为 yes。
#
# cluster-allow-pubsubshard-when-down yes

# 集群链路发送缓冲区限制是单个集群总线链路的发送缓冲区内存使用限制(以字节为单位)。
# 如果超过此限制,集群链路将被释放。这主要是为了防止发送缓冲区在向慢速对等节点(例如,PubSub 消息堆积)的链路上无限增长。
# 默认情况下,此限制是禁用的。
# 当 'mem_cluster_links' INFO 字段和/或 'CLUSTER LINKS' 命令输出中的 'send-buffer-allocated' 条目持续增加时,启用此限制。
# 建议最小限制为 1gb,以便集群链路缓冲区至少可以容纳一个默认的 PubSub 消息。(client-query-buffer-limit 默认值为 1gb)
#
# cluster-link-sendbuf-limit 0
 
# 集群可以使用此配置来配置其宣布的主机名。这是需要使用 TLS 服务器名称指示(SNI)或处理基于 DNS 的路由的应用程序的常见用例。
# 默认情况下,此值仅作为 CLUSTER SLOTS 命令中的附加元数据显示,但可以使用 'cluster-preferred-endpoint-type' 配置进行更改。
# 此值通过集群总线传播到所有节点,将其设置为空字符串将删除主机名并传播删除。
#
# cluster-announce-hostname ""

# 集群可以宣传客户端应如何连接到它们,使用它们的 IP 地址、用户定义的主机名,或声明它们没有端点。
# 通过使用 cluster-preferred-endpoint-type 配置设置为 'ip'、'hostname' 或 'unknown-endpoint' 来显示首选端点。
# 此值控制 MOVED/ASKING 请求返回的端点以及 CLUSTER SLOTS 的第一个字段。
# 如果首选端点类型设置为 hostname,但未设置宣布的主机名,则将返回 '?'。
#
# 当集群宣传自己具有未知端点时,表示服务器不知道客户端如何到达集群。
# 这可能在某种网络情况下发生,其中有多个可能的节点路由,服务器不知道客户端采用了哪一条。
# 在这种情况下,服务器期望客户端使用与上次请求相同的端点进行连接,但使用响应中提供的端口。
#
# cluster-preferred-endpoint-type ip

# 为了设置您的集群,请确保阅读 https://redis.io 网站上的文档。

########################## 集群 Docker/NAT 支持  ########################

# 在某些部署中,Redis 集群节点地址发现失败,因为地址被 NAT 转换或端口被转发(典型情况是 Docker 和其他容器)。
#
# 为了使 Redis 集群在此类环境中工作,需要一个静态配置,其中每个节点都知道其公共地址。以下四个选项用于此目的:
#
# * cluster-announce-ip
# * cluster-announce-port
# * cluster-announce-tls-port
# * cluster-announce-bus-port
#
# 每个选项都指示节点其地址、客户端端口(用于无 TLS 和有 TLS 的连接)和集群消息总线端口。
# 然后,这些信息将发布在总线数据包的头部,以便其他节点能够正确映射发布信息的节点的地址。
#
# 如果 cluster-tls 设置为 yes 并且 cluster-announce-tls-port 被省略或设置为零,
# 则 cluster-announce-port 指的是 TLS 端口。请注意,如果 cluster-tls 设置为 no,则 cluster-announce-tls-port 无效。
#
# 如果不使用上述选项,则将使用正常的 Redis 集群自动检测。
#
# 请注意,当重新映射时,总线端口可能不在客户端端口 + 10000 的固定偏移处,因此您可以根据它们的重新映射方式指定任何端口和总线端口。
# 如果未设置总线端口,则将使用通常的 10000 固定偏移。
#
# 示例:
#
# cluster-announce-ip 10.1.1.5
# cluster-announce-tls-port 6379
# cluster-announce-port 0
# cluster-announce-bus-port 6380

################################## 慢日志 ###################################

# Redis 慢日志是一个系统,用于记录超过指定执行时间的查询。
# 执行时间不包括与客户端通信、发送回复等 I/O 操作,而仅包括实际执行命令所需的时间
# (这是命令执行的唯一阶段,线程被阻塞,无法在此期间服务其他请求)。
#
# 您可以使用两个参数配置慢日志:一个告诉 Redis 执行时间(以微秒为单位)超过多少时命令会被记录,
# 另一个参数是慢日志的长度。当记录新命令时,最旧的命令将从记录的命令队列中删除。

# 以下时间以微秒表示,因此 1000000 相当于一秒。请注意,负数会禁用慢日志,而零值会强制记录每个命令。
slowlog-log-slower-than 10000

# 此长度没有限制。只需注意它会消耗内存。您可以使用 SLOWLOG RESET 回收慢日志使用的内存。
slowlog-max-len 128

################################ 延迟监控 ##############################

# Redis 延迟监控子系统在运行时对不同的操作进行采样,以收集与 Redis 实例可能的延迟源相关的数据。
#
# 通过 LATENCY 命令,用户可以打印图表并获取报告。
#
# 系统仅记录执行时间等于或大于通过 latency-monitor-threshold 配置指令指定的毫秒数的操作。当其值设置为零时,延迟监控将关闭。
#
# 默认情况下,延迟监控是禁用的,因为如果您没有延迟问题,通常不需要它,
# 并且收集数据会对性能产生影响,虽然非常小,但在大负载下可以测量到。
# 如果需要,可以使用命令 "CONFIG SET latency-monitor-threshold <毫秒>" 在运行时轻松启用延迟监控。
latency-monitor-threshold 0

################################ 延迟跟踪 ##############################

# Redis 扩展延迟监控跟踪每个命令的延迟,并允许通过 INFO latencystats 命令导出百分位分布,
# 以及通过 LATENCY 命令导出累积延迟分布(直方图)。
#
# 默认情况下,扩展延迟监控是启用的,因为跟踪命令延迟的开销非常小。
# latency-tracking yes

# 默认情况下,通过 INFO latencystats 命令导出的延迟百分位是 p50、p99 和 p999。
# latency-tracking-info-percentiles 50 99 99.9

############################# 事件通知 ##############################

# Redis 可以通知 Pub/Sub 客户端关于键空间中发生的事件。
# 此功能的文档位于 https://redis.io/topics/notifications
#
# 例如,如果启用了键空间事件通知,并且客户端在数据库 0 中对键 "foo" 执行了 DEL 操作,
# 将通过 Pub/Sub 发布两条消息:
#
# PUBLISH __keyspace@0__:foo del
# PUBLISH __keyevent@0__:del foo
#
# 可以选择 Redis 将通知的事件类别。每个类别由一个字符标识:
#
#  K     键空间事件,以 __keyspace@<db>__ 前缀发布。
#  E     键事件事件,以 __keyevent@<db>__ 前缀发布。
#  g     通用命令(非类型特定),如 DEL、EXPIRE、RENAME 等。
#  $     字符串命令
#  l     列表命令
#  s     集合命令
#  h     哈希命令
#  z     有序集合命令
#  x     过期事件(每次键过期时生成的事件)
#  e     驱逐事件(当键因 maxmemory 被驱逐时生成的事件)
#  n     新键事件(注意:不包括在 'A' 类中)
#  t     流命令
#  d     模块键类型事件
#  m     键未命中事件(注意:不包括在 'A' 类中)
#  A     g$lshzxetd 的别名,因此 "AKE" 字符串表示所有事件
#        (不包括键未命中事件,由于其独特性,它们被排除在 'A' 之外)。
#
#  "notify-keyspace-events" 接受一个由零个或多个字符组成的字符串作为参数。空字符串表示通知被禁用。
#
#  示例:要启用列表和通用事件,从事件名称的角度来看,使用:
#
#  notify-keyspace-events Elg
#
#  示例 2:要获取过期键的流,订阅频道名称 __keyevent@0__:expired,使用:
#
#  notify-keyspace-events Ex
#
#  默认情况下,所有通知都被禁用,因为大多数用户不需要此功能,并且该功能有一些开销。请注意,如果未指定至少一个 K 或 E,则不会传递任何事件。
notify-keyspace-events ""

############################### 高级配置 ###############################

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

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

# 列表也可以被压缩。
# 压缩深度是从列表的*每*一侧*排除*压缩的快速列表 ziplist 节点的数量。列表的头部和尾部始终未压缩,以便快速进行 push/pop 操作。设置如下:
# 0: 禁用所有列表压缩
# 1: 深度 1 表示“在列表中的 1 个节点之后才开始压缩,从头部或尾部开始”
#    因此:[head]->node->node->...->node->[tail]
#    [head], [tail] 将始终未压缩;内部节点将压缩。
# 2: [head]->[next]->node->node->...->node->[prev]->[tail]
#    2 表示:不压缩 head 或 head->next 或 tail->prev 或 tail,
#    但压缩它们之间的所有节点。
# 3: [head]->[next]->[next]->node->node->...->node->[prev]->[prev]->[tail]
# 等等。
list-compress-depth 0

# 集合在一种特殊情况下具有特殊编码:当集合仅由恰好是 64 位有符号整数范围内的十进制整数的字符串组成时。
# 以下配置设置设置了集合的大小限制,以便使用这种特殊的内存节省编码。
set-max-intset-entries 512

# 类似于哈希和列表,有序集合也以特殊方式编码以节省大量空间。此编码仅在有序集合的长度和元素低于以下限制时使用:
zset-max-listpack-entries 128
zset-max-listpack-value 64

# HyperLogLog 稀疏表示字节限制。该限制包括 16 字节的头部。当使用稀疏表示的 HyperLogLog 超过此限制时,它将转换为密集表示。
#
# 大于 16000 的值完全无用,因为在这一点上,密集表示更节省内存。
#
# 建议值为 ~ 3000,以便在不显著减慢 PFADD 的情况下获得空间高效编码的好处,PFADD 在使用稀疏编码时为 O(N)。
# 当 CPU 不是问题但空间是问题时,可以将该值提高到 ~ 10000,并且数据集由许多基数在 0 - 15000 范围内的 HyperLogLog 组成。
hll-sparse-max-bytes 3000

# 流宏节点最大大小 / 项目。流数据结构是一个大节点的基数树,这些节点内部编码多个项目。
# 使用此配置可以配置单个节点的大小(以字节为单位),以及在追加新流条目之前它可以包含的最大项目数。
# 如果以下任何设置设置为零,则忽略该限制,因此例如可以通过将 max-bytes 设置为 0 并将 max-entries 设置为所需值来仅设置最大条目限制。
stream-node-max-bytes 4096
stream-node-max-entries 100

# 主动重哈希每 100 毫秒 CPU 时间使用 1 毫秒来帮助重哈希主 Redis 哈希表(将顶级键映射到值的哈希表)。
# Redis 使用的哈希表实现(参见 dict.c)执行惰性重哈希:
# 您在重哈希的哈希表上运行的操作越多,执行的“步骤”就越多,因此如果服务器空闲,重哈希永远不会完成,哈希表会使用更多内存。
#
# 默认情况下,每秒使用此毫秒 10 次以主动重哈希主字典,尽可能释放内存。
#
# 如果不确定:
# 如果您有严格的延迟要求,并且 Redis 偶尔以 2 毫秒的延迟回复查询在您的环境中不是好事,请使用 "activerehashing no"。
#
# 如果您没有如此严格的要求,但希望尽可能快地释放内存,请使用 "activerehashing yes"。
activerehashing yes

# 客户端输出缓冲区限制可用于强制断开由于某种原因未从服务器快速读取数据的客户端
# (常见原因是 Pub/Sub 客户端无法像发布者生成消息那样快地消费消息)。
#
# 可以为三种不同类型的客户端设置不同的限制:
#
# normal -> 普通客户端,包括 MONITOR 客户端
# replica -> 副本客户端
# pubsub -> 订阅至少一个 pubsub 频道或模式的客户端
#
# 每个 client-output-buffer-limit 指令的语法如下:
#
# client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>
#
# 一旦达到硬限制,客户端将立即断开连接,或者如果达到软限制并在指定的秒数内(连续)保持达到软限制,客户端也将断开连接。
# 因此,例如,如果硬限制为 32 MB,软限制为 16 MB / 10 秒,
# 则如果输出缓冲区的大小达到 32 MB,客户端将立即断开连接,但如果客户端达到 16 MB 并连续超过限制 10 秒,客户端也将断开连接。
#
# 默认情况下,普通客户端不受限制,因为它们不会以推送方式接收数据,
# 而是在请求之后接收数据,因此只有异步客户端可能会创建数据请求速度超过读取速度的场景。
#
# 相反,pubsub 和副本客户端有默认限制,因为订阅者和副本以推送方式接收数据。
#
# 请注意,将副本客户端的输出缓冲区限制设置为低于 repl-backlog-size 配置(部分同步将成功,然后副本将断开连接)是没有意义的。
# 这样的配置将被忽略(将使用 repl-backlog-size 的大小)。
# 这不会影响内存消耗,因为副本客户端将共享积压缓冲区的内存。
#
# 可以通过将硬限制或软限制设置为零来禁用它们。
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

# 客户端查询缓冲区累积新命令。默认情况下,它们被限制为固定数量,以避免协议不同步(例如由于客户端中的错误)导致查询缓冲区中的内存使用无限制。
# 但是,如果您有非常特殊的需求,例如巨大的 multi/exec 请求或类似请求,可以在此处配置。
#
# client-query-buffer-limit 1gb

# 在某些情况下,客户端连接可能会占用大量内存,导致 OOM 错误或数据驱逐。
# 为了避免这种情况,我们可以限制所有客户端连接(所有 pubsub 和普通客户端)使用的累积内存。
# 一旦达到该限制,服务器将断开连接以释放内存。服务器将尝试首先断开使用最多内存的连接。我们称此机制为“客户端驱逐”。
#
# 客户端驱逐使用 maxmemory-clients 设置进行配置,如下所示:
# 0 - 客户端驱逐被禁用(默认)
#
# 可以使用内存值作为客户端驱逐阈值,例如:
# maxmemory-clients 1g
#
# 百分比值(介于 1% 和 100% 之间)表示客户端驱逐阈值基于 maxmemory 设置的百分比。例如,要将客户端驱逐设置为 maxmemory 的 5%:
# maxmemory-clients 5%

# 在 Redis 协议中,批量请求(即表示单个字符串的元素)通常限制为 512 MB。但是您可以在此处更改此限制,但必须为 1 MB 或更大。
#
# proto-max-bulk-len 512mb

# Redis 调用内部函数来执行许多后台任务,例如关闭超时的客户端连接,清除从未请求的过期键等。
#
# 并非所有任务都以相同的频率执行,但 Redis 根据指定的 "hz" 值检查要执行的任务。
#
# 默认情况下,"hz" 设置为 10。提高该值将在 Redis 空闲时使用更多 CPU,
# 但同时将使 Redis 在有许多键同时过期时更具响应性,并且可以更精确地处理超时。
#
# 范围在 1 到 500 之间,但通常不建议使用超过 100 的值。大多数用户应使用默认值 10,并在需要非常低延迟的环境中将其提高到 100。
hz 10

# 通常,具有与连接客户端数量成比例的 HZ 值是有用的。例如,为了避免每次后台任务调用处理过多客户端以避免延迟峰值。
#
# 由于默认 HZ 值保守地设置为 10,Redis 提供并默认启用了使用自适应 HZ 值的能力,该值将在连接许多客户端时临时提高。
#
# 当启用动态 HZ 时,实际配置的 HZ 将用作基线,但一旦连接更多客户端,将根据需要实际使用配置的 HZ 值的倍数。
# 这样,空闲实例将使用非常少的 CPU 时间,而繁忙实例将更具响应性。
dynamic-hz yes

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

# 当 Redis 保存 RDB 文件时,如果启用了以下选项,则每生成 4 MB 数据时,文件将进行 fsync。
# 这对于以更增量的方式将文件提交到磁盘并避免大的延迟峰值非常有用。
rdb-save-incremental-fsync yes

# Redis LFU 驱逐(参见 maxmemory 设置)可以进行调优。
# 然而,最好从默认设置开始,并在调查如何提高性能以及键的 LFU 如何随时间变化后再进行更改,这可以通过 OBJECT FREQ 命令进行检查。
#
# Redis LFU 实现中有两个可调参数:计数器对数因子和计数器衰减时间。在更改这些参数之前,理解它们的含义非常重要。
#
# LFU 计数器每个键只有 8 位,最大值为 255,因此 Redis 使用对数行为的概率增量。给定旧计数器的值,当键被访问时,计数器以以下方式递增:
#
# 1. 提取一个介于 0 和 1 之间的随机数 R。
# 2. 计算概率 P 为 1/(old_value*lfu_log_factor+1)。
# 3. 仅当 R < P 时,计数器递增。
#
# 默认的 lfu-log-factor 是 10。下表显示了不同对数因子下,计数器在不同访问次数下的变化:
#
# +--------+------------+------------+------------+------------+------------+
# | 因子   | 100 次访问 | 1000 次访问 | 100K 次访问 | 1M 次访问  | 10M 次访问 |
# +--------+------------+------------+------------+------------+------------+
# | 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
#
# 注意 2:计数器初始值为 5,以便为新对象提供积累访问次数的机会。
#
# 计数器衰减时间是键计数器除以二(或如果值小于等于 10 则递减)所需的时间(以分钟为单位)。
#
# lfu-decay-time 的默认值为 1。特殊值 0 表示每次扫描时衰减计数器。
#
# lfu-log-factor 10
# lfu-decay-time 1

########################### 主动碎片整理 #######################
#
# 什么是主动碎片整理?
# -------------------------------
#
# 主动(在线)碎片整理允许 Redis 服务器压缩内存中小分配和释放数据之间的空间,从而回收内存。
#
# 碎片化是每个分配器(但幸运的是,Jemalloc 较少)和某些工作负载的自然过程。
# 通常需要服务器重启以降低碎片化,或者至少刷新所有数据并重新创建。
# 然而,得益于 Oran Agra 为 Redis 4.0 实现的这一功能,此过程可以在服务器运行时以“热”方式进行。
#
# 基本上,当碎片化超过某个水平(参见下面的配置选项)时,
# Redis 将开始通过利用某些特定的 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

# 从主字典扫描中处理的最大集合/哈希/有序集合/列表字段数
# active-defrag-max-scan-fields 1000

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

# 可以将 Redis 的不同线程和进程固定到系统中的特定 CPU,以最大化服务器性能。
# 这对于将不同的 Redis 线程固定到不同的 CPU 非常有用,也可以确保在同一主机上运行的多个 Redis 实例固定到不同的 CPU。
#
# 通常,您可以使用 "taskset" 命令执行此操作,但也可以通过 Redis 配置直接在 Linux 和 FreeBSD 中执行此操作。
#
# 您可以固定服务器/IO 线程、bio 线程、aof 重写子进程和 bgsave 子进程。指定 CPU 列表的语法与 taskset 命令相同:
#
# 将 redis 服务器/io 线程固定到 CPU 亲和性 0,2,4,6:
# server_cpulist 0-7:2
#
# 将 bio 线程固定到 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
posted @ 2025-03-11 16:45  Invinc-Z  阅读(126)  评论(0)    收藏  举报