Redis配置文件详解:入门指南

发表时间: 2024-11-26 10:26

本文基于Redis7.4.0版本讲解,Redis各配置节点的含义

我们知道Redis的启动,通常需要指定一下配置文件,但是通常一个配置文件中内容有2300多行,其中大部分是注释说明,真正有用的配置项只有一百来项,每个设置具体是什么含义,这里一一进行介绍,由于篇幅限制,分两个部分进行讲解,本部分主要对include、modules、network、tls\SSL、snapshotting、replication(主从复制)、keys trACKing(键跟踪)、security块的配置进行介绍。


总述

为了读取配置文件,Redis必须以文件路径作为第一个参数开始,如下:

./redis-server /path/to/redis.conf

关于单位的说明:当需要内存大小时,可以指定,其通常形式为1k 5GB 4M,以此类推,单位不区分大小写,因此1GB 1Gb 1gB都是一样的:

1k=>1000字节1kb=>1024字节1m=>1000000字节1mb=>1024*1024字节1g=>1000000000字节1gb=>1024*1024*1024字节

include块

在此处包含一个或多个其他配置文件。这是有用的,如果你有一个标准模板,可以用于所有Redis服务器,但也需要为每台服务器定制一些设置。包含文件可以包括其他文件,所以要明智地使用它。

请注意,选项“include”不会被命令“CONFIG REWRITE”重写来自管理员或Redis Sentinel。因为Redis总是使用最后处理的行作为配置指令的值,你最好把includes放进去在这个文件的开头,以避免在运行时覆盖配置更改。

如果您的目的是使用includes覆盖配置选项,最好将include作为最后一行。

包含的路径可能包含通配符。所有与通配符匹配的文件都将按字母顺序排列。请注意,如果包含路径包含通配符,但在以下情况下没有与之匹配的文件服务器启动后,include语句将被忽略,不会出现任何错误被暴露出来。因此,包含来自空的通配符文件是安全的目录。

#include /path/to/local.conf#include /path/to/other.conf#include /path/to/fragments/*.conf

modules块

启动时加载模块。如果服务器无法加载模块它将中止。可以使用多个loadmodule指令。

#loadmodule /path/to/my_module.so#loadmodule /path/to/other_module.so#loadmodule /path/to/args_module.so[arg[arg…]]

network块

默认情况下,如果没有指定“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只监听IPv4IPv6(如果可用)环回接口地址(这意味着Redis将只能接受来自同一主机的客户端连接继续运行)。

如果您确定希望您的实例监听所有接口把下面这行注释掉。除非明确禁用保护,否则您还需要设置密码模式。

bind 127.0.0.1 -::1

默认情况下,传出连接(从副本到主,从Sentinel到实例、集群总线等)不绑定到特定的本地地址。在大多数情况下,这意味着操作系统将根据路由来处理以及连接出去的接口。使用绑定源地址,可以配置特定的地址进行绑定,这也可能影响连接的路由方式。

#示例:##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 监听积压,在每秒请求数高的环境中,您需要一个高积压订单以避免客户端连接速度慢的问题。请注意,Linux内核将自动将其截断为/proc/sys/net/core/somaxconn的值,因此确保同时提高somaxconn和TCP_maxsyn_backlog的值以获得期望的效果。

tcp-backlog 511

Unix套接字。指定将用于监听的Unix套接字的路径传入连接。没有默认值,所以Redis不会监听如果未指定,则在unix套接字上。

#unixsocket/run/redis.sock#unixsocketperm 700

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

timeout 0

TCP保持活动

如果非零,则使用SO_KEEPALIVE向不存在TCP ACKs的客户端发送TCP ACK通信。这有两个原因:

1)检测死亡的对等体。

2)强制中间的网络设备考虑连接活着。

