Redis【有与无】【C3】配置 redis.conf

本文章基于Redis 7.0.4版本,对Redis配置进行说明

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

# 单位注意事项:当需要内存大小时,可以用通常的形式 1k 5GB 4M 等等指定:
#
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#
# 单位不区分大小写,因此 1GB 1Gb 1gB 都是一样的。

################################## 包括 ###################################

# 在此处包含一个或多个其他配置文件。
# 这很有用,如果你 有一个适用于所有 Redis 服务器的标准模板,但也需要自定义一些每个服务器的设置。
# 包含文件可以包含其他文件,因此请明智地使用它。
#
# 请注意,选项“include”不会被命令“CONFIG REWRITE”重写 来自管理员或 Redis Sentinel。
# 由于 Redis 总是使用最后处理的 行作为配置指令的值,你最好把包括 在此文件的开头,以避免在运行时覆盖配置更改。
#
# 相反,如果你有兴趣使用包含来覆盖配置选项,最好使用 include 作为最后一行。
#
# 包含的路径可能包含通配符。所有匹配通配符的文件将按字母顺序包含。
# 请注意,如果包含路径包含通配符但没有文件匹配它时 服务器启动,include 语句将被忽略,不会出错 被发射。因此,从空包含通配符文件是安全的目录。
#
# 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 的计算机直接暴露在互联网上,绑定到所有接口是危险的,并且会将实例暴露给互联网上的每个人。 
# 因此,默认情况下,我们取消注释以下绑定指令,这将强制 Redis 仅侦听 IPv4 和 IPv6(如果可用)环回接口地址(这意味着 Redis 将只能接受来自运行它的同一主机的客户端连接 )。
#
# 除非你明确禁用保护模式,否则你还需要设置密码。
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bind 127.0.0.1 -::1
# use ifconfig to see ip address
# bind IP

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

# 保护模式是一层安全保护,以避免在 Internet 上打开的 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 socket.
#
# 指定将用于侦听的 Unix 套接字的路径传入连接。没有默认,所以Redis不会监听未指定时在 Unix 套接字上。
#
# unixsocket /run/redis.sock
# unixsocketperm 700

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

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

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

################################# TLS/SSL #####################################

# 默认情况下,禁用 TLS/SSL。
# 要启用它,“tls-port”配置指令可用于定义 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 模式来发出新贵信号在你的新贵工作配置中需要“expect stop”
#   supervised systemd - 通过在启动时将 READY=1 写入 $NOTIFY_SOCKET 并定期更新 Redis 状态来向 systemd 发出信号。
#   supervised auto    - 根据 UPSTART_JOB 或 NOTIFY_SOCKET 环境变量检测 upstart 或 systemd 方法
# Note: 注意:这些监督方法只发出“process is ready.”的信号。
#       它们不会启用连续 ping 回你的监督。
#
# 默认值为“no”。要在 upstart/systemd 下运行,你可以简单地取消注释下面的行:
#
# supervised auto

# 如果指定了 pid 文件,Redis 会在启动时将其写入指定位置,并在退出时将其删除。
#
# 当服务器运行非守护进程时,如果没有,则不会创建 pid 文件 在配置中指定。当服务器被守护进程时,pid 文件 即使未指定也会使用,默认为“/var/run/redis.pid”。
#
# 创建一个 pid 文件是最好的努力:如果 Redis 无法创建它 没有任何不好的事情发生,服务器将正常启动并运行。
#
# 请注意,在现代 Linux 系统上,“/run/redis.pid”更符合 并且应该被使用。
pidfile /usr/local/redis/run/redis_6379.pid

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

# 指定日志文件名。空字符串也可以用来强制 Redis 用于登录标准输出。请注意,如果你使用标准 日志输出但守护进程,日志将被发送到 /dev/null
# logfile ""
logfile /usr/local/redis/logs/redis.log

# 要启用对系统记录器的日志记录,只需将 'syslog-enabled' 设置为是, 并可选择更新其他系统日志参数以满足你的需要。
# syslog-enabled no

# 指定系统日志标识。
# syslog-ident redis

# 指定系统日志工具。必须是 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 仅在开始记录到标准输出并且标准输出是 TTY 并且禁用 syslog 记录时才会显示 ASCII 艺术徽标。 基本上,这意味着通常徽标仅在交互式会话中显示。
#
# 但是,可以强制执行 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 <seconds> <changes> [<seconds> <changes> ...]
#
# 如果经过给定的秒数,Redis 将保存数据库并且它 超过了对数据库的给定写入操作次数。
#
# 可以使用单个空字符串参数完全禁用快照 如下例所示:
#
# save ""
#
# 除非另有说明,否则默认情况下 Redis 将保存 DB:
#   * 如果至少进行了 1 次更改,则在 3600 秒(一小时)之后
#   * 如果执行了至少 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

