侧边栏壁纸
博主头像
与晚风述往事博主等级

万般皆下品,唯有读书高。

  • 累计撰写 149 篇文章
  • 累计创建 29 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

Redis redis.conf详解

与晚风述往事
2022-03-29 / 0 评论 / 0 点赞 / 139 阅读 / 20,912 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-03-29,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

介绍

此篇文章内容来自于Redis 6.2.6版本的redis.conf文件中的内容,经过翻译、删减内容而成。文章基本已覆盖80%以上的参数,后续会不断的更新。
建议大家以官方文档为主,在有需要的前提下,以此篇为辅。文章中部分内容尚未理解及编写,如有写的不好或不对的地方,望请谅解,也可留言指出,我会不断的进行调整及更新。

参数详解

INCLUDES

include

该参数可以引入多个配置文件,让你在有一个标准配置模板的基础上,自定义一些服务器配置。

MODULES

loadmodule

该参数指定在redis服务启动时加载的模块,类似于mysql中的插件,可以使用多个loadmodule加载多个模块。注意,如果模块加载失败,则redis服务无法启动。

NETWORK

bind

bind指定服务监听连接主机的IP地址,可以配置监听1个或多个地址。当配置多个地址时,可以在空格进行分割,每个地址可以加“-”前缀。默认情况下,redis服务只会监听127.0.0.1,也就是本机才能够访问redis服务。
注意,绑定*则意味着所有的IP地址都能够访问,这对于运行在公网上的redis服务具有很大风险,建议绑定具体的IP地址,以减少被暴露的可能。

protected-mode

protected-mode指定redis服务是否处于保护模式,取值有yes/no,默认为yes。保护模式主要是针对以下情况的一个保护策略:

  • 没有明确指定bind地址
  • 没有设置redis服务的密码

当保护模式为yes时,必须在指定bind地址和设置redis服务密码之间选择一个,否则客户端会无法连接到redis服务。注:这里的客户端指的是非redis本机的客户端。

在设置保护模式后,会有以下四种情况:

  1. 有明确bind地址但没有设置密码的情况下,绑定的客户端可以连接到redis服务。
  2. 有明确bind地址并且有设置密码的情况下,绑定的客户端可以连接到redis服务。
  3. 没有明确bind地址并且没有设置密码的情况下,非本机的客户端不能连接到redis服务。
  4. 没有明确bind地址但有设置密码的情况下,非本机的客户端可以连接到redis服务。

port

port参数指定redis服务使用的端口号,默认为6379。如果你指定0,则表示redis不监听TCP socket。

tcp-backlog

tcp-backlog参数指定连接队列的时间,连接队列的时间就是未完成三次握手的队列再加上已完成三次握手的队列。在高并发的环境中,需要指定一个较高的值来避免客户端连接慢导致的问题。

注意,Linux内核会默认将该参数截断为/proc/sys/net/core/somaxconn的值,默认somaxconn值为128。因此,redis服务运行在linux中的话,除设置tcp-backlog参数外,还需要调整内核参数somaxconn和tcp_max_syc_backlog的值,才能获得预期的效果。

unixsocket

unixsocket参数指定unix socket的路径,没有默认值。

unixsocketperm

unixsocketperm参数指定unix socket的权限。

timeout

timeout参数指定客户端空闲多少秒后关闭连接,也就是客户端的超时时间。默认值为0,表示没有超时时间,以秒为单位。

tcp-keepalive

tcp-keepalive参数指定检测连接是否激活的时间(通常会是长连接),默认值为300,以秒为单位。该值为非0时,它会定期使用SO_KEEPALIVE在没有通信的情况下向客户端发送TCP ACKs。这通常在以下情况很有用:

  • 检查连接是否死亡
  • 强制网络设备在中间考虑连接是否存活

在Linux中,指定的值是用于发送ACKs的时间段。注意,如果要关闭连接,则需要两倍的时间。在其他内核上,周期取决于内核配置。

这个参数从3.2.1开始默认为300秒,redis在文档中描述是合理的。

TLS/SSL

tls-port

tls-port参数指定TLS协议的端口号,默认禁用TLS/SSL。

tls-cert-file

tls-cert-file参数指定TLS证书文件。

tls-key-file

tls-key-file参数指定TLS密钥文件。

tls-key-file-pass

tls-key-file-pass参数指定密钥文件所使用的密码。注:仅当密钥文件使用密码加密时,才会使用到该参数。

tls-client-cert-file

tls-client-cert-file参数指定客户端的证书文件。注:仅当客户端和服务器证书不同时,才会使用该参数。

tls-client-key-file

tls-client-key-file参数指定客户端的密钥文件。注:仅当客户端和服务器证书不同时,才会使用该参数。

tls-client-key-file-pass

tls-client-key-file-pass参数指定客户端密钥的密码文件。注:仅当客户端密钥文件使用密码加密时,才会使用到该参数。

tls-dh-params-file

tls-dh-params-file参数指定DH参数文件,设置后会启用密钥交换协议文件。

tls-ca-cert-file

tls-ca-cert-file参数指定CA证书文件。

tls-ca-cert-dir

tls-ca-cert-dir参数指定CA证书目录。

tls-auth-clients

tls-auth-clients参数指定TLS端口上的客户端是否需要使用有效的客户端证书进行认证,取值有“no”或“optional”。