Linux上,指定的值(以秒为单位)是用于发送ACK的时段。请注意,要关闭连接,需要加倍的时间。在其他内核上,周期取决于内核配置。此选项的合理值为300秒,该配置项从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侦听端口。要启用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端口上的客户端(包括副本服务器)使用有效的客户端证书进行身份验证。如果指定“否”,则不需要也不接受客户端证书。如果指定了“可选”,则接受客户端证书,并且必须如果提供,则有效,但不是必需的。

# 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"

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

# tls-ciphers DEFAULT:!MEDIUM

配置允许的TLSv1.3密码套件。有关更多信息,请参阅密码(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日志以准输出形式输出。请注意,如果您使用标准输出用于日志记录,但后台进程化,日志将被发送到/dev/null

logfile ""

要启用系统记录器的日志记录,只需将“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日志记录是禁用。基本上,这意味着通常只有在以下情况下才会显示徽标

interactive sessions

然而,可以强制使用4.0之前的行为,并始终显示通过将以下选项设置为yes,在启动日志中显示ASCII艺术徽标。

always-show-logo no

为了避免将个人身份信息(PII)记录到服务器日志文件中,取消对以下内容的注释:

# hide-user-data-from-log yes

默认情况下,Redis将进程标题(如“top”和“ps”所示)修改为提供一些运行时信息。可以禁用此功能并通过将以下设置为否来执行进程名称。

set-proc-title yes

在更改进程标题时,Redis使用以下模板构造修改后的标题。模板变量在花括号中指定。以下变量被支持:

{title} 父进程执行的进程名称,或子进程的类型。{listen-add}绑定地址或“*”,后跟TCP或TLS端口侦听,或如果Unix套接字可用的话。{server-mode}特殊模式,即“[哨兵]”或“[集群]”。{port}TCP端口正在侦听,或0。{tls端口}正在侦听tls端口,或0。{unixsocket}Unix域套接字正在侦听,或“”。{config file}使用的配置文件的名称。proc-title-template "{title} {listen-addr} {server-mode}"

设置用于字符串比较操作的本地环境,也会影响Lua脚本的性能。空字符串表示区域设置是从环境变量中导出的。

locale-collate ""

SNAPSHOTTING块

保存数据库到硬盘。

格式 save <seconds> <changes> [<seconds> <changes> ...]

如果经过了给定的秒数,Redis将保存数据库超过了对DB的给定写入操作次数。使用单个空字符串参数可以完全禁用快照如以下示例所示:

# save ""

除非另有说明,否则默认情况下Redis将保存数据库:

*3600秒(一小时)后,如果至少进行了一次更改*300秒(5分钟)后,如果执行了至少100次更改*60秒后,如果执行了至少10000次更改#您可以通过取消注释以下行来显式设置这些值。# save 3600 1 300 100 60 10000

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

stop-writes-on-bgsave-error yes

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

rdbcompression yes

自RDB版本5以来,CRC64校验和被放置在文件的末尾。这使得格式更耐损坏,但有性能保存和加载RDB文件时将消耗(约10%),因此为了获得最佳性能您可以禁用它。禁用校验和创建的RDB文件的校验和为零,这将告诉加载代码跳过检查。

rdbchecksum yes

在以下情况下启用或禁用对ziplist和listpack等的完全净化检查加载RDB或RESTORE有效负载。这减少了断言或稍后在处理命令时崩溃。选项:

no -切勿进行全面净化

yes -始终进行全面净化

clients -仅对用户连接执行完全净化。不包括:RDB文件、从主机接收的RESTORE命令连接和客户端连接具有跳过清理有效负载ACL标志。

默认值应该是“客户端”,但由于它当前影响集群通过MIGRATE重新标记时,默认情况下暂时设置为“否”。

# sanitize-dump-payload no

转储数据库的文件名。

dbfilename dump.rdb

在未启用持久性的实例中删除复制使用的RDB文件。默认情况下,此选项处于禁用状态,但也有环境出于法规或其他安全考虑,RDB文件保存在按主控磁盘以馈送副本,或按副本存储在磁盘上为了在初始同步时加载它们,应将其尽快删除。请注意,此选项仅在同时具有AOF的情况下有效并且RDB持久性被禁用,否则将被完全忽略。获得相同效果的另一种(有时更好)方法是在主实例和副本实例上使用无盘复制。然而对于副本,无盘并不总是一种选择。

rdb-del-sync-files no

工作目录。DB将写入此目录中,并指定文件名上面使用“dbfilename”配置指令。仅附加文件也将在此目录中创建。请注意,您必须在此处指定目录,而不是文件名。

dir /usr/local/redis-7.4.0/

REPLICATION块

主副本复制。使用replicaof将Redis实例复制为另一个Redis服务器。关于Redis复制,需要了解ASAP。

+------------------+ +---------------+# | Master | ---> | Replica |# | (receive writes) | | (exact copy) |# +------------------+ +---------------+

1) Redis复制是异步的,但如果主服务器似乎没有与至少给定数量的副本连接,您可以将其配置为停止接受写入。