# 在以下情况下启用或禁用对 ziplist 和 listpack 等的全面清理检查 加载 RDB 或 RESTORE 有效负载。这减少了断言的机会或 稍后在处理命令时崩溃。
# 选项:
#   no         - 切勿执行全面清理
#   yes        - 始终执行全面清理
#   clients    - 仅对用户连接执行全面清理。
#                不包括:RDB 文件、从主服务器接收到的 RESTORE 命令 连接和客户端连接具有 跳过清理有效负载 ACL 标志。
# 默认值应该是“clients”,但因为它目前影响集群 通过 MIGRATE 重新分片,默认情况下临时设置为“no”。
#
# sanitize-dump-payload no

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

# 在没有持久性的情况下删除实例中复制使用的 RDB 文件启用。默认情况下,此选项被禁用,但是有些环境出于法规或其他安全问题,
# RDB 文件保留在何处 由主服务提供磁盘以提供从服务(副本),或由从服务(副本)存储在磁盘上,为了加载它们以进行初始同步,应删除尽快。
# 请注意,此选项仅适用于同时具有 AOF 的实例 并且 RDB 持久性被禁用,否则被完全忽略。
#
# 获得相同效果的另一种(有时是更好的)方法是 在主服务实例和从服务(副本)实例上使用无盘复制。然而在从服务(副本)的情况下,无盘并不总是一种选择。
rdb-del-sync-files no

# 工作目录.
#
# 数据库将写入此目录中,并指定文件名 上面使用“dbfilename”配置指令。
#
# Append Only File 也将在此目录中创建。
#
# 请注意,你必须在此处指定目录,而不是文件名。
# dir ./
dir /usr/local/redis/db/

################################# 从服务(副本) #################################

# 主服务复制。使用 replicaof 使 Redis 实例成为 另一个 Redis 服务器。关于 Redis 复制的一些事情要尽快理解。
#
#   +------------------+      +---------------+
#   |      Master      | ---> |    Replica    |
#   | (receive writes) |      |  (exact copy) |
#   +------------------+      +---------------+
#
# 1) Redis 复制是异步的,但是你可以配置一个 主服务 来停止接受写入,如果它看起来至少没有连接 给定数量的从服务(副本)。
# 2) Redis 从服务(副本)能够与 主服务 如果复制链接丢失了相对少量的 时间。你可能希望根据需要使用合理的值配置复制确认日志大小(请参阅此文件的下一部分)。
# 3) 复制是自动的,不需要用户干预。在网络分区后,从服务(副本)会自动尝试重新连接到主服务器并与它们重新同步。
#
# replicaof <masterip> <masterport>

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

# 当从服务(副本)失去与主服务器的连接时,或者当复制仍在进行中,从服务(副本)可以以两种不同的方式运行:
#
# 1) 如果 replica-serve-stale-data 设置为 'yes'(默认值),从服务(副本)将仍然回复客户请求,可能使用过时的数据,或者如果这是第一次同步,数据集可能只是空的。
#
# 2) 如果 replica-serve-stale-data 设置为 “no”,则replica 将回复错误 "MASTERDOWN 与 MASTER 的链接已关闭,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

# 复制同步策略:磁盘或套接字。
#
# 新 从服务(副本) 和重新连接无法继续的 从服务(副本) 复制过程只是接收差异,需要做的就是所谓的 “完全同步 full synchronization”。
# 一个 RDB 文件从主服务传输到从服务(副本)。
#
# 传输可以通过两种不同的方式发生:
#
# 1) Disk-backed: Redis 主服务创建写入 RDB 的新进程磁盘上的文件。稍后,父进程将文件增量传输到从服务(副本)。
# 2) Diskless: Redis 主服务创建一个新进程,直接将 RDB 文件写入 replica socket,完全不接触磁盘。
#
# 使用磁盘支持的复制,在生成 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 无盘加载 + Redis 模块不处理 I/O 读取也可能导致 Redis 在与 主服务 的初始同步阶段发生 I/O 错误时中止。 
# 仅当你知道自己在做什么时才使用。
# -----------------------------------------------------------------------------
#
# 从服务(副本) 可以直接从套接字加载它从复制链接读取的 RDB,或者将 RDB 存储到文件中,并在从 主服务 完全接收到该文件后读取该文件。
#
# 在很多情况下磁盘比网络慢,存储和加载 RDB 文件可能会增加复制时间(甚至会增加 主服务的 在写入内存和从服务(副本)缓冲区上复制)。
# 但是,直接从套接字解析 RDB 文件可能意味着我们有 在完整的 rdb 刷新当前数据库的内容之前 已收到。出于这个原因,我们有以下选择:
#
# "disabled"    - 不要使用无盘加载(先将 rdb 文件存储到磁盘)
# "on-empty-db" - 只有在完全安全的情况下才使用无盘加载。
# "swapdb"      - 在直接解析数据时将当前数据库内容保留在 RAM 中 从插座。
#                 此模式下的 从服务(副本) 可以保持服务最新复制正在进行时的数据集,除非他们无法将 主服务 识别为具有相同数据集的情况 复制历史。
# 请注意,这需要足够的内存,如果你没有它,你将面临 OOM 杀死的风险。
repl-diskless-load disabled

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

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

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