指定为no,则表示不需要客户端证书,也不接受客户端证书;指定为optional,则表示接受客户端证书,如果提供证书,则必须是有效的,但客户端证书不是必须的。

tls-replication

tls-replication参数指定是否在复制链路上启用TLS,默认不启用TLS。

tls-cluster

tls-cluster参数指定是否在集群上启用TLS协议,默认不启用TLS。

tls-protocols

tls-protocols参数指定TLS协议的版本,默认情况下,只有TLS v1.2和TLS v1.3是启用的。注意,redis文档上强烈建议禁用TLS旧的已弃用的版本,以减少受攻击的可能。

tls-ciphers

tls-ciphers参数指定密码的策略。

tls-ciphersuites

tls-ciphersuites参数指定允许TLSv1.3加密套件。

tls-prefer-server-ciphers

tls-prefer-server-ciphers参数指定在选择密码时,是否使用服务器的首选项而不是客户端。默认情况下,服务器会遵循kke客户端的首选项。

tls-session-caching

tls-session-caching参数指定TLS会话缓存是否启用,默认会启用。启用后,对于支持TLS会话缓存的客户端来说,重新连接会更快,代价更低。

tls-session-cache-size

tls-session-cache-size参数指定TLS会话缓存的数量,默认值为20480,设置为0表示无限大小。

tls-session-cache-timeout

tls-session-cache-timeout参数指定TLS会话缓存的超时时间,默认为300秒。

GENERAL

daemonize

daemonize参数指定redis是否以守护进程运行,取值有“yes”和“no”,默认值为no。注意,redis服务如果是以upstart或者systemd管理时,该参数不影响是否后台运行。

supervised

supervised参数指定redis服务是否与upstart或systemd进行交互,默认值为NO。该值有四种选项:

  • no 不进行交互
  • upstart 通过将redis置于SIGSTOP模式发出upstart信号需要在upstart作业中配置“expect stop”
  • systemd 通过在启动时将READY=1写入到$NOTIFY_SOCKET,并定期更新redis的状态lla来发送信号。
  • auto 基于UPSTART_JOB或NOTIFY_SOCKET环境变量检测upstart或systemd方法。

pidfile

pidfile参数指定存储PID的文件路径。指定PID文件后,redis会在启动时将其PID写入到该文件中。

当redis服务以非守护进程运行时,如果没有指定PID文件,则不会创建PID文件;当redis服务以守护进程运行时,即使没有指定PID文件,服务默认也会在/var/run目录下创建redis.pid文件。

注意,redis建议我们在Linux操作系统中,将PID文件指定到/run目录下更符合标准。

loglevel

loglevel参数指定日志的级别。值可以是:

  • debug 含有大量信息,通常会在开发环境或测试环境中使用到。
  • verbose 含有许多无用的信息,但会比debug级别少一些。
  • notice 含有适度冗长的信息,通常会运行在生产环境中。
  • warning 仅含有非常重要或关键的信息。

logfile

logfile参数指定日志文件的文件名,默认值为空,表示强制redis服务写到标准输出中。注意,如果redis服务是以守护进程运行,指定空字符串则表示将日志记录到/dev/null中。

syslog-enabled

syslog-enabled参数指定是否记录日志到系统日志中。

syslog-ident

syslog-ident参数指定在系统日志中的标识符。

syslog-facility

syslog-facility参数指定syslog的facility,取值有“USER”或“LOCAL0~LOCAL0”。

crash-log-enabled

crash-log-enabled参数指定是否禁用内置的崩溃日志。

crash-memcheck-enabled

crash-memcheck-enabled参数指定是否禁用作为崩溃日志一部分运行的快速内存检查,禁用后,可能会让你的redis出现问题后终止的更快。

databases

databases参数指定数据库的数量,默认值为16,默认的数据库为DB 0。

always-show-logo参数指定数据库是否在启动日志中显示logo,默认情况下只会在标准输出中打印。

set-proc-title

set-proc-title参数指定redis是否修改进程标题,默认情况下,会修改进程标题来提供运行时的一些信息(例如top或ps显示进程),将值改为no,就可以禁止修改标题。

proc-title-template

proc-title-template参数指定redis修改进程标题使用的模板,默认值为"{title} {listen-addr} {server-mode}"。可选的值有:

  • {title} 父进程的执行名称或子进程的类型。
  • {listen-addr} 绑定的地址或者“*”后面跟TCP或TLS端口号,或UNIX Socket。
  • {server-mode} 特殊模式,“哨兵”或“集群”。
  • {port} TCP协议监听的端口号。
  • {tls-port} TLS协议监听的端口号。
  • {unixsocket} 正在监听的UNIX域Socket。
  • {config-file} 使用的配置文件名称。

SNAPSHOTTING

save

save控制将数据写入到磁盘的RDB文件中的频率,默认值无,表示不写入到RDB文件中。这也就意味着一旦重启或者关闭redis服务,数据就会被清空。频率的设定格式如下所示:

  • save
    • seconds 指定经过多长时间。
    • changes 指定多少个Key发生改变。

如果需要指定多个频率,则指定多个save即可。

stop-writes-on-bgsave-error

stop-writes-on-bgsave-error控制在启用RDB快照时,遇到最近一次后台保存失败后,redis是否停止接受写操作。这样做的好处是能够快速的让用户意识到Redis数据没有正常持久化到磁盘中。默认值为“yes”,表示在遇到后台保存失败时,停止接受写操作。