2)如果复制链接丢失的时间相对较短,Redis副本能够与主副本执行部分重新同步。您可能希望根据需要使用合理的值配置复制积压大小(请参阅本文件的下一节)。

3)复制是自动的,不需要用户干预。网络断开后,副本会自动尝试重新连接到主机并与它们重新同步。

# replicaof <masterip> <masterport>

如果主机受密码保护(使用下面的“requirepass”配置指令),则可以在开始复制同步过程之前告诉副本进行身份验证,否则主机将拒绝副本请求。

# masterauth <master-password>

但是,如果您使用的是Redis ACL(适用于Redis版本6或更高版本),并且默认用户无法运行PSYNC命令和/或复制所需的其他命令,那么这还不够。在这种情况下,最好配置一个特殊用户用于复制,并指定主用户配置如下:

# masteruser <username>

当指定了主用户时,副本将使用新的AUTH表单对其主用户进行身份验证:AUTH <username> <password>。

当副本失去与主副本的连接时,或者当复制仍在进行时,副本可以以两种不同的方式运行:

1) 如果副本服务过时数据设置为“是”(默认值),则副本仍将回复客户端请求,可能是使用过期数据,或者如果这是第一次同步,则数据集可能只是空的。

2) 如果副本服务过时数据设置为“否”,则副本将对所有数据访问命令(不包括以下命令)回复错误“带MASTER的MASTER链接已关闭,副本服务过时的数据设置为”否“,所有数据访问命令,不包括以下命令:

INFO, REPLICAOF, AUTH, SHUTDOWN, REPLCONF, ROLE, CONFIG, SUBSCRIBE,UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB, COMMAND, POST,HOST and LATENCY.

replica-serve-stale-data yes

您可以将副本实例配置为接受或不接受写入。对副本实例进行写入可能有助于存储一些临时数据(因为在与主实例重新同步后,写入副本的数据很容易被删除),但如果客户端因配置错误而写入副本,也可能会导致问题。从Redis 2.6开始默认情况下副本是只读的。注意:只读副本不是为了暴露给互联网上不受信任的客户端而设计的。它只是一个防止滥用实例的保护层。默认情况下,只读副本仍会导出所有管理命令,如CONFIG、DEBUG等。在有限的范围内,您可以使用'rename-command'来屏蔽所有管理/危险命令,从而提高只读副本的安全性。

replica-read-only yes

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

# repl-ping-replica-period 10

以下选项设置的复制超时时间:

1) 从复制品的角度来看,SYNC期间的批量传输I/O。

2) 从副本(数据、ping)的角度来看,主超时。

3) 从主机的角度来看,副本超时(REPLCONF ACK ping)。

重要的是要确保此值大于为重新规划副本周期指定的值,否则每次主副本之间的流量较低时都会检测到超时。默认值为60秒。

# repl-timeout 60