# 设置复制积压大小。 
# 积压是一个缓冲区,当 从服务(副本)  断线一段时间后,会累积 从服务(副本) 数据,
# 这样当 从服务(副本) 想要重新连接时,通常不需要完全重新同步,但是部分重新同步就足够了,只需将部分数据传递给 从服务(副本) 断开连接时错过了。
#
# 复制积压越大,从服务(副本) 可以承受断开连接的时间越长,以后能够执行部分重新同步。
#
# 仅当至少连接一个 从服务(副本) 时才分配积压。
#
# repl-backlog-size 1mb

# 一段时间后,主服务 没有连接的 从服务(副本),积压将被释放。 以下选项配置需要经过的秒数,从最后一个 从服务(副本) 断开连接的时间开始,以便释放积压缓冲区。
# 请注意,从服务(副本) 永远不会因超时而释放积压,因为它们可能会在以后被提升为主服务,并且应该能够正确地与其他从服务(副本) “部分重新同步”:因此它们应该始终累积积压。
#
# 值为 0 意味着从不释放积压。
#
# repl-backlog-ttl 3600

# 从服务(副本) 优先级是 Redis 在 INFO 输出中发布的整数。 Redis Sentinel 使用它来选择一个 从服务(副本) 以促进 主服务,如果主服务不再正常工作。
#
# 优先级较低的 从服务(副本) 被认为更适合提升,例如,如果有三个 从服务(副本) 的优先级为 10、100、25,Sentinel 将选择优先级为 10 的 从服务(副本) ,即最低的 从服务(副本)。
# 但是,0 的特殊优先级将复制品标记为无法执行 主服务 角色,因此,Redis Sentinel永远不会选择优先级为 0 的 从服务(副本) 进行晋升。
#
# 默认情况下,优先级为 100。
replica-priority 100

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

# 从服务(副本) 忽略磁盘写入错误控制 从服务(副本) 在无法将从其 主服务器 接收到的写入命令持久保存到磁盘时的行为。 
# 默认情况下,此配置设置为 “no”,并且会在这种情况下使 从服务(副本) 崩溃。 
# 不建议更改此默认值,但是为了与旧版本的 Redis 兼容,可以将此配置切换为 “yes”,这将仅记录警告并执行从 主服务器 获得的写入命令。
#
# replica-ignore-disk-write-errors no

# -----------------------------------------------------------------------------
# 默认情况下,Redis Sentinel 在其报告中包含所有 从服务(副本)。 
# 从服务(副本) 可以从 Redis Sentinel 的公告中排除。 
# 'sentinel replicas <master>' 命令将忽略未通知的 从服务(副本),并且不会向 Redis Sentinel 的客户端公开。
#
# 此选项不会更改 从服务(副本) 优先级的行为。 即使将 replica-anounced 设置为 “no”,也可以将 从服务(副本) 提升为 主服务。 
# 要防止这种行为,请将 从服务(副本) 优先级设置为 0。
#
# replica-announced yes