通常情况下不需要设置此参数,除非是有对Redis服务和持久化做了监控,为了Redis的正常运行,需要禁用该功能。

rdbcompression

rdbcompression参数指定快照是否使用LZF压缩RDB文件中的字符串对象,默认是启用的。注意,压缩会使用一些CPU,但压缩后的数据集减小,所带来的效果应该可以抵消这部分的消耗。不建议关闭,除非你想节省这部分CPU。

rdbchecksum

rdbchecksum参数指定快照是否进行校验,默认情况下启用校验。在指定为no后,则表示禁用校验,禁用校验后创建的RDB文件中的CRC64校验和为0,这会告诉代码跳过检查。

RDB的第5版中,会将CRC64的校验和放在文件尾部,这让文件更难损坏,但该操作会在保存和加载RDB文件时损失一部分性能(大约10%左右)。因此,如果想获得最大性能,则可以禁用校验。

sanitize-dump-payload

sanitize-dump-payload参数指定在加载RDB或RESTORE负载时,是否启用ziplist、listpack等完整性sanitation检查,启用后会减少在处理命令时发生断言或崩溃的机会。该参数可选的值有:

  • no 不启用full sanitation
  • yes 始终启用full sanitation
  • client 仅对用户连接启用full sanitation。不包括:RDB文件、从主连接接受到的RESTORE命令以及具有skip-sanitize-payload ACL标志的客户端连接。

注意,默认值理论上应该是“client”,但由于MIGRATE影响到集群重新分片,所以暂时设定为“no”。

dbfilename

dbfilename指定转储文件(也就是dump.rdb)的文件名,类似于Oracle中的数据文件一样。

rdb-del-sync-files

rdb-del-sync-files参数指定在没有启用持久化的情况下是否删除复制使用的RDB文件,默认值是禁用的。

通常情况下,该参数不需要设置为yes,但在某些环境中,出于法规或其他安全的考虑下,RDB文件被主机持久化在磁盘上以提供副本,或者被副本存储在磁盘上以加载它们用于初始同步,应该尽快删除。注意,这个参数只在同时禁用AOF和RDB持久化的情况下生效,否则会被忽略。

在主实例和副本实例上使用无磁盘复制有时是一种更好的方法。

dir

dir参数指定工作目录,redis会将数据写入到该目录中,文件名是由dbfilename指定。默认值是“./”,会将RDB文件放在启动redis服务的用户目录下。注意,该参数只能指定目录,不能指定文件名。

REPLICATION

replicaof

replicaof参数指定主副本复制,指定主节点的ip地址和端口号,指定后该实例就会成为主节点的一个副本。以下三点需要理解:

  • 1、Redis复制是异步的,但如果主节点没有与给定数量的副本连接,则可以将其配置为停止接受写入。
  • 2、如果复制链路在相对较短的时间内丢失,Redis复制副本能够与主机执行部分重新同步。
  • 3、复制是自动的,不需要用户干预。在网络分割后,复制副本会自动尝试重新连接到主节点并与主节点同步。

masterauth

masterauth参数指定主节点的密码。

如果主节点有密码保护,则必须在副本节点中指定主节点的密码,否则主节点将拒绝副本节点请求。

masteruser

masteruser参数指定主节点的用户。

当指定了masteruser参数后,副本会使用新的认证方式对它的身份进行验证:AUTH <username><password>

replica-serve-stale-data

replica-serve-stale-data参数指定副本在丢失与主节点的连接或复制仍在进行时,副本以哪种方式进行操作:

  • 该参数指定为“yes”(默认值),副本仍将回复客户端的请求,可能带有过期数据。
  • 该参数指定为“no”,则replica将对所有命令回复错误“SYNC with in process”,但以下命令除外:INFO, REPLICAOF, AUTH, PING, SHUTDOWN, REPLCONF, ROLE, CONFIG, SUBSCRIBE,UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB, COMMAND, POST,HOST and LATENCY.

replica-read-only

replica-read-only参数指定副本节点是否只读,默认值为“yes”。

repl-diskless-sync

repl-diskless-sync参数指定副本同步的策略,取值为“磁盘”和“Socket”,默认为磁盘。这两种方式区别是:

  • 磁盘 redis主节点会创建一个新的进程,将RDB文件写入到磁盘中,稍后父进程将文件增量传输到副本节点。
  • Socker(无盘) redis主节点创建一个新的进程,直接将RDB文件通过网络传输到副本节点的Socket,完全不接触磁盘。

使用磁盘复制的话,在生成RDB文件的同时,只要生成RDB文件的当前子进程完成工作,就可以将更多的副本排队并与RDB文件一起提供;使用无盘复制的话,在传输开始后,到达的新的副本将排队,只有当前的传输结束后,才会开始新的传输。

在使用速度较慢的磁盘时,如果你的网络带宽较高,则建议使用无盘复制。

repl-diskless-sync-delay

repl-diskless-sync-delay参数指定无盘复制时,服务器等待的延迟时间,延迟以秒为单位,默认为5秒。

使用无盘复制的话,该参数很重要,因为一旦传输开始,就无法为到达的新副本提供服务,新副本将会排队等待下一次RDB的传输,因此服务器等待延迟以让更多的副本到达。

repl-diskless-load

repl-diskless-load参数指定是否使用无盘加载,取值有三种情况:

  • disabled 不使用无盘加载(它会先将RDB文件存储到磁盘)
  • on-empty-db 只有在完全安全的情况下才使用无盘加载
  • swapdb 从Socket解析数据时,将当前数据库内容的副本保存在RAM中。