SYNC后是否禁用副本套接字上的TCP_NODELAY?如果选择“是”,Redis将使用更少的TCP数据包和更少的带宽将数据发送到副本。但这可能会增加延迟数据将显示在副本侧,最长40毫秒使用默认配置的Linux内核。如果选择“否”,数据出现在副本端的延迟将减少,但将使用更多带宽进行复制。默认情况下,我们针对低延迟进行优化,但在流量非常大的情况下或者,当主服务器和副本相距很远时,将其设置为“是”可能是一个好主意。

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永远不会选择优先级为零的副本进行升级。默认情况下,优先级为100

replica-priority 100

传播错误行为控制着Redis在无法处理来自主机的复制流中正在处理的命令或在读取AOF文件时处理的命令时的行为。传播过程中发生的错误是意外的,可能会导致数据不一致。然而,在Redis的早期版本中,存在一些边缘情况,服务器可能会复制或持久化在未来版本中会失败的命令。因此,默认行为是忽略此类错误并继续处理命令。如果应用程序希望确保没有数据分歧,则应将此配置设置为“panic”。该值还可以设置为“复制副本上的panic”,仅当复制副本在复制流上遇到错误时才触发panic。一旦有足够的安全机制来防止误报碰撞,这两个恐慌值中的一个将在未来成为默认值。

# propagation-error-behavior ignore

副本忽略磁盘写入错误控制副本在无法将从其主服务器接收到的写入命令持久化到磁盘时的行为。默认情况下,此配置设置为“否”,在这种情况下会使副本崩溃。不建议更改此默认值,但是为了与旧版本的Redis兼容,可以将此配置切换为“是”,这将只记录一个警告并执行它从主服务器收到的写入命令。

# replica-ignore-disk-write-errors no

默认情况下,Redis Sentinel在其报告中包含所有副本。Redis Sentinel的公告中可以排除副本。未宣布的副本将被“sentinel replicas<master>”命令忽略,并且不会暴露给Redis sentinel的客户端。此选项不会更改副本优先级的行为。即使宣布的副本设置为“否”,副本也可以升级为主副本。要防止这种行为,请将副本优先级设置为0。

# replica-announced yes

如果连接的副本少于N个,延迟小于或等于M秒,则主服务器可能会停止接受写入。N个副本需要处于“在线”状态。以秒为单位的延迟必须<=指定值,根据从副本接收到的最后一次ping计算,通常每秒发送一次。此选项不保证N个副本将接受写入,但会将丢失写入的暴露窗口限制在指定的秒数内,以防没有足够的副本可用。例如,如果需要至少3个延迟<=10秒的副本,请使用:

# min-replicas-to-write 3# min-replicas-max-lag 10

将其中一个设置为0将禁用该功能。默认情况下,要写入的最小副本设置为0(功能禁用),最小副本最大延迟设置为10。Redis主机能够以不同的方式列出所连接副本的地址和端口。例如,“INFO replication”部分提供了此信息,Redis Sentinel使用此信息和其他工具来发现副本实例。此信息可用的另一个地方是主机的“ROLE”命令的输出中。副本通常报告的列出的IP地址和端口通过以下方式获得:

ip:通过检查副本用于连接主机的套接字的对等地址来自动检测地址。

port:该端口在复制握手期间由复制副本进行通信,通常是复制副本用于侦听连接的端口。

但是,当使用端口转发或网络地址转换(NAT)时,实际上可以通过不同的IP和端口对访问副本。副本可以使用以下两个选项向其主机报告一组特定的IP和端口,以便INFO和ROLE都报告这些值。如果您只需要覆盖端口或IP地址,则不需要同时使用这两个选项。

# replica-announce-ip 5.5.5.5# replica-announce-port 1234

KEYS TRACKING块

Redis实现了对客户端值缓存的服务器辅助支持。这是通过一个无效表来实现的,该表使用按键名索引的基数键来记住哪些客户端拥有哪些键。反过来,这被用来向客户端发送无效消息。请查看此页面以了解有关该功能的更多信息:

# https://redis.io/topics/client-side-caching

当为客户端启用跟踪时,假设所有只读查询都被缓存:这将迫使Redis将信息存储在无效表中。当Key被修改时,这些信息会被清除,并向客户端发送无效消息。然而,如果工作负载主要由读取主导,Redis可能会使用越来越多的内存来跟踪许多客户端获取的Key。