# 如果连接的 从服务(副本) 少于 N 个,并且延迟小于或等于 M 秒,则 主服务 可能会停止接受写入。
#
# 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 主服务 能够列出附加的地址和端口, 以不同的方式复制。例如, “信息复制”部分 提供此信息,除其他工具外,这些信息由 Redis Sentinel 以发现 从服务(副本) 实例。
# 该信息可用的另一个地方是 主服务 的 “ROLE” 命令。
#
# 从服务(副本) 通常报告的列出的 IP 地址和端口是 通过以下方式获得:
#
#   IP: 通过检查对等地址自动检测地址 从服务(副本) 用于与 主服务器 连接的套接字。
#   Port: 复制期间 从服务(副本) 通信的端口 握手,通常是 从服务(副本) 用于侦听连接的端口。
#
# 但是,当端口转发或网络地址转换 (NAT) 是 使用,从服务(副本)实际上可以通过不同的 IP 和端口访问 对。从服务(副本) 可以使用以下两个选项,以便 向其 主服务 报告一组特定的 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 可能会使用越来越多的内存来跟踪许多客户端获取的密钥。
#
# 因此,可以为失效表配置最大填充值。 
# 默认情况下,它设置为 1M 的键,一旦达到这个限制,Redis 将开始驱逐失效表中的键,即使它们没有被修改,只是为了回收内存:这反过来会迫使客户端使缓存失效。 
# 基本上,表最大大小是你希望在服务器端跟踪有关谁缓存了什么信息的内存与客户端在内存中保留缓存对象的能力之间的权衡。
#
# 如果将值设置为 0,则表示没有限制,Redis 将 在失效表中保留尽可能多的键。
# 在“统计信息”部分,你可以找到有关数量的信息 在每个给定时刻都在失效表中键入。
#
# 注意:在广播模式下使用 key tracking 时,不使用内存 在服务器端,所以这个设置是没用的。
#
# tracking-table-max-keys 1000000

################################## 安全 ###################################

# 警告:由于 Redis 非常快,外部用户可以尝试 对现代机器每秒 100 万个密码。这意味着你 应该使用非常强大的密码,否则它们将很容易被破解。
# 请注意,因为密码实际上是客户端之间的共享机密 和服务器,不应该被任何人记住,密码 可以很容易地成为来自 /dev/urandom 或其他任何东西的长字符串,所以通过使用 长且不可猜测的密码不会进行暴力攻击。
# Redis ACL 用户的定义格式如下:
#
#   user <username> ... acl rules ...
#
# 例如:
#
#   user worker +@list +@connection ~jobs:* on >ffa9203c493aa99
#
# 特殊用户名 “default” 用于新连接。如果这个用户 具有 “nopass” 规则,则新连接将立即通过身份验证 作为 “default” 用户,无需通过授权命令。否则,如果“default”用户未使用“nopass”标记 连接将以未验证状态开始,并且需要 AUTH(或 HELLO 命令的 AUTH 选项)以便进行身份验证和 开始工作。
#
# 描述用户可以做什么的 ACL 规则如下:
#
#  on           启用用户:可以作为该用户进行身份验证。
#  off          禁用用户:不再可以进行身份验证 与此用户,但是已经通过身份验证的连接 仍然可以工作。
#  skip-sanitize-payload    RESTORE dump-payload sanitization 被跳过。
#  sanitize-payload         RESTORE dump-payload 已清理(默认)。
#  +<command>   允许执行该命令。
#               可以与 `|` 一起使用以允许子命令(例如“+config|get”)
#  -<command>   禁止执行该命令。
#               可以与 `|` 一起使用来阻止子命令(例如“-config|set”)
#  +@<category> 允许执行该类别中的所有命令 有效类别如@admin、@set、@sortedset、...等等,请参阅 server.c 文件中的完整列表,其中 Redis 命令表进行了描述和定义。
#  特殊类别@all 表示所有命令,但目前 存在于服务器中,并将在将来加载 通过模块。
#  +<command>|first-arg  允许 else 的特定第一个参数 禁用命令。它仅在具有以下命令的命令上受支持 没有子命令,并且不允许作为否定形式 像 -SELECT|1,只有以“+”开头的加法。这个 功能已弃用,将来可能会被删除。
#  allcommands  +@all 的别名。请注意,它意味着执行的能力 通过模块系统加载的所有未来命令。
#  nocommands   -@all 的别名。
#  ~<pattern>   添加一个可以作为一部分提及的键模式 命令。例如 ~* 允许所有键。图案 是一种类似于 KEYS 的 glob 样式模式。
#               可以指定多个模式。
# %R~<pattern>  添加指定可以从中读取哪些键的键读取模式。
# %W~<pattern>  添加用于指定哪些键可以写入的键写入模式.
#  allkeys      ~* 的别名
#  resetkeys    刷新允许的键模式列表。
#  &<pattern>   添加用户可以访问的全局样式的 Pub/Sub 频道模式。 可以指定多个通道模式。
#  allchannels  &*  的别名
#  resetchannels 刷新允许的通道模式列表。
#  ><password>  将此密码添加到用户的有效密码列表中。
#               例如 >mypass 会将“mypass”添加到列表中。
#               该指令清除“nopass”标志(见下文)。
#  <<password>  从有效密码列表中删除此密码。
#  nopass       该用户设置的所有密码都被删除,并且该用户被标记为不需要密码:这意味着每个密码都对该用户有效。
#               如果此指令用于默认用户,则每个新连接都将立即使用默认用户进行身份验证,而无需任何显式 AUTH 命令。
#               请注意,“resetpass”指令将清除此条件。
#  resetpass    刷新允许的密码列表。 此外删除“nopass”状态。 在“resetpass”之后,用户没有关联的密码,并且如果不添加一些密码(或稍后将其设置为“nopass”)就无法进行身份验证。
#  reset        执行以下操作:resetpass、resetkeys、off、-@all。 用户在创建后立即返回到相同的状态。
# (<options>)   使用括号中指定的选项创建一个新选择器并将其附加给用户。 每个选项都应该用空格分隔。 第一个字符必须是 ( 并且最后一个字符必须是 )。
# clearselectors 移除所有当前附加的选择器。 请注意,这不会更改“root”用户权限, 这是直接应用于 用户(括号外)。
#
# ACL 规则可以按任何顺序指定:例如,你可以从 密码,然后是标志或密钥模式。但请注意,添加剂 并且减法规则将根据排序改变含义。
# 例如看下面的例子:
#
#   user alice on +@all -DEBUG ~* >somepassword
#
# 这将允许“alice”使用所有命令,除了 DEBUG 命令,因为 +@all 将所有命令添加到命令集中 alice可以用,后来DEBUG被去掉了。
# 但是,如果我们颠倒顺序 两条 ACL 规则的结果将不同:
#
#   user alice on -DEBUG +@all ~* >somepassword
#
# 现在,当 alice 在允许的集合中还没有命令时,删除了 DEBUG 命令,稍后将添加所有命令,因此用户将能够 执行一切。
#
# 基本上 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 - 数据类型: sets 相关..
# * sortedset - 数据类型: zsets 相关..
# * list - 数据类型: lists 相关..
# * hash - 数据类型: hashes 相关..
# * string - 数据类型: strings 相关..
# * bitmap - 数据类型: bitmaps 相关..
# * hyperloglog - 数据类型: hyperloglog 相关..
# * geo - 数据类型: geo 相关..
# * stream - 数据类型: streams 相关..
#
# 有关 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 <password>,或者更明确地使用 AUTH default <password>
# 如果他们遵循新协议:两者都可以。
#
# requirepass 与 aclfile 选项和 ACL LOAD 不兼容 命令,这些将导致 requirepass 被忽略。
#
# requirepass foobared
requirepass 123456