注意,生产环境中不建议使用无盘加载,因为它可能会在故障转移期间导致数据丢失。

repl-ping-replica-period

repl-ping-replica-period参数指定多久向服务器发送一次ping,时间以秒为单位,默认值为10秒。

repl-timeout

repl-timeout参数指定复制超时的时间,时间以秒为单位,默认值为60秒。从以下三种角度理解超时:

  • 从副本的角度来看,SYNC期间的批量传输I/O。
  • 从副本(数据、pings)的角度看,主节点连接超时。
  • 从主节点的角度看,副本超时(replconf ACK pings)。

注意,必须设置该值大于repl-ping-replica-period的值,否则每次主副节点之间的流量较低时都会检测到超时。

repl-disable-tcp-nodelay

repl-disable-tcp-nodelay参数指定是否禁用TCP_NODELAY,默认值为NO,该值有两种选项:

  • yes redis将会使用较小数量的TCP数据包和较少的带宽将数据发送到副本,但这会增加副本端的延迟,对于使用默认linux的内核,最多会延迟40毫秒。
  • no 数据出现在副本端的延迟将减少,但这将使用较多的带宽进行复制。

repl-backlog-size

repl-backlog-size参数指定复制积压大小。backlog是一个缓冲区,当replica断开一定时间时,它会累积副本数据,因此当replica想要再次重新连接时,通常不需要完全重新同步,只同步replica在断开时丢失那部分的数据即可。

复制积压越大,复制副本能够承受断开的时间就越长,再次连接就能够只同步部分数据。

repl-backlog-ttl

repl-backlog-ttl参数指定没有副本连接后,多久释放backlog,以秒为单位,默认值3600秒。值为0表示从不释放 backlog。配置后,主节点检测最后一个副本断开的时间达到配置的时间后,就会释放backlog。

注意,副本永远不会因超时而释放backlog,因为它们可能会被提升为主副本,并且应该能够正确地与其他副本进行部分重新同步。

replica-priority

replica-priority参数指定优先级,该优先级会影响到master节点不工作时选择副本的顺序。默认值为100,设置为0则将副本标记为不升级为master节点。

注意,优先级越低,越会被选择升级为master节点。例如有三个副本,分别是10、25和100优先级,redis服务在master节点出现问题后优先将优先级为10的副本升级为master节点。

replica-announced

replica-announced参数指定是否在redis Sentinel报告中包含所有副本。

该选项不会影响replica-priority的行为,即使将replica-announced值改为“no”,依然可以将replica提升为master。

min-replicas-to-write

min-replicas-to-write参数指定副本数量,当连接到master节点的副本少于该值时,master节点可能会停止写入。

min-replicas-max-lag

min-replicas-max-lag参数指定副本的延迟时间,以秒为单位。当连接到master节点的副本延迟大于该值时,master节点可能会停止写入。

注意,min-replicas-to-write和min-replicas-max-lag任意一个设置为0,则表示禁用该功能。

replica-announce-ip

replica-announce-ip参数指定一组特定的IP地址。

replica-announce-port

replica-announce-port参数指定一组特定的端口。

redis主节点能够以不同的方式列出副本的IP地址和端口号,例如INFO replication部分提供了该信息,redis Sentinel使用这些信息以及其他工具发现副本实例。一个replica正常上报列出的IP地址和端口是通过下面方式获取的:

  • IP:该地址是自动检测的,通过检查由副本连接到master节点的Socket的对端地址。
  • PORT:该地址是在replica握手期间由副本通信,通常是副本用来监听连接的端口。

当使用端口转发或网络地址转换时(NAT),副本是通过不同的IP和端口进行访问,我们就可以配置这两个选项,以便INFO和ROLE报告这些值。

KEYS TRACKING

tracking-table-max-keys

客户端缓存可参考官方文档:https://redis.io/docs/manual/client-side-caching

tracking-table-max-keys参数指定客户端缓存的大小,默认为1M。注意,单位换算如下:

  • 1k => 1000 bytes
  • 1kb => 1024 bytes
  • 1m => 1000000 bytes
  • 1mb => 1024*1024 bytes
  • 1g => 1000000000 bytes
  • 1gb => 102410241024 bytes

SECURITY

acllog-max-len

acllog-max-len参数指定ACL日志条目,该日志存储在内存中。

aclfile

aclfile参数指定外部ACL文件的路径。外部ACL文件的格式和redis.conf里面配置用户的格式完全一致。

除在外部ACL文件配置文件外,还可以使用一个仅列出用户的独立文件。这两种方式不能混用:如果在这里配置用户,并且激活外部ACL文件,则服务器会启动失败。

requirepass

requirepass参数指定默认用户的密码。

注意,requirepass参数与aclfile参数和ACL LOAD命令不兼容,这将导致requirepass参数会被忽略。

acl-pubsub-default

acl-pubsub-default参数指定发布/订阅频道的默认值,该值有两种选项可选:

  • allchannels 授权对所有发布/订阅频道的访问权限
  • resetchannels 撤消对所有发布/订阅频道的访问权限

为保证在升级6.0时的兼容,redis将acl-pubsub-default默认设置为“allchannels”,但表示会在未来的版本中很可能将其改为“resetchannels”。

redis 6.2版本开始,可以使用ACL规则管理发布/订阅频道的访问权限。

CLIENTS

