[原创]Redis最新版本6.0.5配置介绍&docker部署&三个warning日志踩坑解决
Redis最新版本6.0.5配置介绍
# 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文件可以包含其他文件,所以要明智地使用它。
# 注意选项“include”不会被来自admin或Redis Sentinel的命令“CONFIG REWRITE”重写。由于Redis总是使用最后处理的行作为配置指令的值,所以最好将includes放在这个文件的开头,以避免在运行时覆盖配置更改。
# 如果您对使用include重写配置选项感兴趣,那么最好使用include作为最后一行。
#
# include /path/to/local.conf
# include /path/to/other.conf
################################## 组件配置区 #####################################
# 启动时加载模块。如果服务器无法加载模块,它将中止。可以使用多个loadmodule指令。
#
# loadmodule /path/to/my_module.so
# loadmodule /path/to/other_module.so
################################## 网络配置区 #####################################
# 默认情况下,如果没有指定“bind”配置指令,Redis将侦听服务器上所有可用网络接口的连接。使用“bind”配置指令,后跟一个或多个IP地址,可以只监听一个或多个选定的接口。
# 例如:
#
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
#
# ~~~ 警告 ~~~ 如果运行Redis的计算机直接暴露在internet上,绑定到所有接口是危险的,并且会将实例暴露给internet上的每个人。
# 因此,默认情况下,我们取消了以下bind指令的注释,这将强制Redis只监听IPv4环回接口地址(这意味着Redis只能接受来自运行在同一台计算机上的客户端的连接) .
#
# 如果您确定希望实例监听所有接口,只需注释以下行(bind 127.0.0.1)。 注意这条要是没有被注释掉,docker运行后无法访问
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# bind 127.0.0.1
# Protected mode是一个安全保护层,目的是避免在internet上开放的Redis实例被访问和利用。当保护模式开启时,如果:
# 1) 服务器没有使用“bind”指令显式绑定到一组地址。
# 2) 未配置密码。
# 服务器只接受来自IPv4和IPv6环回地址127.0.0.1和::1的客户端以及来自Unix域套接字的连接。
# 默认情况下,已启用保护模式。只有当您确定希望其他主机的客户机连接到Redis时,才应该禁用它,即使没有配置身份验证,也没有使用“bind”指令显式列出一组特定的接口。
protected-mode yes
# 默认情况下,端口是指定的。如果指定了端口0,Redis将不会监听TCP套接字。
port 6379
# TCP listen() backlog.
#
# 在每秒请求数高的环境中,为了避免客户机连接速度慢的问题,您需要大量的积压工作。请注意,Linux内核将静默地将其截断为/proc/sys/net/core/somaxconn的值,因此请确保同时提高somaxconn和tcp_max_syn_backlog的值,以获得所需的效果。
tcp-backlog 511
# Unix socket.
# 指定将用于侦听传入连接的Unix套接字的路径。没有默认值,因此未指定时,Redis将不会侦听unix套接字。
# unixsocket /tmp/redis.sock
# unixsocketperm 700
# 在客户端空闲N秒后关闭连接(0表示禁用)
timeout 0
# TCP 保持联系.
#
# 如果不为零,请使用SO_KEEPALIVE在没有通信的情况下向客户端发送TCP ack。这有两个原因:
# 1) 检测死机。
# 2)从中间网络设备的角度进行连接。
# 在Linux上,指定的值(以秒为单位)是用于发送确认的周期。请注意,要关闭连接,需要加倍的时间。
# 在其他内核上,周期取决于内核配置。
# 此选项的合理值为300秒,这是从Redis 3.2.1开始的新Redis默认值。
tcp-keepalive 300
################################# 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
# 配置DH参数文件以启用Diffie-Hellman(DH)密钥交换:
# 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
# 默认情况下,Redis副本不尝试与其主副本建立TLS连接。使用以下指令在复制链接上启用TLS。
# tls-replication yes
# 默认情况下,Redis集群总线使用纯TCP连接。要为总线协议启用TLS,请使用以下指令:
# tls-cluster yes
# 显式指定要支持的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
################################# 常规配置区 #####################################
# 默认情况下,Redis不作为守护进程运行。如果需要,请使用“是”。注意Redis将在/var/run/redis.pid中写入一个pid文件当被守护时。
daemonize no
# 如果您从upstart或systemd运行Redis,那么Redis可以与您的监督树进行交互。选项:
# supervised no - 无监督互动
# supervised upstart - 通过将Redis置于SIGSTOP模式发出信号
# supervised systemd - 通过写入READY=1到$NOTIFY_SOCKET发送信号系统
# supervised auto - 基于upstart_JOB或NOTIFY_SOCKET环境变量检测upstart或systemd方法
# 注意:这些监视方法只发出“进程准备就绪”的信号。它们不会向您的主管启用连续的活动ping。
supervised no
# 如果指定了pid文件,Redis会在启动时将其写入指定的位置,并在退出时将其删除。
# 当服务器运行非守护程序时,如果配置中未指定任何pid文件,则不会创建任何pid文件。当服务器被守护时,即使未指定pid文件,也将使用该文件,默认值为“/var/run”/redis.pid文件".
# 创建一个pid文件是最好的方法:如果Redis不能创建它,那么不会有什么不好的事情发生,服务器将正常启动和运行。
pidfile /var/log/redis/redis.pid
# 指定服务器详细程度水平。这个可以是以下之一:
# 调试debug(很多信息,对开发/测试很有用)
# 冗长verbose(很多很少有用的信息,但不像调试级别那样混乱)
# 注意notice(适度冗长,您可能希望在生产中使用什么)
# 警告warning(只记录非常重要/关键的消息)
loglevel notice
# 指定日志文件名。也可以使用空字符串强制Redis以标准日志格式输出。请注意,如果您使用标准输出进行日志记录,且配置redis为守护进程方式运行,日志将被发送到/dev/null
logfile /var/log/redis/redis.log
# 要启用对系统记录器的日志记录,只需将“syslog enabled”设置为yes,并根据需要更新其他syslog参数。
# syslog-enabled no
# 指定系统日志标识。
# syslog-ident redis
# 指定syslog工具。必须是USER或介于LOCAL0-LOCAL7之间。syslog设施本地0
# 设置数据库的数量。默认数据库是db0,您可以使用select<dbid>在每个连接的基础上选择一个不同的数据库,其中dbid是0和“databases”减1之间的数字
databases 16
# 默认情况下,仅当开始记录到标准输出并且标准输出是TTY时,Redis才会显示ASCII艺术徽标。基本上这意味着一个logo通常只在交互会话中显示。但是,通过将以下选项设置为yes,可以强制4.0之前的行为,并始终在启动日志中显示ASCII art徽标。
always-show-logo yes
################################ 快照区 ################################
#
# 将数据库保存在磁盘上:
# save <seconds> <changes>
# 如果对数据库执行给定的秒数和写入操作数,则将保存数据库。
#
# 在下面的示例中,行为将是保存:
# 900秒(15分钟)后,如果至少有1个键改变
# 300秒(5分钟)后,如果至少有10个键发生变化
# 60秒后,如果至少有10000个钥匙被更改
#
# 注意:您可以通过注释掉所有“save”行来完全禁用保存。
# 还可以通过添加带有单个空字符串参数的save指令来删除所有先前配置的存储点,如以下示例所示:
# save ""
save 900 1
save 300 10
save 60 10000
# 默认情况下,如果启用了RDB快照(至少有一个保存点),并且最新的后台保存失败,则Redis将停止接受写入。这将使用户意识到(以一种硬的方式)数据没有正确地保存在磁盘上,否则很可能没有人会注意到,并且会发生一些灾难。
# 如果后台保存进程重新开始工作,Redis将自动允许再次写入。
#
# 但是,如果您已经设置了对Redis服务器和持久性的适当监视,那么您可能希望禁用此功能,以便即使磁盘、权限等出现问题,Redis也将继续正常工作。
stop-writes-on-bgsave-error yes
# 在转储.rdb数据库时使用LZF压缩字符串对象?默认设置为“是”,因为这几乎总是一场胜利。如果您想在saving子进程中保存一些CPU,请将其设置为“no”,但如果您有可压缩的值或键,则数据集可能会更大。
rdbcompression yes
# 由于RDB的版本5,CRC64校验和被放在文件的末尾。这使得格式更能防止损坏,但是在保存和加载RDB文件时,会有一个性能损失(大约10%),因此您可以禁用它以获得最大的性能。
# 在禁用校验和的情况下创建的RDB文件的校验和为零,这将告诉加载代码跳过检查。
rdbchecksum yes
# 转储数据库的文件名
dbfilename dump.rdb
# 在没有启用持久性的实例中删除复制使用的RDB文件。默认情况下,此选项处于禁用状态,但是,在某些环境中,出于管理法规或其他安全考虑,应尽快删除主服务器在磁盘上保留的RDB文件,以便向副本提供数据,或通过副本存储在磁盘上以加载这些文件以进行初始同步。请注意,此选项仅适用于同时禁用AOF和RDB持久性的实例,否则将完全忽略。
# 另一种(有时更好)的方法是在主实例和副本实例上使用无盘复制。但是,对于副本,无盘并不总是一个选项。
rdb-del-sync-files no
# 工作目录。数据库将写入此目录中,并使用上面使用“dbfilename”配置指令指定的文件名。仅附加文件也将在此目录中创建。请注意,您必须在此处指定目录,而不是文件名。
dir /data
################################# 复制 #################################
# 主副本复制。使用replicaof使Redis实例成为另一个Redis服务器的副本。关于Redis复制,需要尽快了解一些事情。
#
# +------------------+ +---------------+
# | Master | ---> | Replica |
# | (receive writes) | | (exact copy) |
# +------------------+ +---------------+
# 1) Redis复制是异步的,但是您可以配置一个主服务器,使其停止接受写入,如果它似乎没有连接到至少给定数量的副本。
# 2) 如果复制链接丢失的时间相对较短,则Redis副本能够与主服务器执行部分重新同步。根据您的需要,您可能需要使用一个合理的值来配置复制backlog大小(请参阅此文件的下一节)。
# 3) 复制是自动的,不需要用户干预。在网络分区之后,复制副本会自动尝试重新连接到主机并与它们重新同步。
# replicaof <masterip> <masterport>
# 如果主机受密码保护(使用下面的“requirepass”配置指令),则可以在开始复制同步过程之前通知副本进行身份验证,否则主服务器将拒绝副本请求。
# masterauth <master-password>
#
# 但是,如果您使用的是Redis acl(用于Redis version 6或更高版本),并且默认用户无法运行PSYNC命令和/或复制所需的其他命令,那么这还不够。在这种情况下,最好配置一个用于复制的特殊用户,并按如下方式指定主用户配置:
# masteruser <username>
#
# 指定masteruser后,复制副本将使用新的身份验证表单对其主用户进行身份验证: AUTH <username> <password>.
# 当复制副本失去与主服务器的连接时,或者当复制仍在进行时,复制副本可以以两种不同的方式操作 :
# 1) 如果replica-serve-stale-data设置为“yes”(默认值),则复制副本仍将响应客户端请求,数据可能已过期,或者如果这是第一次同步,则数据集可能为空。
# 2) 如果replica serve stale data设置为'no',则除了INFO、replicaOF、AUTH、PING、SHUTDOWN、REPLCONF、ROLE、CONFIG、SUBSCRIBE、UNSUBSCRIBE、PSUBSCRIBE、PUNSUBSCRIBE、PUBLISH、PUBSUB、COMMAND、POST、HOST:和LATENCY以外,所有类型的命令都将返回错误“SYNC with master in progress”。
#
replica-serve-stale-data yes
# 您可以将副本实例配置为接受或不接受写入。针对副本实例的写入对于存储一些短暂的数据可能很有用(因为在副本上写入的数据在与主服务器重新同步后很容易被删除),但是如果客户机由于配置错误而向其写入数据,也可能会导致问题 .
# 因为Redis 2.6默认情况下副本是只读的。
#
# 注意:只读副本不是为暴露在internet上的不可信客户端而设计的。它只是防止实例被滥用的保护层。默认情况下,只读副本仍会导出所有管理命令,如CONFIG、DEBUG等。在一定程度上,您可以使用“rename command”来隐藏所有管理/危险命令来提高只读副本的安全性。
replica-read-only yes
# 复制同步策略:磁盘或套接字。
#
# 新的复制副本和重新连接的复制副本如果只是接收到差异而无法继续复制过程,则需要执行所谓的“完全同步”。RDB文件从主服务器传输到副本。
# 传输有两种不同的方式:
# 1) Disk-backed: 磁盘备份:Redis主机创建一个新进程,将RDB文件写入磁盘。稍后,该文件由父进程以增量方式传输到副本。
# 2) Diskless: 无盘: Redis master创建了一个新进程,直接将RDB文件写入副本套接字,而不需要接触磁盘。
#
# 使用“磁盘备份”复制,在生成RDB文件时,只要当前生成RDB文件的子级完成工作,就可以将更多副本排入队列并与RDB文件一起提供服务。使用无盘复制,一旦传输开始,到达的新副本将进入队列,新的传输将在当前复制终止时开始。
# 当使用“无盘”复制时,主机在开始传输之前等待一段可配置的时间(以秒为单位),希望多个副本将到达并且传输可以并行化。
# 对于慢速磁盘和快速(大带宽)网络,无盘复制效果更好。
repl-diskless-sync no
# 启用无盘复制时,可以配置服务器等待的延迟,以便生成通过套接字将RDB传输到副本的子级。
# 这一点很重要,因为一旦传输开始,就不可能为到达的新副本提供服务,新副本将排队等待下一次RDB传输,因此服务器会等待一个延迟,以便让更多副本到达。
# 延迟以秒为单位指定,默认为5秒。要完全禁用它,只需将其设置为0秒,传输将尽快开始。
repl-diskless-sync-delay 5
# -----------------------------------------------------------------------------
# 警告:RDB无盘加载是实验性的。由于在此设置中,复制副本不会立即在磁盘上存储RDB,因此在故障转移期间可能会导致数据丢失。
# RDB无盘加载+不处理I/O读取的Redis模块也可能导致Redis在与主机的初始同步阶段出现I/O错误时中止。只在你做你正在做的事情时使用。
# -----------------------------------------------------------------------------
#
# Replica可以直接从socket加载它从复制链接读取的RDB,或者将RDB存储到一个文件中,并在完全从主服务器接收到该文件之后读取该文件。
#
# 在许多情况下,磁盘比网络慢,存储和加载RDB文件可能会增加复制时间(甚至会增加主机的“写入时拷贝”内存和缓冲区)。然而,直接从套接字解析RDB文件可能意味着我们必须在收到完整的RDB之前刷新当前数据库的内容。为此,我们有以下选择:
# "disabled" - 不使用无盘加载(先将rdb文件存储到磁盘)
# "on-empty-db" - 只有在完全安全的情况下才使用无盘加载。
# "swapdb" - 直接从套接字解析数据时,在RAM中保留当前db内容的副本。请注意,这需要足够的内存,如果你没有它,你就有被杀的危险。
repl-diskless-load disabled
# 副本以预定义的时间间隔向服务器发送ping。可以使用repl_ping_replica_period选项更改此间隔。默认值为10秒。
# repl-ping-replica-period 10
# 以下选项设置的复制超时:
# 1) 从复制副本的角度来看,同步期间的大容量传输I/O。
# 2) 从副本(数据、ping)的角度来看,主超时。
# 3) 从主机的角度看,副本超时(REPLCONF ACK pings)。
# 请务必确保此值大于repl ping replica period的值,否则每当主服务器和副本之间的通信量较低时,都会检测到超时。
# repl-timeout 60
# 同步后在副本套接字上禁用TCP\u NODELAY?
# 如果选择“是”,Redis将使用较少的TCP数据包和较少的带宽将数据发送到副本。但这可能会增加数据在副本端出现的延迟,对于Linux内核使用默认配置,最长为40毫秒。
# 如果选择“否”,则数据出现在副本端的延迟将减少,但复制将使用更多带宽。
#
# 默认情况下,我们会针对低延迟进行优化,但在流量非常大的情况下,或者当主服务器和副本之间有很多跳跃时,将其设置为“是”可能是个好主意。
repl-disable-tcp-nodelay no
# 设置复制囤积大小。backlog是一个缓冲区,当副本断开连接一段时间后,它会累积副本数据,因此,当副本需要重新连接时,通常不需要完全重新同步,但部分重新同步就足够了,只需传递断开连接时副本丢失的部分数据。
# 复制积压工作越大,复制副本断开连接的时间就越长,以后能够执行部分重新同步的时间就越长。
# 仅当至少有一个副本连接时才分配积压工作。
# repl-backlog-size 1mb
# 在主服务器一段时间内不再连接副本后,积压工作将被释放。下面的选项配置从上一个复制副本断开连接开始所需的秒数,以便释放backlog缓冲区。
# 请注意,副本永远不会在超时时释放积压工作,因为它们可能在以后被提升为主控,并且应该能够与副本正确地“部分重新同步”:因此它们应该总是累积积压工作。
# 值为0意味着永远不会释放backlog。
# repl-backlog-ttl 3600
# 副本优先级是Redis在INFO输出中发布的整数。Redis Sentinel使用它来选择复制副本,以便在主服务器不再正常工作时升级为主副本。
# 优先级较低的副本被认为更适合升级,因此,例如,如果有三个优先级为10、100、25的副本,Sentinel将选择优先级为10的副本,即优先级最低的副本。
# 但是特殊优先级为0会将副本标记为无法执行master角色,因此Redis Sentinel永远不会选择优先级为0的副本进行升级。
# By default the priority is 100.
replica-priority 100
# 如果主副本的连接延迟小于N秒,则可以停止写入。
# N个副本需要处于“联机”状态。
# 延迟时间(以秒为单位)必须<=指定值,根据从副本接收的最后一次ping计算,该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
############################### 关键点跟踪 #################################
# Redis实现了对客户端值缓存的服务器辅助支持。这是使用一个失效表来实现的,该表使用1600万个插槽来记住哪些客户机可能具有某些密钥子集。反过来,它用于向客户端发送无效消息。请了解有关此页面功能检查的更多信息:
# https://redis.io/topics/client-side-caching
# 当为客户机启用跟踪时,所有的只读查询都被假定为缓存:这将强制Redis在失效表中存储信息。修改密钥时,这些信息将被清除,并向客户端发送无效消息。然而,如果工作负载主要由读操作控制,Redis可能会使用越来越多的内存来跟踪许多客户端获取的密钥。
#
# 因此,可以为失效表配置最大填充值。默认情况下,它被设置为1M的键,一旦达到这个限制,Redis将开始逐出失效表中的键,即使它们没有被修改,只是为了回收内存:这反过来会迫使客户端使缓存的值失效。
# 表的最大大小基本上是在服务器端跟踪谁缓存了什么内容的信息所需的内存和客户端在内存中保留缓存对象的能力之间的权衡。
#
# 如果将该值设置为0,则表示没有限制,Redis将根据需要在失效表中保留尽可能多的键。在“stats”INFO部分,您可以找到关于每个给定时刻失效表中的键数的信息。
# 注意:当在广播模式下使用密钥跟踪时,服务器端没有使用内存,因此此设置无效。
#
# tracking-table-max-keys 1000000
################################## 安全 ###################################
# 警告:由于Redis速度很快,外部用户可以尝试每秒100万个密码。这意味着你应该使用非常强的密码,否则它们很容易被破解。请注意,由于密码实际上是客户机和服务器之间的共享机密,任何人都不应该记住它,所以密码可以很容易地是/dev/urandom或其他任何东西的长字符串,因此通过使用长且不可使用的密码,将不可能进行暴力攻击。
# Redis ACL用户定义格式如下:
# user <username> ... acl rules ...
#
# 例如:
# user worker +@list +@connection ~jobs:* on >ffa9203c493aa99
#
# 特殊用户名“default”用于新连接。如果这个用户有“nopass”规则,那么新连接将立即作为“默认”用户进行身份验证,而不需要通过AUTH命令提供任何密码。否则,如果“default”用户没有标记为“nopass”,则连接将在not authenticated状态下启动,并且需要AUTH(或HELLO命令AUTH选项)才能进行身份验证并开始工作。
# 描述用户可以执行的操作的ACL规则如下:
#
# on 启用用户:可以作为此用户进行身份验证。
# off 禁用用户:无法再使用此用户进行身份验证,但是已经验证的连接仍然可以工作。
# +<command> 允许执行该命令
# -<command> 禁止执行该命令
# +@<category> 允许执行此类类别中的所有命令,有效类别包括@admin、@set、@sortedset、。。。等等,请参阅server.c文件中描述Redis命令表的完整列表,以及定义的特殊类别@all表示所有命令,但当前存在于服务器中,将来将通过模块加载这些命令。
# +<command>|subcommand 允许禁用命令的特定子命令。请注意,此表单不允许为负数,如-DEBUG | SEGFAULT,而只能是以“+”开头的加法形式。
# allcommands 的别名+@全部。注意,它意味着能够执行通过模块系统加载的所有未来命令。的无命令别名-@全部。
# ~<pattern> 添加可以作为命令一部分提到的键的模式。例如~*允许所有键。该模式是一个全局样式的模式,类似于其中一个键。可以指定多个模式。
# allkeys 别名~*
# resetkeys 刷新允许的键模式列表。
# ><password> 将此密码添加到用户的有效密码列表中。例如,>mypass会将“mypass”添加到列表中。此指令清除“nopass”标志(见下文)。
# <<password> 从有效密码列表中删除此密码。
# nopass 用户设置的所有密码都将被删除,并且该用户被标记为不需要密码:这意味着每个密码都将对该用户有效。如果此指令用于默认用户,则每个新连接都将立即使用默认用户进行身份验证,而不需要任何显式AUTH命令。注意,“resetpass”指令将清除此条件。
# resetpass 刷新允许的密码列表。此外,删除“nopass”状态。在“resetpass”之后,用户没有关联的密码,并且没有办法在不添加密码(或稍后将其设置为“nopass”)的情况下进行身份验证。
# reset 执行以下操作:resetpass、resetkeys、off,-@全部。用户在创建后立即返回到相同的状态。
#
# ACL规则可以按任何顺序指定:例如,可以从密码开始,然后是标志或密钥模式。但是请注意,加法和减法规则将根据顺序改变含义。例如,请参见以下示例:
# 用户alice on+@all -DEBUG~*>somepassword
#
# 这将允许“alice”使用除DEBUG命令之外的所有命令,因为+@全部将所有命令添加到alice可以使用的命令集中,随后删除了DEBUG。但是,如果我们颠倒两个ACL规则的顺序,结果将不同:
# 用户alice on--DEBUG +@all ~*>somepassword
# 现在,当alice在允许的命令集中还没有命令时,DEBUG被删除了,稍后所有的命令都被添加,这样用户就可以执行所有的命令了。
# 基本上ACL规则是从左向右处理的。
#
# 有关ACL配置的更多信息,请访问Redis网站:https://redis.io/topics/acl
# ACL日志
# ACL日志跟踪与ACL关联的失败命令和身份验证事件。ACL日志对于排除ACL阻止的失败命令非常有用。ACL日志存储在中并消耗内存。它是没有限制的长度。你可以使用ACL日志重置回收内存或将最大长度设置为以下值。
acllog-max-len 128
# 使用外部ACL文件
# 不需要在此文件中配置用户,而是可以使用一个只列出用户的独立文件。这两种方法不能混合使用:如果在这里配置用户,同时激活external ACL文件,服务器将拒绝启动。
#
# 外部ACL用户文件的格式与内部使用的格式完全相同redis.conf版描述用户。
# aclfile /etc/redis/users.acl
# 重要提示:从redis6开始,“requirepass”只是新ACL系统之上的一个兼容层。选项效果将只是设置默认用户的密码。客户机仍将使用AUTH<password>进行身份验证,如果遵循新协议,则更明确地使用AUTH default<password>进行身份验证:两者都可以。
requirepass abc123
################################### 客户 ####################################
# 设置同时连接的客户端的最大数量。默认情况下,此限制设置为10000个客户端,但是如果Redis服务器无法配置进程文件限制以允许指定的限制,则允许的最大客户端数将设置为当前文件限制减去32(因为Redis保留了一些文件描述符供内部使用)。
# 一旦达到限制,Redis将关闭所有新连接,并发送错误“max number of clients reached”。
# maxclients 10000
############################## 内存管理 ################################
# 将内存使用限制设置为指定的字节数。当达到内存限制时,Redis将根据所选的逐出策略删除密钥(请参阅maxmemory策略)。
# 如果Redis无法根据策略删除密钥,或者如果策略设置为“noeviction”,Redis将开始对使用更多内存的命令(如set、LPUSH等)进行错误应答,并继续回复GET等只读命令。
# 当将Redis用作LRU或LFU缓存时,或者设置实例的硬内存限制(使用“noeviction”策略)时,此选项通常很有用。
# 警告:如果将副本附加到启用了maxmemory的实例,则从已用内存计数中减去提供副本所需的输出缓冲区的大小,这样网络问题/重新同步将不会触发一个循环,在该循环中,密钥被逐出,而副本的输出缓冲区将充满,并触发删除更多的密钥,以此类推,直到数据库完全清空。
#
# 简而言之。。。如果附加了副本,建议您为maxmemory设置一个下限,以便系统上有一些可用的RAM用于副本输出缓冲区(但是,如果策略为“noeviction”,则不需要这样做)。
#
maxmemory 4294967296
# MAXMEMORY策略:达到MAXMEMORY时Redis将如何选择要删除的内容。可以从以下行为中选择一个:
# volatile-lru -> 使用近似的LRU逐出,仅限具有过期集的key。
# allkeys-lru -> 使用近似的LRU逐出任何key。
# volatile-lfu -> 使用近似的LFU逐出,仅限具有过期集的key。
# allkeys-lfu -> 使用近似的LFU逐出任何key。
# volatile-random -> 删除具有过期集的随机key。
# allkeys-random -> 移除随机密钥,任何key。
# volatile-ttl -> 删除最接近过期时间的key(次要TTL)
# noeviction -> 不要逐出任何内容,只要在写操作时返回一个错误。
#
# LRU表示最近最少使用
# LFU表示使用频率最低
#
# LRU、LFU和volatile ttl都是用近似随机算法实现的。
# 注意:对于以上任何一种策略,当没有合适的密钥进行逐出时,Redis将在写操作时返回错误。
#
# At the date of writing these commands are: set setnx setex append
# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
# getset mset msetnx exec sort
#
# 默认是::noeviction
maxmemory-policy noeviction
############################# 延迟释放 ####################################
# Redis有两个基本体来删除KEY。一种叫做DEL,是对对象的阻塞性删除。这意味着服务器停止处理新命令,以便以同步方式回收与对象关联的所有内存。如果删除的KEY与一个小对象关联,则执行DEL命令所需的时间非常小,与Redis中大多数其他O(1)或O(log_N)命令相比是非常小的。但是,如果KEY与一个包含数百万个元素的聚合值相关联,服务器可能会长时间(甚至几秒钟)阻塞以完成操作。
# 基于以上原因,Redis还提供了UNLINK(non-blocking DEL)等非阻塞删除原语,以及FLUSHALL和FLUSHDB命令的异步选项,以便在后台回收内存。这些命令在固定时间内执行。另一个线程将以最快的速度增量释放后台的对象。
#
# FLUSHALL和FLUSHDB的DEL、UNLINK和ASYNC选项由用户控制。这取决于应用程序的设计来理解何时使用其中一个是好主意。然而,由于其他操作的副作用,Redis服务器有时不得不删除密钥或刷新整个数据库。具体来说,在以下情况下,Redis会独立于用户调用删除对象:
# 1) 在逐出时,由于maxmemory和maxmemory-policy配置,为了在不超过指定内存限制的情况下为新数据腾出空间。
# 2) 因为expire:必须从内存中删除具有相关生存时间的key(请参阅expire命令)。
# 3) 因为命令的副作用是将数据存储在可能已经存在的键上。例如,重命名命令可能会删除旧的密钥内容,当它被另一个替换时。类似地,SUNIONSTORE或SORT with STORE选项可能会删除现有的密钥。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
################################ THREADED I/O #################################
# Redis主要是单线程的,但是也有一些线程操作,比如取消链接、缓慢的I/O访问以及其他在侧线程上执行的操作。
# 现在还可以在不同的I/O线程中处理Redis客户端的套接字读写。由于编写速度非常慢,通常Redis用户使用流水线来加速每个核心的Redis性能,并生成多个实例以扩展更多。使用I/O线程,可以轻松地将Redis的速度提高两倍,而无需依赖于管道或实例的分片。
# 默认情况下,线程被禁用,我们建议只在至少有4个或更多内核的计算机中启用它,并至少保留一个备用内核。使用超过8个线程不大可能有多大帮助。我们还建议仅当您实际存在性能问题时才使用线程I/O,因为Redis实例可以占用相当大比例的CPU时间,否则使用此功能没有任何意义。
#
# 例如,如果你有一个4核的盒子,尝试使用2或3个I/O线程,如果你有一个8核,尝试使用6个线程。要启用I/O线程,请使用以下配置指令:
io-threads 4
# 将io线程设置为1只会像平常一样使用主线程。当启用I/O线程时,我们只使用线程进行写入,即线程写入(2)系统调用并将客户机缓冲区传输到套接字。但是,也可以使用以下配置指令启用读取协议解析的线程,方法是将其设置为“是”:
# 当I/O threads被启用时,线程仅用于写,如果需要把读数据和协议解析也启用线程,则需要把io-threads-do-reads也设置为yes,者认为对读请求启用io-threads得到的帮助不算太多
io-threads-do-reads yes
# 多线程使用中需要注意的两点
# 1: 在redis运行时通过config set 来使用线程的配置指令不会生效,当SSL启用时,多线程也不会生效
# 2: 如果使用redis-benchmark测试redis的速度 ,需要确认redis-benchmark是多线程模式,使用 --threads选项来匹配redis的线程数量,否则不会看到性能有明显提升
############################## APPEND ONLY模式 ###############################
# 默认情况下,Redis异步地将数据集转储到磁盘上。这种模式在许多应用程序中已经足够好了,但是Redis进程的问题或断电可能会导致几分钟的写操作丢失(取决于配置的保存点)。
# Append-Only文件是另一种持久性模式,它提供了更好的持久性。例如,如果使用默认的数据fsync策略(请参阅配置文件后面的部分),Redis在服务器断电等戏剧性事件中可能只会丢失一秒钟的写入操作,或者如果Redis进程本身发生了问题,但操作系统仍在正常运行,则只会丢失一次写入操作。
# AOF和RDB持久性可以同时启用而不会出现问题。如果启动时启用了AOF,Redis将加载AOF,即具有更好的持久性保证的文件。
# 默认为no
# Please check http://redis.io/topics/persistence for more information.
appendonly yes
# append-only-file的名字 (默认: "appendonly.aof")
appendfilename "appendonly.aof"
# fsync()调用告诉操作系统在磁盘上实际写入数据,而不是等待输出缓冲区中的更多数据。有些操作系统会在磁盘上刷新数据,而有些操作系统则会尽快刷新。
# 指定更新日志条件,共有3个可选值:
# no: 写入aof文件,不等待磁盘同步。(快)
# always: 总是写入aof文件,并完成磁盘同步(慢,安全)
# everysec: 每一秒写入aof文件,并完成磁盘同步(折衷,默认值)
appendfsync everysec
# 如果该参数设置为no,是最安全的方式,不会丢失数据,但是要忍受阻塞的问题。
no-appendfsync-on-rewrite no
# 自动重写append-only-file。Redis能够在AOF日志大小按指定的百分比增长时自动重写日志文件,并隐式调用BGREWRITEAOF。
# 它是这样工作的:Redis在最近一次重写之后记住AOF文件的大小(如果重新启动后没有重写,则使用启动时AOF的大小)。
# 将此基本大小与当前大小进行比较。如果当前大小大于指定的百分比,则会触发重写。此外,您还需要为要重写的AOF文件指定最小大小,这对于避免重写AOF文件非常有用,即使达到了百分比增加,但它仍然很小。
# 指定零的百分比以禁用自动AOF重写功能。
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes
Redis最新版本6.0.5 docker容器部署
docker run配置&介绍
docker run \
# 随docker启动而启动&赋予权限
--restart=always --privileged=true \
# 端口映射
-p 6379:6379 \
# redis配置文件挂载
--volume /home/redis/conf/redis.conf:/data/conf/redis.conf \
# redis dump持久化目录挂载
--volume /home/redis/data:/data \
# redis日志目录挂载
--volume /home/redis/logs:/var/log/redis \
# redis容器名
--name redisServer \
# 解决无法实施511的TCP backlog设置的告警日志
--sysctl net.core.somaxconn=4096 \
# redis版本&启动,注:必须要在redis-server后面加一个配置文件路径,这是官方要求
-d redis:6.0.5 redis-server /data/conf/redis.conf
redis 容器成功启动后磁盘目录变化
redis启动后,三个warning日志解决
- The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
解决办法:将net.core.somaxconn = 1024添加到**/etc/sysctl.conf中,然后执行sysctl -p**生效配置。 - overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‘vm.overcommit_memory = 1’ to/etc/sysctl.conf and then reboot or run the command ‘sysctl vm.overcommit_memory=1’ for this to take effect.
解决办法:将vm.overcommit_memory = 1添加到**/etc/sysctl.conf中,然后执行sysctl -p**生效配置。 - you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix thisissue run the command ‘echo never > /sys/kernel/mm/transparent_hugepage/enabled’ as root, and add it to your /etc/rc.local in order to retain thesetting after a reboot. Redis must be restarted after THP is disabled.
解决办法:将echo never > /sys/kernel/mm/transparent_hugepage/enabled添加到**/etc/rc.local中,然后执行source /etc/rc.local**生效配置。
以上就是整个redis最新版本从配置到docker部署,再到warning日志解决的全部内容,感谢阅读~