# 默认情况下,新用户使用限制性权限初始化,通过相当于此 ACL 规则“off resetkeys -@all”。
# 从 Redis 6.2 开始,它 也可以使用 ACL 规则管理对 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 将关闭所有发送的新连接 错误“max number of clients reached”。
#
# 重要提示:使用 Redis Cluster 时,最大连接数也是与集群总线共享:集群中的每个节点将使用两个连接,一个传入,另一个传出。调整大小很重要 在非常大的集群的情况下进行相应的限制。
#
# maxclients 10000

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

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

# MAXMEMORY POLICY: 当达到 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 以两种方式回收过期的密钥:当这些密钥被访问时 被发现已过期,并且在后台,在所谓的 “活动过期密钥 active expire key”。
# 关键空间缓慢交互扫描 寻找过期的密钥来回收,这样就可以释放内存过期并且在短时间内将永远不会再次访问的密钥。
#
# 过期周期的默认努力将尽量避免超过 10% 的过期密钥仍在内存中,并将尽量避免消耗 超过 25% 的总内存并增加系统延迟。
# 然而 可以增加通常设置为“1”的过期“effort”,到更大的值,直到值“10”。
# 在其最大值 系统将使用更多的 CPU、更长的周期(技术上可能会引入 更多延迟),并且将容忍更少的已过期密钥仍然存在 在系统中。这是内存、CPU 和延迟之间的权衡。

# 过期周期的默认工作将尝试避免超过 10% 的过期密钥仍在内存中,并将尝试避免消耗超过 25% 的总内存并增加系统延迟。 
# 但是,可以将通常设置为“1”的过期“effort”增加到更大的值,直到值“10”。 
# 在其最大值时,系统将使用更多的 CPU、更长的周期(从技术上讲可能会引入更多的延迟),并且将容忍系统中仍然存在的已过期密钥较少。 这是内存、CPU 和延迟之间的权衡。
#
# active-expire-effort 1

############################# 懒惰释放 ####################################