maxclients

maxclients参数指定同时连接到redis服务的客户端最大数量,默认值为10000。一旦达到限制的数量后,redis服务会关闭所有已发送的新连接。

注意,redis集群中的每个节点会使用两个连接,一个是传入,一个是传出。因此,根据实际情况调整该值大小。

MEMORY MANAGEMENT

maxmemory

maxmemory参数指定redis能够使用的内存大小。

当达到限制后,redis会根据maxmemory-policy策略去调整内存。如果内存不能根据策略去删除键,或者策略设置为“noeviction”,redis将开始以错误的方式回复那些会占用更多内存的命令,比如set、LPUSH,并会继续回复GET等只读命令。

redis建议我们为maxmemory设置一个下限值,以便系统上有一些空闲RAM用于副本输出缓冲区。(策略是“noeviction”的话,则不需要这样做。)

maxmemory-policy

maxmemory-policy参数指定内存达到限制后,默认值为noeviction。redis要根据哪种规则去删除内存中的内容:

  • volatile-lru 使用类似LRU算法(最近最少)删除过期的键。
  • allkeys-lru 使用类似LRU算法(最近最少)删除键。
  • volatile-lfu 使用类似LFU算法(最不经常使用)删除过期的键。
  • allkeys-lfu 使用类似LFU算法(最不经常使用)删除键。
  • volatile-random 删除一个设置了过期时间的随机的键。
  • allkeys-random 删除一个任意键。
  • volatile-ttl 删除离过期时间最近的键。
  • noeviction 不删除任何键,在写操作时返回一个错误。

注意,使用上述任何一种规则,当没有合适的键被删时,redis都将在需要更多内存的写入操作时返回错误。这些错误通常是创建Key、添加数据或修改现有Key的命令。

maxmemory参数限制,默认值yes,这就意味着Key的驱逐是由master处理,当Key在master节点上移除时,向replica发送DEL命令。

-samples

maxmemory-samples参数指定内存算法检查的样本Ke的y数量,默认值为5。例如使用allkeys-lru算法时,redis默认会检查5个键并选择一个最近最少使用的Key。

redis中使用的LRU算法、LFU算法和TTL算法都不是精确算法,而是近似算法。默认值为5基本以符合多数情况,将值改为10会非常接近LRU算法,但CPU的成本更高;将值改为3会更快,但准确率较低。

maxmemory-eviction-tenacity

maxmemory-eviction-tenacity参数指定内存驱逐韧性,默认值为10。设置为0表示最小延迟,设置为100表示不考虑进程延迟。

在写入流量较大时,maxmemory-eviction-tenacity可能需要增加。降低maxmemory-eviction-tenacity值可能会降低延迟,但可能会影响内存驱逐处理的有效性。

replica-ignore-maxmemory

replica-ignore-maxmemory参数指定replica是否忽略maxmemory参数限制,默认值yes,这就意味着Key的驱逐是由master处理,当Key在master节点上移除时,向replica发送DEL命令。

active-expire-effort

active-expire-effort参数指定内存中Key的过期周期,默认值为1,表示redis会尽量避免超过10%的过期Key在内存中,并尽量避免超过总内存的25%。

redis会通过两种方式回收过期的Key,一种是访问时发现Key过期,另一个是后台发现Key过期,被称为“活动过期键”。Key空间被缓慢地、交互式地扫描以查找要回收的过期Key,这样就有可能释放那些过期且在短时间内不会被再次访问的Key内存。

注意,增大active-expire-effort参数会减少过期Key仍在内存中,但会使用更多的CPU,可能带来更大的延迟。因此,在设置该值时,需要在内存、CPU和延迟之间进行权横。

LAZY FREEING

lazyfree-lazy-eviction

lazyfree-lazy-eviction参数指定在以下情况是否独立于用户调用删除对象(是否以阻塞方式删除对象):

  • 在删除Key时,由于maxmomery和maxmemory policy配置,以便为新的Key腾出空间,而不会超过指定的内存限制。

默认值为no,表示以阻塞模式删除对象。

lazyfree-lazy-expire

lazyfree-lazy-expire参数指定在以下情况是否独立于用户调用删除对象(是否以阻塞方式删除对象):

  • 当一个Key由于过期时间必须从内存中删除

默认值为no,表示以阻塞模式删除对象。

lazyfree-lazy-server-del

lazyfree-lazy-server-del参数指定在以下情况是否独立于用户调用删除对象(是否以阻塞方式删除对象):

  • 由于执行某些命令导致数据存储在已存在的Key上,例如,RENAME命令可能会将旧Key的内容替换成另一个Key内容时将其删除。

默认值为no,表示以阻塞模式删除对象。

replica-lazy-flush

replica-lazy-flush参数指定在以下情况是否独立于用户调用删除对象(是否以阻塞方式删除对象):

  • 在复制过程中,当一个replica与它的master进行一次全量再同步时,为了刚刚加载的RDB文件,整个数据库的内容都会被删除。

默认值为no,表示以阻塞模式删除内容。

lazyfree-lazy-user-del

lazyfree-lazy-user-del参数指定将DEL命令执行改为非阻塞模式,默认值为no。

注意,通常此参数设置可能会发生在代码逻辑不太容易调整的情况下。

lazyfree-lazy-user-flush

lazyfree-lazy-user-flush参数指定在执行FLUSHDB、FLUSHALL和SCRIPT FLUSH命令时是否异步删除数据,也就是是否以阻塞模式删除。

