本章节将详细介绍 redis.conf 配置文件,完整的配置文件如下:
# Redis配置文件示例 # # 关于单位的注意:当需要设置内存大小时,可以用 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 "不会被管理员或 Redis Sentinel 的 "CONFIG REWRITE" # 命令所重写。由于 Redis 总是使用最后处理的行作为配置指令的值,你最好把 # include 放在这个文件的开头,以避免在运行时覆盖配置更改。 # # 如果您对使用 include 覆盖配置选项感兴趣,那么最好将 include 作为最后一行。 # # include .\path\to\local.conf # include c:\path\to\other.conf ################################## 模块 ##################################### # 在启动时加载模块。如果服务器不能加载模块,它将中止。 # 可以使用多个 loadmodule 指令。 # # loadmodule .\path\to\my_module.dll # loadmodule c:\path\to\other_module.dll ################################## 网络 ##################################### # 默认情况下,如果没有指定 "bind "配置指令,Redis会监听服务器上所有可用 # 网络接口的连接。可以使用 "bind "配置指令来监听一个或多个选定的接口, # 后面跟一个或多个IP地址。 # # 示例: # # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 ::1 # # ~~~ 警告 ~~~ 如果运行 Redis 的计算机直接暴露在互联网上,绑定所有接口 # 是很危险的,会将实例暴露给互联网上的所有人。 # 所以默认情况下,我们取消了下面的绑定指令,这将迫使Redis只监听IPv4环 # 回接口地址(这意味着Redis将只能接受来自运行在同一台计算机上的客户端的连接)。 # # 如果你确定你想让你的实例监听所有的接口,只需注释下面一行。 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ bind 127.0.0.1 # 保护模式是一个安全保护层,以避免互联网上开放的Redis实例被访问和利用。 # # 当保护模式开启时,如果: # # 1) 服务器没有使用 "bind" 指令明确地绑定到一组地址。 # 2) 没有配置密码。 # # 服务器只接受从IPv4和IPv6回环地址127.0.0.1和::1,以及从Unix域套接字连接 # 的客户端的连接。 # # 默认情况下,保护模式是启用的。只有当你确定你想让其他主机的客户端连接 # 到 Redis,即使没有配置认证,也没有使用 "bind" 指令明确列出一组特定的 # 接口时,你才应该禁用它。 protected-mode yes # 接受指定端口的连接,默认为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 /tmp/redis.sock # unixsocketperm 700 # 在客户闲置N秒后关闭连接( 0 表示禁用 ) timeout 0 # TCP keepalive(保持连接) # # 如果非零,使用 SO_KEEPALIVE 在没有通信的情况下向客户发送 TCP ACK。 # 这有两个原因: # # 1) 检测死掉的对等点。 # 2) 从中间网络设备的角度来看,连接是活的。 # # 在Linux上,指定的值(以秒为单位)是用来发送ACK的周期。 # 请注意,要关闭连接,需要两倍的时间。在其他内核上,这个周期取决于内核的配置。 # # 这个选项的合理值是 300 秒,这是从 Redis 3.2.1 开始的新的 Redis 默认值。 tcp-keepalive 300 ################################# 通用 ##################################### # 默认情况下,Redis 不作为一个守护程序运行。如果你需要,请使用 'yes'。 # 请注意,Redis 在守护进程中会在 /var/run/redis.pid 中写入一个pid文件。 # 不支持 WINDOWS 上的 daemonize no # 如果你从upstart或systemd运行Redis, Redis可以与你的监督树交互。选项: # supervised no - 没有监督互动 # supervised upstart - 通过将 Redis 放入 SIGSTOP 模式来发出启动信号 # supervised systemd - 将 READY=1 写入 $NOTIFY_SOCKET,向 systemd 发出信号。 # supervised auto - 根据 UPSTART_JOB 或 NOTIFY_SOCKET 环境变量 # 检测 upstart 或 systemd 方法 # 注意:这些监督方法只发出 "进程已准备好 "的信号。 # 它们不支持对您的监督者进行持续的活动 ping。 # 不支持 Windows 上 supervised no # 如果指定了一个 pid 文件,Redis 会在启动时将其写入指定位置,并在退出时将其删除。 # # 当服务器以非守护进程方式运行时,如果未在配置中指定,则不会创建任何PID文件。 # 当服务器处于守护状态时,即使未指定,也会使用PID文件,默认为“/var/run/redis.id”。 # # 创建一个PID文件是最好的做法:如果Redis不能创建它,没有发生任何坏事, # 服务器将正常启动和运行。在 WINDOWS 上不支持 pidfile /var/run/redis.pid # 指定服务器详细级别。这可以是以下之一: # debug (大量信息,对开发/测试很有用) # verbose (许多不太有用的信息,但不像调试级别那样一团糟) # notice (适度冗长,可能是您在生产中想要的) # warning (仅记录非常重要/严重的消息) loglevel notice # 指定日志文件名。此外,还可以使用‘stdout’强制 Redis 登录标准输出。 logfile "" # 要启用 Windows EventLog 的日志记录,只需将“syslog-enable”设置为“yes”, # 并根据需要更新其他 syslog 参数。 # 如果 Redis 作为 Windows 服务安装和启动,这将自动启用。 # syslog-enabled no # 指定Windows应用程序日志中事件的来源名称。 # syslog-ident redis # 指定 syslog 功能。必须为 USER 或 LOCAL0-LOCAL7 之间。 # WINDOWS 不支持 syslog-facility local0 # 设置数据库的数量。默认数据库为 DB 0,您可以使用 SELECT 在每个连接 # 的基础上选择不同的数据库,其中 dbid 是介于 0 和‘database-1 之间的数字 databases 16 # 默认情况下,Redis只有在开始记录到标准输出时,以及标准输出是TTY时 # 才会显示ASCII艺术标志。基本上这意味着通常只有在交互式会话中才会显示标识。 # # 然而,通过将以下选项设置为 yes,可以强制 4.0 之前的行为,并始终在启 # 动日志中显示 ASCII 艺术徽标。 always-show-logo yes ################################ 快照 ################################ # # 将数据库保存在磁盘上: # # save <seconds> <changes> # # 如果对数据库进行了给定的秒数和给定的写操作数,则将保存数据库。 # # 在下面的示例中,行为将是保存: # after 900 sec (15 min) 如果至少有一个键改变了 # after 300 sec (5 min) 如果至少有10个键改变了 # after 60 sec 如果至少有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 压缩字符串对象? # 默认情况下,它被设置为‘yes’,因为它几乎总是一场胜利。 # 如果您想在保存的子项中节省一些 CPU,请将其设置为‘no’,但如果您有 # 可压缩的值或键,数据集可能会更大。 rdbcompression yes # 从RDB的第5个版本开始,CRC64校验码被放在文件的最后。这使得该格式 # 对损坏的抵抗力更强, # 但在保存和加载RDB文件时要付出性能上的代价(大约10%),所以你可以 # 禁用它以获得最大的性能。 # # 在禁用校验和的情况下创建的 RDB 文件的校验和为零,这将告诉加载代码跳过检查。 rdbchecksum yes # 转储数据库的文件名 dbfilename dump.rdb # 工作目录 # # 数据库将被写入此目录中,并使用上面使用‘dbfilename’配置指令指定的文件名。 # # 在这个目录下也将创建 "仅追加文件"。 # # 注意,你必须在这里指定一个目录,而不是一个文件名。 dir ./ ################################# 复制 ################################# # 主-副本复制。使用 replicaof 使一个 Redis 实例成为另一个 Redis 服务器的 # 副本。关于 Redis 复制,有几件事需要尽快了解。 # # +------------------+ +---------------+ # | Master | ---> | Replica | # | (receive writes) | | (exact copy) | # +------------------+ +---------------+ # # 1) Redis 复制是异步的,但你可以配置一个 master,如果它看起来没有与 # 至少给定数量的 replica 连接,则停止接受写入。 # 2) 如果复制链接丢失的时间相对较短,Redis 复制能够与主站进行部分重 # 新同步。你可能想根据你的需要,用一个合理的值来配置复制积压的大 # 小(见本文件的下几节)。 # 3) 复制是自动的,不需要用户干预。在网络分区之后,副本服务器会自动 # 尝试重新连接到主服务器并与它们重新同步。 # # replicaof <masterip> <masterport> # 如果 master 有密码保护(使用下面的 "requirepass" 配置指令),就可以 # 告诉 replica 在开始复制同步过程之前要进行认证, # 否则 master 将拒绝 replica 请求。 # # masterauth <master-password> # 当一个 replica 失去与 master 的连接时,或者当复制仍在进行时, # replica 可以以两种不同的方式行动: # # 1) 如果 replica-serve-stale-data 被设置为 "yes"(默认),replica # 仍然会回复客户端的请求,可能会有过时的数据,或者如果这是第一次同步, # 数据集可能只是空的。 # # 2) 如果 replica-serve-stale-data 被设置为 "no",那么对于所有的命令, # 除了 INFO, replicaOF, AUTH, PING, SHUTDOWN, REPLCONF, ROLE, CONFIG, # SUBSCRIBE, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB, # COMMAND, POST, HOST: 和 LATENCY 之外,都会以错误形式回复。 # replica-serve-stale-data yes # 你可以配置一个副本实例来接受或不接受写操作。对副本实例进行写入 # 可能对存储一些短暂的数据很有用(因为写在副本上的数据在与主站重新同步 # 后很容易被删除),但如果客户因配置错误而向其写入,也可能导致问题。 # # 从Redis 2.6开始,默认 replicas 是只读的。 # # 注意:只读副本不能公开给互联网上不受信任的客户端。 # 它只是一个保护层,防止实例被滥用。默认情况下, # 只读副本仍会导出所有管理命令,如 CONFIG、DEBUG 等。在有限的范围内, # 您可以使用‘rename-command’来隐藏所有的管理/危险命令,从而提高只读副本的安全性。 replica-read-only yes # 复制同步(SYNC)策略:disk 或 socket # # ------------------------------------------------------- # 警告:无盘复制目前是试验性的 # ------------------------------------------------------- # # 新的 replicas 和重新连接的 replicas 不能继续仅接收差异的复制过程, # 需要进行所谓的“完全同步”。 # RDB 文件从主服务器传输到副本服务器。传播可以通过两种不同的方式发生: # # 1) Disk-backed: Redis master 主进程创建一个新进程,将RDB文件写入磁盘。 # 随后,父进程将文件增量地传输到副本。 # 2) Diskless: Redis master 创建了一个新的进程,直接将 RDB 文件写入副 # 本套接字,而根本不接触磁盘。 # # 使用磁盘备份复制时,在生成 RDB 文件的同时,一旦生成 RDB 文件的当前子 # 文件完成其工作,就可以将更多的副本排队并与 RDB 文件一起提供。 # 使用无盘复制时,一旦传输开始,到达的新副本将排队,当当前副本终止时, # 新的传输将开始。 # # 当使用无磁盘复制时,master 在开始传输之前等待一段可配置的时间 (以秒为单位), # 希望有多个副本(replicas)到达,并且可以并行传输。 # # 对于慢磁盘和快速 (大带宽) 网络,无磁盘复制工作得更好。 repl-diskless-sync no # 当启用无磁盘复制时,可以配置服务器等待的延迟,以便生成通过套接字将 RDB # 传输到副本的子节点。 # # 这一点很重要,因为一旦传输开始,就不可能为到达的新副本提供服务, # 这些副本将被排在下一次RDB传输的队列中,所以服务器要等待一个延迟, # 以便让更多的副本到达。 # # 延迟时间单位为秒,缺省值为5秒。要完全禁用它,只需将其设置为0秒,传输将尽快开始。 repl-diskless-sync-delay 5 # 副本以预定义的时间间隔向服务器发送 ping。可以使用 repl_ping_replica_period # 选项更改这个间隔。缺省值是10秒。 # repl-ping-replica-period 10 # 以下选项设置复制超时: # # 1) 在 SYNC 期间,从复制的角度来看,批量传输 I/O。 # 2) 从副本 (data、ping) 的角度来看,Master 超时。 # 3) 从 masters 务器的角度来看,Replica 服务器超时 (REPLCONF ACK pings)。 # # 重要的是要确保这个值大于为 repl-ping-replica-period 指定的值, # 否则每次在 master 和 replica 之间出现低流量时,就会检测到超时。 # # repl-timeout 60 # 是否在 SYNC 后禁用副本套接字上的 TCP_NODELAY ? # # 如果你选择 "yes",Redis 将使用较少的 TCP 数据包和较少的带宽来发送数据到副本。 # 但这可能会增加数据在复制端出现的延迟,在使用默认配置的 Linux 内核中,最多可达40毫秒。 # # 如果你选择 "no",数据在复制端出现的延迟将减少,但复制将使用更多带宽。 # # 默认情况下,我们会对低延迟进行优化,但在流量非常大的情况下, # 或者当 master 和 replicas 站相距很多跳时,将其设置为 "yes" 可能是一个好主意。 repl-disable-tcp-nodelay no # 设置复制积压工作的大小。backlog 是一个缓冲区,当副本断开连接一段时间时, # 它会累积副本数据,因此当副本想要再次连接时,通常不需要完全重新同步, # 部分重新同步就足够了,只需传递断开连接时副本丢失的部分数据。 # # 复制积压越大,复制可以断开的时间越长,以后能够进行部分重新同步。 # # 只有在至少有一个副本连接的情况下才会分配积压。 # # repl-backlog-size 1mb # 当 master 在一段时间内不再连接 replicas(副本)后,积压的数据将被释放。 # 下面的选项配置了从最后一个副本断开连接开始,需要经过多少秒才能释放积压的缓冲区。 # # 请注意,副本永远不会因为超时而释放积压,因为它们以后可能会被提升为 master, # 并且应该能够正确地与副本进行 "部分再同步",因此它们应该始终积累积压。 # # 值为 0 意味着永远不释放积压的数据。 # # repl-backlog-ttl 3600 # 复制的优先级是一个整数,由 Redis 在 INFO 输出中公布。 # 它被 Redis Sentinel 用来选择一个副本,以便在 master 不再正常工作时将其提 # 升为新的 master。 # # 优先级低的副本被认为更适合升级,因此,例如,如果有三个优先级为 10、100、25 的副本, # Sentinel 将选择优先级为 10 的副本,即最低的副本。 # # 但是,特殊优先级为 0 的副本将无法作为 master 的角色, # 因此 Redis Sentinel 永远不会选择优先级为 0 副本进行升级。 # # 默认情况下,优先级为100。 replica-priority 100 # 如果连接的副本少于 N 个,延迟小于或等于 M 秒, # 则主服务器(master)可能会停止接受写入。 # # N个副本需要处于“在线”状态。 # # 延迟 (以秒为单位) 必须 <= 指定值,根据从副本服务器接收的最后一次 ping 计算, # 该 ping 通常每秒发送一次。 # # 这个选项并不保证N个副本会接受写入,但是在没有足够的副本可用的情况下, # 会将丢失写入的窗口限制在指定的秒数。 # # 例如,要求至少有 3 个副本,滞后 <=10 秒,使用: # # min-replicas-to-write 3 # min-replicas-max-lag 10 # # 将其中一个设置为0,就可以禁用该功能。 # # 默认情况下,min-replicas-to-write 被设置为 0(功能禁用), # min-replicas-max-lag 被设置为 10。 # Redis master能够以不同的方式列出连接的副本的地址和端口。 # 例如 “INFO replication” 部分提供了这些信息,Redis Sentinel 使用这些信息以及其他工 # 具来发现复制实例。此信息的另一个可用位置是 master 服务器的“ROLE”命令的输出。 # # 副本通常报告列出的 IP 和地址通过以下方式获得: # # IP: 通过检查副本用于连接到主机的套接字的对等地址,可以自动检测该地址。 # # Port: 该端口在复制握手期间由副本服务器进行通信,通常是副本服务器用来侦听连接的端口。 # # 但是,当使用端口转发或网络地址转换 (NAT) 时,可能实际上可以通过不同 # 的IP和端口对访问副本。副本服务器可以使用以下两个选项向其主服务器报告 # 一组特定的 IP 和端口,以便 INFO 和 ROLE 都将报告这些值。 # # 如果只需要覆盖端口或IP地址,则不需要同时使用这两个选项。 # # replica-announce-ip 5.5.5.5 # replica-announce-port 1234 ################################## 安全 ################################### # 要求客户端在处理任何其他命令之前发出 AUTH<PASSWORD>。这在您不信任其他 # 人有权访问运行 redis-server 的主机的环境中可能很有用。 # # 为了向后兼容,并且因为大多数人不需要身份验证 (例如,他们运行自己的服务器), # 这应该被注释掉。 # # 警告:由于 Redis 的速度相当快,外部用户每秒可以在一个好的机器上尝试高 # 达 15 万个密码。这意味着你应该使用非常强的密码,否则它将非常容易被破解。 # # requirepass foobared # 命令重命名。 # # 在一个共享环境中,有可能改变危险命令的名称。例如,CONFIG命令可以被重命名 # 为难以猜测的名字,这样它仍然可以用于内部使用的工具,但不能用于一般客户。 # # 实例: # # rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 # # 也可以通过将一个命令重命名为一个空字符串来完全杀死它。 # # rename-command CONFIG "" # # 请注意,改变记录在AOF文件中或传送到副本中的命令的名称可能会导致问题。 ################################### 客户 #################################### # 设置同时连接的客户端的最大数量。默认情况下,这个限制被设置为 10000 个客户端, # 然而如果 Redis 服务器无法配置进程文件限制以允许指定的限制,那么允许的最大客 # 户端数量被设置为当前文件限制减去 32(因为 Redis 保留了一些文件描述符供内部使用)。 # # 一旦达到限制,Redis将关闭所有新的连接,并发送一个错误 "max number of clients reached"。 # # maxclients 10000 ############################## 内存管理 ################################ # 如果Redis被用作一个没有任何形式的持久化的纯内存缓存, # 那么后台 AOF/RDB 持久化所使用的 fork() 机制就没有必要。 # 作为一种优化,在 Windows 版本的 Redis 中可以关闭所有的持久性。 # 这将把堆分配重定向到系统堆分配器,并禁用那些会导致 fork() 操作的命令。 # BGSAVE 和 BGREWRITEAOF。 # 该标志不能与配置 AOF 和 RDB 操作的任何其他标志组合。 # persistence-available [(yes)|no] # 将内存使用限制设置为指定的字节数。当达到内存限制时,Redis 将尝试根据 # 所选的清除策略 (参见 maxmemory-policy) 删除键。 # # 如果 Redis 不能根据策略删除键,或者策略被设置为 "noeviction", # Redis 将开始对会使用更多内存的命令, # 如 SET、LPUSH 等回复错误,而对 GET 等只读命令则继续回复。 # # 这个选项通常在使用 Redis 作为 LRU 或 LFU 缓存时很有用,或者为 # 一个实例设置一个硬性的内存限制(使用 "noeviction" 策略)。 # # 警告:如果你在 maxmemory 打开的情况下将副本附加到实例,那么输出 # 缓冲区的大小将从使用的内存计数中扣除, # 这样网络问题/重新同步将不会触发一个键被循环清除,反过来副本的输 # 出缓冲区将充满被清除的键的 DELs, # 从而触发更多的键的删除,以此类推,直到数据库完全清空。 # # 简而言之......如果你有复制,建议你为 maxmemory 设置一个下限,以便 # 系统上有一些空闲的 RAM 用于复制输出缓冲区(但如果策略是 "noeviction" 就不需要) # # 警告:不设置 maxmemory 将导致 Redis 在达到堆限制时以超出内存的异常终止。 # # 注意:由于Redis使用系统分页文件来分配堆内存,Windows任务管理器或 # 其他工具(如ProcessExplorer)所显示的工作集内存使用量并不总是准确的。 # 例如,就在后台保存RDB或AOF文件之后,工作集的数值可能会显著下降。 # 为了检查redis-server用于存储数据的正确内存量,使用INFO客户端命令。 # INFO 命令只显示用于存储 redis 数据的内存, # 而不是 Windows 进程因其自身需求而使用的额外内存。 # INFO命令没有报告的这3个额外的内存量,可以通过减去Windows任务 # 管理器报告的峰值工作集和INFO命令报告的used_memory_peak来计算。 # # 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 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 # # 默认为: # # maxmemory-policy noeviction # LRU、LFU 和最小 TTL 算法不是精确的算法,而是近似的算法 # (为了节省内存),所以你可以根据速度或准确性来调整它。 # 默认情况下,Redis 将检查五个键,并挑选最近使用较少的一个, # 你可以使用以下配置指令改变样本大小。 # # 默认的 5 产生足够好的结果。10 非常接近真正的 LRU, # 但要花费更多的 CPU。3 比较快,但不是很准确。 # # maxmemory-samples 5 # 从 Redis 5 开始,默认情况下,副本将忽略它的最大内存设置 # (除非它在故障切换后被提升到 master 或手动)。 # 这意味着键的驱逐将由 master 处理,在 master 的键驱逐时向副本发送 DEL 命令。 # # 这种行为确保主站和副本保持一致,通常是你想要的。 # 然而,如果你的副本是可写的,或者你希望副本有不同的内存设置, # 并且你确信对副本进行的所有写入都是空闲的,那么你可以 # 改变这个默认值(但要确保理解你正在做什么)。 # # 请注意,由于复制体默认不驱逐,它最终使用的内存可能比通过 maxmemory # 设置的要多(在复制体上有某些缓冲区可能更大,或者数据结构有时可能占用更多内存等等)。 # 因此,请确保你监控你的副本,并确保它们有足够的内存,在主站达到配置 # 的 maxmemory 设置之前,永远不会遇到真正的内存不足的情况。 # # replica-ignore-maxmemory yes ############################# 延迟释放 #################################### # Redis有两个原语来删除键。一个叫做DEL,是对对象的阻塞式删除。这意味着 # 服务器停止处理新的命令,以便以同步的方式回收与一个对象相关的所有内存。 # 如果删除的键与一个小对象相关联,那么执行DEL命令所需的时间非常小, # 与Redis中大多数其他O(1)或O(log_N)命令相当。 # 然而,如果键与一个包含数百万元素的聚合值相关联,服务器可能会阻塞很 # 长时间(甚至几秒钟)以完成该操作。 # # 由于上述原因,Redis 还提供了非阻塞性的删除原语,如 UNLINK(非阻塞性 DEL) # 和 FLUSHALL 和 FLUSHDB 命令的 ASYNC 选项,以便在后台回收内存。 # 这些命令是在恒定时间内执行的。另一个线程将以最快的速度在后台逐步释放对象。 # # FLUSHALL 和 FLUSHDB 的 DEL、UNLINK 和 ASYNC 选项是用户控制的。 # 这取决于应用程序的设计,以了解何时使用一个或另一个是个好主意。 # 然而 Redis 服务器有时不得不删除键或刷新整个数据库作为其他操作的副作用。 # 特别是 Redis 在以下情况下独立于用户调用而删除对象: # # 1) 在清除时,由于 maxmemory 和 maxmemory 策略配置, # 为了为新数据腾出空间,不会超过指定的内存限制。 # 2) 因为 expire: 当一个键具有相关的生存时间 (参见 expire 命令) 时, # 必须从内存中删除。 # 3) 因为一个命令的副作用是在一个可能已经存在的键上存储数据。 # 例如,RENAME 命令在用另一个键替换时可能会删除旧的键内容。 # 同样,SUNIONSTORE 或带有 STORE 选项的 SORT 也可能删除现有的键。 # SET 命令本身会删除指定键的任何旧内容,以便用指定的字符串替换它。 # 4) 在复制过程中,当一个副本与它的 Master 进行完全重新同步时, # 整个数据库的内容被删除,以便加载刚刚传输的 RDB 文件。 # # 在上述所有情况下,默认是以阻塞的方式删除对象,就像调用DEL一样。然而, # 你可以使用下面的配置指令, # 具体配置每种情况,以便以非阻塞的方式释放内存,就像调用UNLINK一样: lazyfree-lazy-eviction no lazyfree-lazy-expire no lazyfree-lazy-server-del no replica-lazy-flush no ############################## 仅追加模式 ############################### # 默认情况下,Redis 异步地将数据集转储到磁盘上。这种模式在许多应用中已经很好了, # 但如果 Redis 进程出现问题或停电, # 可能会导致几分钟的写入量损失(取决于配置的保存点)。 # # “仅附加文件”是另一种持久性模式,可提供更好的持久性。 # 例如,使用默认的数据fsync策略(见后面的配置文件), # 在服务器断电等严重事件中,Redis可能只丢失一秒钟的写入, # 或者如果Redis进程本身发生了问题,但操作系统仍在正常运行,则只会丢失一次写入。 # # AOF 和 RDB 持久化可以同时启用,没有问题。如果 AOF 在启动时被启用, # Redis 将加载 AOF,这是具有更好的持久性保证的文件。 # # 请查看 http://redis.io/topics/persistence,了解更多信息。 appendonly no # 只附加文件的名称(默认:"appendonly.aof")。 appendfilename "appendonly.aof" # 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 也会阻塞同步写(2)调用。 # # 为了缓解这个问题,可以使用以下选项来防止在 BGSAVE 或 BGREWRITEAOF # 正在进行时在主进程中调用 fsync()。 # # 这意味着当另一个子文件正在保存时,Redis 的持久性与“appendfsync none”相同。 # 实际上,这意味着在最坏的情况下(使用默认的 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 的系统崩溃时,可能会发生这种情况, # 尤其是当挂载 ext4 文件系统而没有 data=ordered 选项时(但是当 Redis # 本身崩溃或中止但操作系统仍然正常工作时,不会发生这种情况)。 # # 当发生这种情况时,Redis 可以退出并返回错误,或者加载尽可能多的数据 # (现在是默认值),如果发现 AOF 文件在结尾处被截断,则重新启动。 # 以下选项控制此行为: # # 如果 aof-load-truncated 设置为 yes,则会加载截断的 AOF 文件, # 并且 Redis 服务器开始发出日志以通知用户事件。 # 否则,如果该选项设置为 no,服务器将中止并显示错误并拒绝启动。 # 当该选项设置为 no 时,用户需要使用“redis-check-aof”实用程序 # 修复 AOF 文件,然后重新启动服务器。 # # 请注意,如果发现 AOF 文件在中间损坏,服务器仍将退出并显示错误。 # 仅当 Redis 尝试从 AOF 文件中读取更多数据但找不到足够的字节时,此选项才适用。 aof-load-truncated yes # 重写 AOF 文件时,Redis 能够在 AOF 文件中使用 RDB 前导码, # 以加快重写和恢复速度。打开此选项后,重写的 AOF 文件由两个不同的节组成: # # [RDB file][AOF tail] # # 当加载 Redis 识别到 AOF 文件以“Redis”字符串开头, # 并加载带有前缀的 RDB 文件,然后继续加载 AOF 尾部。 aof-use-rdb-preamble yes ################################ LUA 脚本 ############################### # Lua 脚本的最大执行时间(以毫秒为单位)。 # # 如果达到了最大的执行时间,Redis将记录一个脚本在允许的最大时间后仍在执行, # 并开始以错误回复查询。 # # 当长时间运行的脚本超过最大执行时间时,只有 SCRIPT KILL 和 # SHUTDOWN NOSAVE 命令可用。 # 第一个可用于停止尚未调用写入命令的脚本。第二种是关闭服务器的唯一方法, # 以防脚本已经发出了写入命令,但用户不想等待脚本的自然终止。 # # 将其设置为 0 或负值,以无限制执行而不发出警告。 lua-time-limit 5000 ################################ REDIS 集群 ############################### # 普通的 Redis 实例不能成为 Redis 集群的一部分;只有作为集群节点启动的节点可以。 # 为了启动一个 Redis 实例作为一个集群节点,启用集群支持取消注释如下: # # cluster-enabled yes # 每个集群节点都有一个集群配置文件,这个文件不打算用手编辑, # 它是由 Redis 节点创建和更新的。每个 Redis 集群节点都需要一个不同的集群配 # 置文件。确保在同一系统中运行的实例没有重叠的集群配置文件名称。 # # cluster-config-file nodes-6379.conf # 集群节点超时时间是指一个节点必须不可达的毫秒数,才会被认为处于故障状态。 # 大多数其他内部时间限制是节点超时的倍数。 # # cluster-node-timeout 15000 # 发生故障的主服务器(master)的副本将避免在其数据看起来太旧时启动故障转移。 # # 副本没有简单的方法来实际测量其“数据年龄”,因此执行以下两项检查: # # 1) 如果有多个复制副本能够进行故障切换,它们会交换消息,以便尝试以最佳复制 # 偏移量(处理了来自 master 的更多数据)为复制副本提供优势。 # 副本将尝试通过偏移量获取其等级,并在故障切换开始时应用与其等级成比例的延迟。 # # 2) 每个副本都会计算与其 master 的最后一次交互时间。这可以是上次 # 收到的 ping 或命令(如果 master 仍处于“已连接”状态), # 也可以是自与主服务器断开连接以来经过的时间(如果复制链路当前已关闭)。 # 如果最后一个交互太旧,则副本根本不会尝试故障转移。 # # 点“2”可以由用户调整。具体而言,如果自上次与 master 交互以来, # 经过的时间大于以下时间,则副本将不会执行故障转移: # # (node-timeout * replica-validity-factor) + repl-ping-replica-period # # 因此,例如,如果 node-timeout 是 30 秒,replica-validity-factor 是 10, # 并且假设默认的 repo -ping-replica-period 是 10 秒, # 那么如果副本不能与主服务器进行超过 310 秒的通话,它将不会尝试故障转移。 # # 较大的 replica-validity-factor 可能允许数据太旧的副本故障转移 master, # 而太小的值可能会阻止集群选择副本。 # # 为了获得最大可用性,可以将副本有效性因子设置为值 0, # 这意味着副本将始终尝试故障转移 master, # 而不管它们上次与主服务器交互的时间如何。 # (但是,他们总是会尝试应用与其偏移等级成比例的延迟)。 # # 0 是唯一能够保证当所有分区恢复时,集群始终能够继续运行的值。 # # cluster-replica-validity-factor 10 # 群集副本能够迁移到孤立的主节点,即没有工作副本的主节点。 # 这提高了群集抵御故障的能力,否则,如果孤立的主服务器没有 # 工作副本,则在发生故障时无法对其进行故障转移。 # # 仅当旧的主服务器仍有至少给定数量的其他工作副本时,副本才 # 会迁移到孤立的主服务器。这个数字就是“迁移障碍”。迁移障碍 # 为1意味着副本只有在其主副本至少有1个其他工作副本时才会迁 # 移,依此类推。它通常反映您要为集群中的每个主服务器创建的 # 副本的数量。 # # 默认值是1(只有当它们的主副本保留至少一个副本时,副本才 # 会迁移)。要禁用迁移,只需将其设置为一个非常大的值。可以设 # 置值为0,但仅在调试时有用,而且在生产中很危险。 # # cluster-migration-barrier 1 # 默认情况下,如果Redis集群节点检测到至少有一个哈希槽未被覆 # 盖(没有可用的节点为其服务),则停止接受查询。 # 这样一来,如果集群部分瘫痪(例如一系列的哈希槽不再被覆盖), # 所有的集群最终都变得不可用。 # 一旦所有插槽再次被覆盖,它就会自动恢复可用。 # # 然而,有时你想让正在工作的集群子集继续接受对仍被覆盖的那部 # 分键空间的查询。为了做到这一点,只需将 # cluster-require-full-coverage 选项设置为 no。 # # cluster-require-full-coverage yes # 当此选项设置为 yes 时,将防止副本在主服务器故障时试图将其主 # 服务器故障转移。 # 但是,如果强制执行,主服务器仍然可以执行手动故障转移。 # # 这在不同的场景下是很有用的,特别是在多个数据中心运行的情况下, # 如果不是在DC完全故障的情况下,我们希望一方永远不会被提升。 # # cluster-replica-no-failover no # 为了安装您的集群,请务必阅读http://redis.io网站上的文档。 ########################## 集群 DOCKER/NAT 支持 ######################## # 在某些部署中,Redis Cluster节点的地址发现失败,因为地址被NAT屏蔽 # 或端口被转发(典型情况是Docker和其他容器)。 # # 为了使Redis集群在这样的环境中工作,需要一个静态配置,其中每个节点 # 都知道自己的公共地址。以下两个选项用于此范围,分别是: # # * cluster-announce-ip # * cluster-announce-port # * cluster-announce-bus-port # # 每个节点指示节点其地址、客户机端口和集群消息总线端口。然后在总线包的 # 报头中发布该信息,以便其他节点能够正确地映射发布该信息的节点的地址。 # # 如果不使用上述选项,将使用正常的 Redis Cluster 自动检测来代替。 # # 请注意,当重新映射时,总线端口可能不在client port + 10000的固定偏 # 移量上,所以你可以指定任何端口和总线端口,取决于它们如何被重新映射。 # 如果没有设置总线端口,通常会使用10000的固定偏移。 # # Example: # # cluster-announce-ip 10.1.1.5 # cluster-announce-port 6379 # cluster-announce-bus-port 6380 ################################## 慢日志 ################################### # Redis 慢日志是一个记录超过指定执行时间的查询的系统。执行时间不包括I/O操作, # 如与客户端对话、发送回复等,而只是实际执行命令所需的时间(这是命令 # 执行的唯一阶段,线程被阻塞,不能同时为其他请求服务)。 # # 您可以使用两个参数配置慢速日志: 一个参数告诉Redis要超过多少微秒的执行时间 # 才能记录命令,另一个参数是慢速日志的长度。 # 当记录一个新命令时,最早的命令将从记录的命令队列中删除。 # 下面的时间以微秒表示,因此 1000000 相当于一秒。请注意,负数禁用慢日志, # 而值为零则强制记录每个命令。 slowlog-log-slower-than 10000 # 这个长度没有限制。只是要注意它将消耗内存。 # 你可以用 SLOWLOG RESET 来回收慢速日志所使用的内存。 slowlog-max-len 128 ################################ 延迟监控 ############################## # Redis 延迟监控子系统在运行时对不同的操作进行采样,以收集与Redis实例可 # 能的延迟来源有关的数据。 # # 通过 LATENCY 命令,用户可以获得这些信息,可以打印图表和获得报告。 # # 系统只记录在等于或大于通过 latency-monitor-threshold 配置指令指定 # 的毫秒量的时间内执行的操作。当它的值被设置为零时,延迟监控被关闭。 # # 默认情况下,延迟监控是被禁用的,因为如果你没有延迟问题,大部分情况 # 下是不需要的,而且收集数据对性能有影响,虽然非常小,但可以在大负荷下测量。 # 如果需要的话,可以使用 # "CONFIG SET latency-monitor-threshold <milliseconds>"命令在运行 # 时轻松启用延迟监控。 latency-monitor-threshold 0 ############################# 事件通知 ############################## # Redis 可以通知 Pub/Sub 客户端在键空间中发生的事件。功能文档参考: # http://redis.io/topics/notifications # # 例如,如果键空间事件通知被启用,一个客户对存储在数据库0中的键 "foo" # 执行 DEL 操作,将通过 Pub/Sub 发布两个消息。 # # PUBLISH __keyspace@0__:foo del # PUBLISH __keyevent@0__:del foo # # 我们可以在一组类中选择 Redis 将通知的事件。每个类都由一个字符来标识。如下: # # K 键空间事件,以 __keyspace@<db>__ 为前缀发布 # E Keyevent事件,以 __keyevent@<db>__ 为前缀发布 # g 通用命令(非特定类型),如 DEL、EXPIRE、RENAME... # $ 字符串类型相关命令 # l 列表类型相关命令 # s 集合类型相关命令 # h 哈希类型相关命令 # z 排序集合类型相关命令 # x 过期事件(每次键过期时产生的事件) # e 驱逐事件(当一个到最大内存时键被驱逐产生的事件) # A g$lshzxe的别名,因此,"AKE" 字符串意味着所有的事件。 # # “notify-keyspace-events” 的参数是一个由零或多个字符组成的字符串。 # 空字符串意味着通知被禁用。 # # 例如:要启用列表和通用事件,从事件名称的角度来看,请使用: # # notify-keyspace-events Elg # # 例2:为了获得订阅通道名称为 __keyevent@0__:expired 的键过期流,请使用: # # notify-keyspace-events Ex # # 默认情况下,所有的通知都是禁用的,因为大多数用户不需要这个功能, # 而且这个功能有一些开销。 # 注意,如果你没有指定K或E中的至少一个,就不会有事件被传递。 notify-keyspace-events "" ############################### 高级配置 ############################### # 当哈希值有少量的条目,并且最大的条目不超过一个给定的阈值时,哈希值就 # 会使用一个内存效率高的数据结构进行编码。这些阈值可以通过以下指令来配置。 hash-max-ziplist-entries 512 hash-max-ziplist-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 <-- 好 # 正数意味着每个列表节点存储的元素数量不超过这个数字。最高性能选项通常 # 是 -2 (8 Kb大小) 或 -1 (4 Kb大小),但如果您的用例是唯一的,请根据需要 # 调整设置。 list-max-ziplist-size -2 # 列表也可以被压缩。 # 压缩深度是从列表的 *each* 侧到 *exclude* 压缩的快速列表压缩列表节点的数量。 # 列表的头部和尾部始终未压缩,以便进行快速 push/pop 操作。设置包括: # 0: 禁用所有列表压缩 # 1: 深度 1 意味着 “直到 1 个节点进入列表后才开始压缩,从头部或尾部开始” # 所以: [head]->node->node->...->node->[tail] # [head], [tail] 将永远是未压缩的,内部节点将被压缩。 # 2: [head]->[next]->node->node->...->node->[prev]->[tail] # 2 在这里的意思是:不要压缩 head 或 head->next 或 tail->prev 或 tail, # 而是压缩它们之间的所有节点。 # 3: [head]->[next]->[next]->node->node->...->node->[prev]->[prev]->[tail] 等 list-compress-depth 0 # 集合仅在一种情况下具有特殊的编码:当集合仅由字符串组成时, # 这些字符串恰好是 64 位有符号整数范围内的基数 10 中的整数。 # 以下配置设置了集大小的限制,以便使用此特殊的内存节省编码。 set-max-intset-entries 512 # 与哈希和列表类似,排序集也经过特殊编码以节省大量空间。仅当排序 # 集的长度和元素低于以下限制时,才使用此编码: zset-max-ziplist-entries 128 zset-max-ziplist-value 64 # HyperLogLog 稀疏表示法的字节数限制。这个限制包括 16 字节的标题。 # 当使用稀疏表示法的 HyperLogog 超过这个限制时,它就会被转换为密集表示法。 # # 大于16000的值是完全无用的,因为此时密集表示的内存效率更高。 # # 建议的值是~3000,以获得空间效率编码的好处,而不至于使PFADD的 # 速度太慢,因为稀疏编码的速度是O(N)。当CPU不是问题,但空间是问题, # 并且数据集是由许多 cardinality 在0-15000范围内的 HyperLogLogs # 组成时,该值可以提高到~10000。 hll-sparse-max-bytes 3000 # 流的大节点最大尺寸/项目。流数据结构是一个大节点的弧度树,里面编码了 # 多个项目。使用这个配置,可以配置单个节点可以有多大的字节数,以及在 # 追加新的流条目时切换到新的节点之前可以包含的最大项目数。如果下面的 # 任何设置被设置为0,那么该限制将被忽略,因此,例如,可以通过将 # max-byte设置为0,将max-entries设置为所需的值来设置最大数量的限制。 stream-node-max-bytes 4096 stream-node-max-entries 100 # 主动重新洗牌每100毫秒使用1毫秒的CPU时间,以帮助重新洗牌Redis的 # 主哈希表(将顶层键映射到值的那个)。Redis使用的哈希表实现(见dict.c) # 执行懒惰的重洗:你越是碰到正在重洗的哈希表的操作,就会执行更多的重洗 # "步骤",所以如果服务器是空闲的,重洗永远不会完成,还有一些内存被哈希表使用。 # # 默认情况下,每秒钟使用这个毫秒10次,以便主动重新洗刷主字典,尽可能释放内存。 # # 如果不确定: # 如果你有严格的延迟要求,并且Redis不时地回复2毫秒延迟的查询在你的环境中不 # 是一件好事,就使用 "activerehashing no"。 # # 如果你没有这样的硬性要求,但又想尽可能地释放内存,就使用 "activerehashing yes"。 activerehashing yes # 客户端输出缓冲区的限制可以用来强制断开那些由于某种原因不能从服务器上 # 快速读取数据的客户端(一个常见的原因是Pub/Sub客户端消耗消息的速度比 # 不上发布者产生消息的速度)。 # # 对于三类不同的客户,可以设置不同的限额: # # normal -> 普通客户,包括MONITOR客户 # replica -> 副本集客户 # pubsub -> 客户端订阅了至少一个pubsub频道或模式 # # 每条client-output-buffer-limit指令的语法如下: # # client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds> # # 一旦达到硬限制,或达到软限制并保持在指定的秒数(连续),客户端将立即断开连接。 # 因此,例如,如果硬限制是32兆字节,软限制是16兆字节/10秒, # 如果输出缓冲区的大小达到32兆字节,客户端将立即断开连接, # 但如果客户端达到16兆字节并连续超过10秒的限制,也将被断开连接。 # # 默认情况下,正常的客户端不会受到限制,因为他们不会在没有询问的情况下接 # 收数据(以推送的方式),而只是在请求之后,所以只有异步客户端可能会创造 # 一种情况,即请求数据的速度比它能读取的速度快。 # # 相反,对pubsub和replica客户端有一个默认的限制,因为订阅者和复制者是以推送方式接收数据的。 # # 硬限制或软限制都可以通过设置为零来禁用。 client-output-buffer-limit normal 0 0 0 client-output-buffer-limit replica 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 # 客户端查询缓冲区会积累新的命令。默认情况下,它们被限制在一个固定的数量, # 以避免协议的不同步(例如由于客户端的一个错误)会导致查询缓冲区的内存使 # 用不受限制。然而,如果你有非常特殊的需求,如巨大的多/执行请求或类似的 # 需求,你可以在这里配置它。 # # client-query-buffer-limit 1gb # 在Redis协议中,批量请求,也就是代表单个字符串的元素, # 通常被限制在512mb。然而,你可以在这里改变这个限制。 # # proto-max-bulk-len 512mb # Redis调用一个内部函数来执行许多后台任务,如在超时中关闭客户的连接, # 清除从未被请求的过期键等等。 # # 不是所有的任务都以相同的频率执行,但Redis会根据指定的 "hz" 值检查要执行的任务。 # # 默认情况下,"hz "被设置为10。提高该值会在Redis空闲时使用更多的CPU, # 但同时会使Redis在有许多键同时到期时反应更快,而且超时的处理可能更精确。 # # 范围在1到500之间,但是超过100的值通常不是一个好主意。 # 大多数用户应该使用默认的10,只有在需要非常低的延迟的环境下, # 才可以将其提高到100。 hz 10 # 通常情况下,HZ值与连接的客户数量成正比是很有用的。这是有用的, # 例如,为了避免每个后台任务的调用有太多的客户被处理,以避免延迟高峰的出现。 # # 由于默认的HZ值被保守地设置为10,Redis提供并默认启用了使用自适应HZ值的能力, # 当有许多连接的客户端时,HZ值会临时提高。 # # 当启用动态HZ时,实际配置的HZ将被用作基线,但一旦有更多的客户端连接, # 配置的HZ值的倍数将根据需要实际使用。通过这种方式,一个空闲的实例将使用很少的CPU时间, # 而一个繁忙的实例将有更多的响应。 dynamic-hz yes # 当一个孩子重写AOF文件时,如果启用以下选项,该文件将每产生32MB的数据就会被fsync。 # 这对于将文件更多地提交到磁盘并避免大的延迟峰值是很有用的。 aof-rewrite-incremental-fsync yes # 当redis保存RDB文件时,如果启用以下选项,该文件将每产生32MB的数据就进行一次sync。 # 这对于将文件更多地提交到磁盘并避免大的延迟峰值是很有用的。 rdb-save-incremental-fsync yes # Redis的LFU驱逐(见maxmemory设置)是可以调整的。然而,从默认设置开始是个好主意, # 只有在调查了如何改善性能以及LFU的按键随时间变化的情况下才可以改变它们,这可以通过OBJECT FREQ命令来检查。 # # 在Redis LFU的实现中,有两个可调整的参数:计数器的对数因子和计数器的衰减时间。 # 在改变这两个参数之前,了解这两个参数的含义是很重要的。 # # LFU计数器每个键只有8位,它的最大值是255,所以Redis使用对数行为的概率递增。 # 考虑到旧的计数器的值,当一个键被访问时,计数器会以这种方式递增。 # # 1. 提取了一个介于0和1之间的随机数R。 # 2. 一个概率P被计算为1/(old_value*lfu_log_factor+1)。 # 3. 只有当R<P时,计数器才会递增。 # # 默认的lfu-log系数是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服务器的标准模板, # 但也需要自定义一些每个服务器的设置,这是很有用的。 # 包含文件可以包含其他文件,所以要明智地使用它。 # # include /path/to/local.conf # include /path/to/other.conf
笔者翻译水平有限,如有问题还请谅解,点击查看英文版的 redis.conf 配置文件作参考。