# Redis 有两个删除键的原语。
# 一个叫做 DEL,是一个对象的阻塞删除。
# 这意味着服务器停止处理新命令,以便以同步方式回收与对象关联的所有内存。
# 如果删除的键与一个小对象相关联,则执行 DEL 命令所需的时间非常短,与 Redis 中的大多数其他 O(1) 或 O(log_N) 命令相当。 
# 但是,如果键与包含数百万个元素的聚合值相关联,则服务器可以阻塞很长时间(甚至几秒钟)以完成操作。
#
# 由于上述原因,Redis 还提供了非阻塞删除原语 如 UNLINK(非阻塞 DEL)和 FLUSHALL 的 ASYNC 选项和 FLUSHDB 命令,以便在后台回收内存。
# 这些命令在恒定时间内执行。 另一个线程将尽可能快地在后台逐步释放对象。
#
# 由应用程序的设计决定何时使用其中一个是一个好主意。 
# 然而,作为其他操作的副作用,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

# 也有可能,当用 UNLINK 调用替换用户代码 DEL 调用并不容易时,也可以使用以下配置指令将 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 线程,如果你有 8 核,请尝试使用 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 进程存在问题或停电可能会导致几分钟的写入丢失(取决于配置的保存点)。
#
# Append Only File 是另一种持久性模式,可提供更好的持久性。 
# 例如,使用默认数据 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 as a base file.
# - appendonly.aof.1.incr.aof, appendonly.aof.2.incr.aof as incremental files.
# - appendonly.aof.manifest as a manifest file.

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

# 仅附加文件的自动重写。
# 当 AOF 日志大小增长指定百分比时,Redis 能够自动重写隐式调用 BGREWRITEAOF 的日志文件。
# 它是这样工作的:Redis 会记住最近一次重写后 AOF 文件的大小(如果重启后没有发生过重写,则使用启动时 AOF 的大小)。
#
# 将此基本大小与当前大小进行比较。 如果当前大小大于指定百分比,则触发重写。 
# 此外,你需要指定要重写的 AOF 文件的最小大小,这对于避免重写 AOF 文件很有用,即使达到百分比增加但仍然很小。
#
# 指定零百分比以禁用自动 AOF 重写功能。

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

# 在 Redis 启动过程的最后,当 AOF 数据被加载回内存时,可能会发现 AOF 文件被截断。
# 这可能在 Redis 运行的系统崩溃时发生,尤其是在没有 data=ordered 选项的情况下挂载 ext4 文件系统时(但是当 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:     即使未配置保存点,也强制执行 DB 保存操作。
# nosave:   即使配置了一个或多个保存点,也会阻止 DB 保存操作。
# now:      跳过等待滞后的从服务(副本)。
# force:    忽略通常会阻止服务器退出的任何错误。
#
# 只要“save”和“nosave”没有同时设置,任何值的组合都是允许的。
# 例如: "nosave force now"
#
# shutdown-on-sigint default
# shutdown-on-sigterm default

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

# 在 Redis 开始处理或拒绝其他客户端之前,EVAL 脚本、函数以及在某些情况下模块的命令的最长时间(以毫秒为单位)。
#
# 如果达到最大执行时间,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-port 0

# 如果数据看起来太旧,故障主服务器的从服务(副本)将避免启动故障转移。
#
# 从服务(副本)实际上没有简单的方法来准确测量其“data age”,因此执行以下两项检查:T
#
# 1) 如果有多个从服务(副本)能够进行故障转移,它们会交换消息以尝试为具有最佳复制偏移量的从服务(副本)提供优势(处理来自主服务的更多数据)。
#    从服务(副本)将尝试通过偏移量获得它们的排名,并在故障转移开始时应用与其排名成比例的延迟。
#
# 2) 每个从服务(副本)都会计算与其主节点最后一次交互的时间。 
#    这可以是最后一次收到的 ping 或命令(如果主服务器仍处于“connected”状态),或者自与主服务器断开连接以来经过的时间(如果复制链接当前已关闭)。
#
# 第二点可由用户调整。 具体来说,如果自上次与主服务器交互后,经过的时间大于:
#
#   (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,这意味着从服务(副本)将始终尝试对主服务进行故障转移,而不管它们上次与主服务交互的时间。
# (但是他们总是会尝试应用与其偏移等级成比例的延迟)。
#
# 零是唯一能够保证当所有分区都愈合时集群将始终能够继续运行的值。
#
# cluster-replica-validity-factor 10