FLUSHDB、FLUSHALL和SCRIPT FLUSH命令支持异步和同步删除,可以通过[SYNC/ASYNC]选项来指定是否异步。lazyfree-lazy-user-flush参数控制在没有选项指定时,这些命令是以异步还是同步的方式去删除数据。

THREADED I/O

io-threads

io-threads参数指定redis线程数量,默认情况下多线程是禁用的。

对于写入速度很慢的服务器上,通常redis会使用pipelining或实例切分来提高性能,但在这里指定redis多线程后,可以轻松将redis的速度提高两倍,而无需使用pipelining或实例切分。

注意,该参数只建议在4个CPU以上的服务器中使用,并且指定时,至少预留1个CPU备用。例如服务器4个CPU,则参数最大指定为3。另外还需说明,建议只在服务器出现性能问题时,才考虑使用此参数。

io-threads-do-reads

io-threads-do-reads参数指定redis线程是否执行读取操作,默认值为no。当启用I/O线程后,默认只会使用线程进行写操作。

官方文档上描述:通常线程配置读取没有多大的帮助。
注意:此命令为静态参数,不能在运行时使用config set更改,并且在ASO启用SSL时,此功能不起作用。另外,在使用redis-benchmark做性能测试时,必须使用–thread选项来指定线程数量,否则将无法看到性能改进。

KERNEL OOM CONTROL

oom-score-adj

oom-score-adj参数指定Linux内核在内存不足时OOM杀死哪些进程,可选值有:

  • no 不更改oom-score-adj的值,默认值。
  • yes 值是由服务器启动时oom-score-agj的初始值定义的,取值范围为-1000到1000,通常是0。
  • absolute 将oom-score-adj-values参数值写入到linux内核中,也就是按oom-score-adj-values参数值设定

oom-score-adj-values

oom-score-adj-values参数指定master、replica和后台子进程被杀死的分数,分数越高意味着被杀死的可能性越大,类似于权重。值范围-2000到2000。

KERNEL transparent hugepage CONTROL

disable-thp

disable-thp参数指定是否禁用透明大页,默认值为yes,表示禁用透明大页。

通常透明大页默认会被设置为“madvise”或“never”,在这种情况下该参数不会起任何作用。只有当透明大页设置为“always”时,redis默认会禁用透明大页,以避免透明大页带来的延迟问题。

APPEND ONLY MODE

appendonly

详细了解持久化可以参考官方文档:https://redis.io/topics/persistence

appendonly参数指定是否启用AOF持久化模式,默认值为no,表示不启用。

默认情况下,redis会将数据集转储到磁盘中,这种模式在断电或出现异常的时候还是会导致几分钟内的数据丢失。因此,如果你选择启用AOF持久化模式,在遇到断电等重大损失时,可能只会丢失一秒钟或1次的数据写入。

appendfilename

appendfilename参数指定AOF持久化的文件名,默认为appendonly.aof。

appendfsync

appendfsync参数指定将数据写入(fsync)到磁盘的方式,取值有以下三种:

  • no 不同步,让操作系统在需要时才刷新数据,非常快。
  • always 每次写入AOF日志后同步,缓慢但是安全。
  • everysec 每秒同步一次。

默认值“everysec”,它可以理解是为了速度和数据安全的一个折衷方案。

如果能容忍一些数据丢失的话,并且为了性能,可以考虑使用“no”;如果考虑到数据安全上,请使用“always”,它会比“everysec”更安全一些,但性能较慢。

no-appendfsync-on-rewrite

no-appendfsync-on-rewrite参数指定是否在BGSAVE或BGREWRITEAOF阶段时调用fsync,默认值为“no”。

在appendfsync参数设定成“always”或“everysec”,并且后台保存进程(后台保存进程和AOF日志重写)正在对磁盘执行大量I/O时,redis可能会阻塞很长时间的fsync。目前redis是没有解决此问题的方法的。因此,在遇到延迟问题时,可以将该值设置为“yes”,但这就意味着在最坏的情况下可能会丢失超过30秒的日志。

auto-aof-rewrite-percentage

auto-aof-rewrite-percentage参数指定自动重写AOF文件触发的百分比,指定百分比为0,则表示禁用自动重写AOF文件。

redis能够在AOF日志文件增加到指定的百分比时,自动重写调用BGREWRITEAOF的日志文件。它的工作原理是这样:redis会记录最后一次重写后AOF文件的大小(如果重启后没有发生重写,则使用启用时AOF的大小),此大小与当前的大小比较,如果当前大小大于指定的百分比的话,则触发重写。

auto-aof-rewrite-min-size

auto-aof-rewrite-min-size参数指定触发重写AOF文件的最小大小。

aof-load-truncated

aof-load-truncated参数指定redis启动遇到AOF文件被截断时是否继续加载。取值可能为:

  • yes reids启动时加载截断的AOF文件,并会打印日志通知用户该事件。
  • no redis启动时因错误拒绝启动,此时就需要用户手动使用“redis-check-aof”修复AOF文件。

aof-use-rdb-preamble

aof-use-rdb-preamble参数指定在重写AOF文件时,是否使用RDB前导码,以便更快的进行重写和恢复。启用后,重写的AOF文件由两个不同的部分组成:[RDB 文件] [AOF 尾部]。在加载时,redis会先识别AOF文件以“redis”字符串开头并加载前缀RDB文件,然后继续加载AOF尾部。