因此,可以为无效表配置最大填充值。默认情况下,它设置为1M的Key,一旦达到这个限制,Redis将开始驱逐无效表中的Key,即使它们没有被修改,只是为了回收内存:这反过来又会迫使客户端使缓存的值无效。基本上,表的最大大小是服务器端用于跟踪谁缓存了什么的信息的内存与客户端在内存中保留缓存对象的能力之间的权衡。

如果将该值设置为0,则表示没有限制,Redis将根据需要在无效表中保留尽可能多的键。在“统计”信息部分,您可以在无效表中找到每个给定时刻的Key数量信息。

注意:在广播模式下使用Key跟踪时,服务器端不使用内存,因此此设置无效。

# tracking-table-max-keys 1000000

Security块

警告:由于Redis非常快,外部用户最多可以尝试每秒对一个现代盒子输入100万个密码。这意味着你应该使用非常强的密码,否则它们很容易被破解。

请注意,由于密码实际上是客户端和服务器之间的共享秘密,任何人都不应该记住,因此密码可以很容易地是来自/dev/urandom或其他文件的长字符串,因此使用长且无法破解的密码就不可能进行暴力攻击。

Redis ACL用户定义格式如下:

# user <username> ... acl rules ...## 例如:## user worker +@list +@connection ~jobs:* on >ffa9203c493aa99

特殊用户名“默认”用于新连接。如果此用户具有“nopass”规则,则新连接将立即被验证为“默认”用户,而不需要通过AUTH命令提供任何密码。否则,如果“默认”用户未标记为“nopass”,则连接将在未经身份验证的状态下启动,并需要AUTH(或HELLO命令AUTH选项)才能进行身份验证并开始工作。

描述用户可以做什么的ACL规则如下:

on 启用用户:可以作为此用户进行身份验证。off 禁用用户:不再可能与此用户进行身份验证,但已通过身份验证的连接仍将工作。skip-sanitize-payload 将跳过RESTORE转储负载清理。sanitize-payload RESTORE转储负载已净化(默认)。+<command> 允许执行该命令。可以与“|”一起使用,以允许子命令(例如“+config|get”)-<command> 不允许执行该命令。可以与“|”一起使用以阻止子命令(例如“-config|set”)+@<category> 允许执行此类类别中所有具有有效类别的命令,如@admin、@set、@sortedset等。。。等等。#请参阅server.c文件中描述和定义Redis命令表的完整列表。特殊类别@all表示所有命令,但目前存在于服务器中,将来将通过模块加载。+<command>|first arg 允许禁用命令的特定第一个参数。#它仅在具有以下命令的情况下受支持没有子命令,也不允许像-SELECT|1这样的负数形式,只允许以“+”开头的加法。此功能已弃用,将来可能会删除。all命令+@all的别名。请注意,它暗示了执行的能力所有未来通过模块系统加载的命令。nocommands -@all的别名~<pattern>添加一个可以作为命令一部分提及的按键模式。例如,~*允许所有键。该图案是一种类似于KEYS的球形图案。可以指定多个模式。%R~<pattern>添加键读取模式,指定可以从哪些键读取。%W~<pattern>添加键写入模式,指定可以写入哪些键可以被写入。allkeys  ~*的别名resetkeys 刷新允许的按键模式列表。&<pattern>添加用户可以访问的发布/子频道的glob样式模式。可以指定多个通道模式。allchannels 别名&*resetchannels刷新允许的通道模式列表。><password>将此密码添加到用户的有效密码列表中。例如,>mypass会将“mypass”添加到列表中。此指令清除“nopass”标志(见下文)。从有效密码列表中删除此密码。nopass删除用户的所有设置密码,并将用户标记为不需要密码:这意味着每个密码都将对该用户有效。如果此指令用于默认用户,则每个新连接都将立即使用默认用户进行身份验证,而不需要任何显式的AUTH命令。请注意,“resetpass”指令将清除此条件。resetpass刷新允许的密码列表。此外,取消“nopass”状态。“resetpass”后,用户没有关联的密码,如果不添加一些密码(或稍后将其设置为“nopass”),就无法进行身份验证。reset执行以下操作:resetpass、resetkeys、resetchannels、allchannels(如果设置了acl pubsub默认值)、off、clearselectors、-@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、重命名、EXITS、DBSIZE、KEYS、EXPIRE、TTL、FLUSHALL等。								可以修改键空间、键或元数据的命令也将具有“写入”类别。只读取键空间、键或元数据的命令将具有“读取”类别。*read-从键(值或元数据)读取。请注意,不与键交互的命令既没有“读取”也没有“写入”。*write-写入键(值或元数据)*admin-管理命令。普通应用程序永远不需要使用这些。包括REPLICAOF、CONFIG、DEBUG、SAVE、MONITOR、ACL、SHUTDOWN等。*危险-潜在危险(出于各种原因,应谨慎考虑)。这包括FLUSHALL、MIGRATE、RESTORE、SORT、KEYS、客户端、调试、信息、配置、保存、复制等。*connection-影响连接或其他连接的命令。这包括AUTH、SELECT、COMMAND、CLIENT、ECHO、PING等。*blocking-可能会阻塞连接,直到被另一个命令释放。*fast-快速O(1)命令。可以循环参数的数量,但不能循环键中的元素数量。*slow-所有不快速的命令。*pubsub-发布/订阅相关*transaction-与WATCH/MULTI/EXEC相关的命令。*scripting-与脚本相关。*set-数据类型:与集合相关。*sortedset-数据类型:与zsets相关。*list-数据类型:列表相关。*hash-数据类型:哈希相关。*string-数据类型:字符串相关。*bitmap-数据类型:位图相关。*hyperlog-数据类型:与hyperlog相关。*geo-数据类型:地理相关。*stream-数据类型:流相关。