# 集群从服务能够迁移到孤立的主服务器,即没有工作从服务的主服务器。 这提高了集群抵抗故障的能力,否则如果孤立的主服务器没有工作从服务,则在发生故障时无法进行故障转移。
#
# 只有当它们的旧主服务器仍有至少给定数量的其他工作从服务时,从服务才会迁移到孤立的主服务器。 这个数字就是“迁移障碍”。 迁移屏障为 1 意味着只有当其主服务至少有 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 时,可防止从服务在主服务故障期间尝试对其主服务进行故障转移。 但是,如果强制执行,从服务(副本)仍然可以执行手动故障转移。
#
# 这在不同的场景中很有用,尤其是在多个数据中心运营的情况下,如果不是在 DC 完全故障的情况下,我们希望一方永远不会被提升。
#
# 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 消息被堆积)。
# 默认情况下禁用此限制。 当 'CLUSTER LINKS' 命令输出中的 'mem_cluster_links' INFO 字段 and/or '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 地址、用户定义的主机名或通过声明它们没有端点来连接它们。 
# 哪个端点显示为首选端点是通过使用具有值“ip”、“hostname”或“unknown-endpoint”的 cluster-preferred-endpoint-type 配置来设置的。 
# 此值控制端点如何返回 MOVED/ASKING 请求以及 CLUSTER SLOTS 的第一个字段。
# 如果首选端点类型设置为主机名,但未设置宣布的主机名,则“?” 将被退回。
#
# 当集群宣称自己具有未知端点时,这表明服务器不知道客户端如何访问集群。 
# 这可能发生在某些网络情况下,其中有多个可能的路由到节点,并且服务器不知道客户端选择了哪一个。 
# 在这种情况下,服务器期望客户端访问它用于发出最后一个请求的同一端点,但使用响应中提供的端口。
#
# cluster-preferred-endpoint-type ip

# 为了设置你的集群,请务必阅读文档 https://redis.io web site.

##########################  DOCKER/NAT 集群支持  ########################

# 在某些部署中,Redis Cluster 节点地址发现失败,因为地址经过 NAT 或端口转发(典型情况是 Docker 和其他容器)。
#
# 为了使 Redis Cluster 在这样的环境中工作,需要一个每个节点都知道其公共地址的静态配置。 以下四个选项用于此范围,它们是:
#
# * cluster-announce-ip
# * cluster-announce-port
# * cluster-announce-tls-port
# * cluster-announce-bus-port
#
# 每个都向节点指示其地址、客户端端口(用于没有和使用 TLS 的连接)和集群消息总线端口。 
# 然后该信息在总线数据包的报头中发布,以便其他节点能够正确映射发布信息的节点的地址。
#
# 如果 cluster-tls 设置为 yes 并且 cluster-announce-tls-port 被省略或设置为零,则 cluster-announce-port 指的是 TLS 端口。 
# 另请注意,如果 cluster-tls 设置为 no,则 cluster-announce-tls-port 无效。
#
# 如果不使用上述选项,将使用正常的 Redis Cluster 自动检测来代替。
#
# 请注意,重新映射时,总线端口可能不在客户端端口 + 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 命令,可以打印图表和获取报告的用户可以使用此信息。
#
# 系统仅记录在等于或大于通过 delay-monitor-threshold 配置指令指定的毫秒数的时间内执行的操作。 
# 当其值设置为零时,延迟监视器将关闭。
#
# 默认情况下,延迟监控是禁用的,因为如果你没有延迟问题,通常不需要它,并且收集数据会影响性能,虽然非常小,但可以在大负载下进行测量。 
# 如果需要,可以使用命令“CONFIG SET latency-monitor-threshold <milliseconds>”在运行时轻松启用延迟监控。
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
#
# 例如,如果启用了键空间事件通知,并且客户端对存储在 Database 0 中的键“foo”执行 DEL 操作,则将通过 Pub/Sub 发布两条消息:
#
# PUBLISH __keyspace@0__:foo del
# PUBLISH __keyevent@0__:del foo
#
# 可以在一组类中选择 Redis 将通知的事件。 每个类都由一个字符标识:
#
#  K     键空间事件,以 __keyspace@<db>__ 前缀发布。
#  E     Keyevent 事件,以 __keyevent@<db>__ 前缀发布。
#  g     通用命令(非特定类型),如 DEL, EXPIRE, RENAME, ...
#  $     字符串命令
#  l     列出命令
#  s     Set命令
#  h     Hash命令
#  z     排序集命令
#  x     过期事件(每次密钥过期时生成的事件)
#  e     逐出事件(当一个键被逐出最大内存时产生的事件)
#  n     新的关键事件(注意:不包括在“A”类中)
#  t     Stream命令
#  d     模块键类型事件
#  m     Key-miss 事件(注意:它不包括在“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: max size: 64 Kb  <-- 不建议用于正常工作负载
# -4: max size: 32 Kb  <-- 不建议
# -3: max size: 16 Kb  <-- 可能不推荐
# -2: max size: 8 Kb   <-- 推荐
# -1: max size: 4 Kb   <-- 推荐
# 正数表示每个列表节点最多存储 _exactly_ 的元素数。
# 性能最高的选项通常是 -2(8 Kb 大小)或 -1(4 Kb 大小),但如果你的用例独特,请根据需要调整设置。
list-max-listpack-size -2