LUA SCRIPTING

lua-time-limit

lua-time-limit参数指定Lua脚本的最大可执行时间,以毫秒为单位。超过这个时间后,redis就会记录脚本已达到最大可执行时间,并开始回复带有错误的查询。设置为0或负值表示无限执行而不会发出警告。

REDIS CLUSTER

cluster-enabled

cluster-enabled参数指定redis实例是否以集群节点启动。

cluster-config-file

cluster-config-file参数指定集群节点的配置文件,每个集群节点都有一个集群配置文件,此文件不适合手动编辑,它由redis节点创建和更新。

每个redis集群节点都需要不同的集群配置文件,需要确保在同一系统中运行的实例没有同名的集群配置文件。

cluster-node-timeout

cluster-node-timeout参数指定集群节点超时时间,以毫秒为单位。只有当节点与集群在指定的时间内无法访问,才会被视为故障状态。

cluster-replica-validity-factor

cluster-replica-validity-factor参数指定集群发生故障时进行故障转移的有效性因子,将有效性因子设置为0,则会获得最大可用性。

在master遇到问题需要进行故障转移时,会先进行两项检查:

  1. 如果有多个副本能够进行故障转移,它们会交换信息以尝试最佳复制偏移量的副本提供(简单理解为包含master最多数据的节点即可)。
  2. 每个副本都会计算最后一次与master节点交互的时间,这可以是最后一次收到ping或命令(如果master节点可以连接),也可以是与master断开连接后经过的时间。如果最后一次交互的时间间隔太长,则副本根本不会进行故障转移。

具体来说,如果自副本与master节点交互后,经过的时间大于:(node-timeout * cluster-replica-validity-factor) + repl-ping-replica-period,则不会再进行故障转移。

cluster-migration-barrier

cluster-migration-barrier参数指定什么时候进行故障转移(指定master节点至少保留多少份副本时进行迁移),默认值为1,表示仅在master节点保留至少一份副本时迁移。

如果要禁用迁移,只需要将cluster-migration-barrier设置为一个非常大的值或将cluster-allow-replica-migration设置为0,不建议在生产环境中设置。

cluster-allow-replica-migration

cluster-allow-replica-migration参数指定是否允许使用较少的自动集群配置,默认为yes,表示允许自动迁移。它既影响迁移到孤立的master,也影响到副本迁移成空的master节点。

cluster-require-full-coverage

cluster-replica-no-failover

cluster-replica-no-failover参数指定副本是否在master故障期间尝试故障转移其主服务器,默认值“yes”,不进行转移。

cluster-allow-reads-when-down

cluster-allow-reads-when-down参数指定集群在关闭时是否提供读流量。

CLUSTER DOCKER/NAT support

cluster-announce-ip

cluster-announce-ip参数指定集群的公共IP地址,通常是由于NAT-ted或端口转发(典型是Docker容器中使用),导致节点地址发现失败。

cluster-announce-tls-port

cluster-announce-ip参数指定集群的TLS端口号,通常是由于NAT-ted或端口转发(典型是Docker容器中使用),导致节点地址发现失败。

cluster-announce-port

cluster-announce-ip参数指定集群的TCP端口号,通常是由于NAT-ted或端口转发(典型是Docker容器中使用),导致节点地址发现失败。

cluster-announce-bus-port

cluster-announce-ip参数指定集群的总线端口号,通常是由于NAT-ted或端口转发(典型是Docker容器中使用),导致节点地址发现失败。

SLOW LOG

slowlog-log-slower-than

slowlog-log-slower-than参数指定命令执行多久会记录到慢日志中,以微秒为单位。设置为负数表示禁用慢日志记录,设置为0会强制记录所有命令。

slowlog-max-len

slowlog-max-len参数指定慢日志的最大长度,需要注意的是,它会消耗内存。

LATENCY MONITOR

latency-monitor-threshold

latency-monitor-threshold参数指定是否开启延迟监控子系统,默认情况下是禁用的。

通常情况下不需要开启,只有遇到有延迟问题时,才建议开启,开启后会对性能有较小的影响。

EVENT NOTIFICATION

notify-keyspace-events

GOPHER SERVER

gopher-enabled

gopher-enabled参数指定redis是否支持Gopher协议。

ADVANCED CONFIG

hash-max-ziplist-entries

hash-max-ziplist-entries参数指定哈希以内存高效的数据结构编码的最大数量,超过该值就不会再以高效的数据结构进行编码。

hash-max-ziplist-value

hash-max-ziplist-value参数指定以哈希以内存高效的数据结构编码的最大哈希大小,超过该值就不会再以高效的数据结构进行编码。

list-max-ziplist-size

list-max-ziplist-size参数指定列表以一种特殊的方式编码,以节省大量空间。该参数可选以下值:

  • -5 最大大小:64Kb,不推荐用于正常工作负载中
  • -4 最大大小:32Kb,不推荐
  • -3 最大大小:16Kb,可能不推荐
  • -2 最大大小:8Kb,好
  • -1 最大大小:4Kb,好

性能最好的通常为-2或-1,但如果某些特殊生产环境,则可以自行测试。

list-compress-depth