有关ACL配置的更多信息,请参阅Redis网站https://redis.io/topics/acl

user redis

ACL日志

ACL日志跟踪与ACL关联的失败命令和身份验证事件。ACL日志对于排除ACL阻止的失败命令非常有用。ACL日志存储在内存中。您可以使用ACL日志重置来回收内存。在下面定义ACL日志的最大条目长度。

acllog-max-len 128

使用外部ACL文件

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

aclfile /etc/redis/users.acl

重要提示:从Redis 6开始,“requirepass”只是新ACL系统之上的一个兼容层。选项效果将只是为默认用户设置密码。客户端仍将像往常一样使用AUTH<密码>进行身份验证,或者更明确地使用AUTH默认<密码>

如果他们遵循新的协议:两者都会奏效。

requirepass与aclfile选项和ACL LOAD命令不兼容,这将导致忽略requirepass。

requirepass _7!ewstffzPBabc

默认情况下,新用户通过等效于此ACL规则“off-resetkeys-@all”的限制权限进行初始化。从Redis 6.2开始,也可以使用ACL规则管理对Pub/Sub通道的访问。如果新用户由acl pubsub默认配置指令控制,则默认的Pub/Sub通道权限接受以下值之一:

allchannels:授予对所有发布/子频道的访问权限

resetchannels:撤销对所有发布/子频道的访问权限

从Redis 7.0开始,acl pubsub默认为“resetchannels”权限。

acl-pubsub-default resetchannels

Command renaming(已撤销)。

警告:如果可能,请避免使用此选项。相反,使用ACL从默认用户中删除命令,并将其仅放在您为管理目的创建的某些管理员用户中。

可以在共享环境中更改危险命令的名称。例如,CONFIG命令可能会被重命名为难以猜测的名称,这样它仍然可以用于内部使用工具,但不能用于一般客户端。

rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52#也可以通过将命令重命名为空字符串来完全杀死它:rename-command CONFIG ""

请注意,更改登录到AOF文件或传输到副本的命令的名称可能会导致问题。