# 列表也可以被压缩。
# 压缩深度是要从压缩中排除(*exclude*)的列表每一(*each*)侧的快速列表 ziplist 节点的数量。
# 列表的头部和尾部始终未压缩以进行快速 push/pop 操作。 设置如下:
# 0: 禁用所有列表压缩
# 1: depth 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 位有符号整数范围内的基数为 10 的整数。
# 以下配置设置设置了集合大小的限制,以便使用这种特殊的内存节省编码。
set-max-intset-entries 512

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

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

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

# 主动重新散列每 100 毫秒 CPU 时间使用 1 毫秒,以帮助重新散列主 Redis 散列表(将顶级键映射到值的表)。 
# Redis 使用的哈希表实现(参见 dict.c)执行延迟重新哈希:
# 在重新哈希的哈希表中运行的操作越多,执行的重新哈希“steps”就越多,因此如果服务器空闲,重新哈希永远不会完成哈希表使用了更多内存。
Active rehashing uses 1 millisecond every 100 milliseconds of CPU time in
#
# 默认设置是每秒使用此毫秒 10 次,以便主动重新散列主字典,尽可能释放内存。
#
# 如果不确定:如果你有硬延迟要求,请使用“activerehashing no”,并且在你的环境中 Redis 可以不时以 2 毫秒延迟回复查询并不是一件好事。
#
# 如果你没有这么严格的要求,但希望尽可能快地释放内存,请使用“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 兆字节,软限制是 16 兆字节/10 秒,如果输出缓冲区的大小达到 32 兆字节,客户端将立即断开连接,但如果客户端达到 16 兆字节,客户端也会断开连接,并且连续超过限制 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。 
# 但是你可以在此处更改此限制,但必须为 1mb 或更大
#
# proto-max-bulk-len 512mb

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

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

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

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

# Redis LFU eviction(参见 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。这是频率计数器如何随具有不同对数因子的不同访问次数而变化的表格:
#
# +--------+------------+------------+------------+------------+------------+
# | 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
#
# 注意 2:计数器初始值为 5,以便让新对象有机会累积命中。
#
# 计数器衰减时间是必须经过的时间,以分钟为单位,以便密钥计数器除以 2(或者如果它的值小于 <= 10,则减少)。
#
# lfu-decay-time 的默认值为 1。特殊值 0 表示每次碰巧扫描计数器时衰减计数器。
#
# lfu-log-factor 10
# lfu-decay-time 1

########################### 主动碎片整理 #######################
#
# 什么是主动碎片整理?
# -------------------------------
#
# 主动(在线)碎片整理允许 Redis 服务器压缩内存中数据的小分配和释放之间留下的空间,从而允许回收内存。
#
# 碎片化是每个分配器(幸运的是,Jemalloc 较少)和某些工作负载都会发生的自然过程。 
# 通常需要重新启动服务器以降低碎片,或者至少清除所有数据并重新创建它。 
# 然而,由于 Oran Agra 为 Redis 4.0 实现了这个特性,这个过程可以在运行时以“hot”的方式发生,而服务器正在运行。
#
# 基本上,当碎片超过某个级别时(请参阅下面的配置选项),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

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

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

# 可以将 Redis 的不同线程和进程固定到系统中的特定 CPU,以最大限度地提高服务器的性能。
# 这有助于将不同的 Redis 线程固定在不同的 CPU 中,也可以确保在同一主机上运行的多个 Redis 实例将固定到不同的 CPU。
#
# 通常你可以使用“taskset”命令执行此操作,但是在 Linux 和 FreeBSD 中也可以直接通过 Redis 配置来执行此操作。
#
# 你可以固定服务器/IO 线程、bio 线程、aof rewrite 子进程和 bgsave 子进程。 指定cpu列表的语法与taskset命令相同:
#
# 将 redis 服务器/io 线程设置为 cpu 亲和性 0、2、4、6:
# server_cpulist 0-7:2
#
# 将 bio 线程设置为 cpu 亲和力 1,3:
# bio_cpulist 1,3
#
# 将 aof rewrite 子进程设置为 cpu 亲和性 8、9、10、11:
# aof_rewrite_cpulist 8-11
#
# 将 bgsave 子进程设置为 cpu 亲和性 1,10,11
# bgsave_cpulist 1,10-11

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琴 韵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值