list-compress-depth参数指定列表压缩的深度,该参数可选以下值:

  • 0 禁用列表压缩
  • 1 列表不压缩头和尾,压缩中间部分。例如有这样一个列表:[head] -> node -> node -> … -> node -> [tail],不会压缩列表的head和tail,只会压缩中间node部分。
  • 2 列表不压缩头、下一个、尾和尾的上一个。例如有这样一个列表:[head] -> [next] -> node -> node -> … ->[prev] -> [tail],不会压缩head、next、prev和tail,只会压缩中间node部分。
  • 3 列表不压缩头和尾开始的三个值,例如这样的列表:[head] -> [next] -> [next] -> node -> node -> … ->[prev] -> [prev] -> [tail]
  • n 列表不压缩头和尾开始的N个值。

set-max-intset-entries

set-max-intset-entries参数指定集合以一种特殊的方法编码,以节省空间。但有以下前提:当集合恰好由字符串组成,并且基数为10,范围是64位有符号整数。(这里理解有误差)

zset-max-ziplist-entries

zset-max-ziplist-entries参数指定zset以内存高效的数据结构编码的最大元素数量,超过该值就不会再以高效的数据结构进行编码。

zset-max-ziplist-value

zset-max-ziplist-value参数指定zset以内存高效的数据结构编码的最大元素大小,超过该值就不会再以高效的数据结构进行编码。

hll-sparse-max-bytes

hll-sparse-max-bytes参数指定以稀疏表示HyperLogLog的最大限制大小,超过该值会转换为密集表示。

注意,该参数大于16000是没有意义的,因为达到16000时使用密集表示更节省内存。建议值是0~3000,以便在不减慢太多PFADD的情况下获得空间高效编码的好处。当CPU不是问题的时候,就可以调高该值到10000以内,可以节省空间。

stream-node-max-bytes

stream-node-max-bytes参数指定流节点的最大字节数。

stream-node-max-entries

stream-node-max-entries参数指定流节点的最大条目数。

activerehashing

activerehashing参数指定是否主动重新散列。

client-output-buffer-limit

client-output-buffer-limit参数指定达到某种限制后强制断开由于某种原因没有足够快地从服务器读取数据的客户端。可以为以下三种客户端设置不同的限制:

  • normal 正常客户端,包括MONITOR客户端
  • replica 副本客户端
  • pubsub 客户端订阅了至少一个频道或模式

client-output-buffer-limit参数语法如下:

  • client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>

一旦达到硬限制,或者达到软限制并保持指定的秒数后,客户端立即断开链接。

client-query-buffer-limit

client-query-buffer-limit参数指定客户端查询缓冲区的大小。

proto-max-bulk-len

proto-max-bulk-len参数指定单个字符串的最大大小,默认为512Mb,最小必须为1Mb。

hz

hz参数指定执行后台任务的频率(例如超时关闭客户端,清除从未请求的过期Key等),默认值为10,最大值为500。

注意,通常默认值已经足够,只有在需要非常低延迟的环境中才建议提高至100。

dynamic-hz

dynamic-hz参数指定是否启用动态hz。当启用动态hz后,redis会自适应hz值的能力,会在许多连接的客户端时,暂时提高hz值。也就是说,启用动态hz后,hz参数设定值只是作为参考,当有大量客户端连接时,实际使用的值可能是hz的倍数。如此,空闲实例将使用非常少的 CPU 时间,而繁忙的实例将更加响应。

aof-rewrite-incremental-fsync

aof-rewrite-incremental-fsync参数指定在重写AOF文件时,是否在文件每生成32Mb的数据进行fsync。

启用后会对以增量的方式将文件提交到磁盘和避免较大的延迟峰值非常有用。

rdb-save-incremental-fsync

rdb-save-incremental-fsync参数指定在保存RDB文件时,是否在文件每生成32mb的数据进行fsync。

启用后会对以增量的方式将文件提交到磁盘和避免较大的延迟峰值非常有用。

lfu-log-factor

lfu-log-factor参数指定LFU算法的对数因子。

lfu-decay-time

lfu-decay-time参数指定LFU算法的衰减时间。

ACTIVE DEFRAGMENTATION

activedefrag

activedefrag参数指定是否启用自动碎片清理功能。

active-defrag-ignore-bytes

active-defrag-ignore-bytes参数指定主动碎片整理的最小碎片大小。

active-defrag-threshold-lower

active-defrag-threshold-lower参数指定主动碎片整理的最小碎片百分比。

active-defrag-threshold-upper

active-defrag-threshold-upper参数指定尽最大可能整理的最大碎片百分比。

active-defrag-cycle-min

active-defrag-cycle-min参数指定CPU百分比中进行碎片整理的最小工作量。

active-defrag-cycle-max

active-defrag-cycle-max参数指定CPU百分比中进行碎片整理的最大工作量。

active-defrag-max-scan-fields

active-defrag-max-scan-fields参数指定从主字典中扫描的set/hash/zset/list字段的最大数量

jemalloc-bg-thread

jemalloc-bg-thread参数指定Jemalloc后台清理进程默认是否启用。

server_cpulist

server_cpulist参数指定服务I/O进程固定使用的CPU列表。

bio_cpulist

bio_cpulist参数指定bio线程固定使用的CPU列表。

aof_rewrite_cpulist

aof_rewrite_cpulist参数指定AOF重写子进程固定使用的CPU列表。

bgsave_cpulist

bgsave_cpulist参数指定bgsave子进程固定使用的CPU列表。

ignore-warnings

ignore-warnings参数指定redis在检测到系统处于不良状态时,是否忽略警告,忽略多个警告可以使用空格分割。

0

评论区