# Redis configuration file example. # # Note that in order to read the configuration file, Redis must be # started with the file path as first argument: #? # 启动Redis服务时,以这种方式指定此Redis服务的配置文件 # ./redis-server /path/to/redis.conf
# Note on units: when memory size is needed, it is possible to specify # it in the usual form of 1k 5GB 4M and so forth: #? # 当你需要为某个配置项指定内存大小的时候,必须带上单位,例如下面的写法: # 1k => 1000 bytes # 1kb => 1024 bytes # 1m => 1000000 bytes # 1mb => 1024*1024 bytes # 1g => 1000000000 bytes # 1gb => 1024*1024*1024 bytes # # units are case insensitive so 1GB 1Gb 1gB are all the same.
################################## INCLUDES ###################################
# Include one or more other config files here. ?This is useful if you # have a standard template that goes to all Redis servers but also need # to customize a few per-server settings. ?Include files can include # other files, so use this wisely. # # Notice option "include" won't be rewritten by command "CONFIG REWRITE" # from admin or Redis Sentinel. Since Redis always uses the last processed # line as value of a configuration directive, you'd better put includes # at the beginning of this file to avoid overwriting config change at runtime. # # If instead you are interested in using includes to override configuration # options, it is better to use include as the last line. # # 假如你有一个可用于所有Redis Server的通用模板 # 但是对于某些服务又需要一些个性化的设置, # 那么你可以使用这种方式引入你自己的配置文件 # 需要注意的是,Redis配置自上而下加载, # 后面的设置会覆盖前面的设置, # 所以,如果你需要自己的个性化配置生效, # 建议在通用模板的最后面引入自己的配置文件 # include /path/to/local.conf # include /path/to/other.conf
################################## MODULES #####################################
# Load modules at startup. If the server is not able to load modules # it will abort. It is possible to use multiple loadmodule directives. # # 在运行时从动态链接库中加载一个模块。 # 加载并初始化path 参数指定的动态链接库。 # path 必须是绝对路径,包括完整的文件名,path以外的其它参数将被原样传递给模块。 # # loadmodule /path/to/my_module.so # loadmodule /path/to/other_module.so
################################## NETWORK #####################################
# By default, if no "bind" configuration directive is specified, Redis listens # for connections from all the network interfaces available on the server. # It is possible to listen to just one or multiple selected interfaces using # the "bind" configuration directive, followed by one or more IP addresses. # # Examples: # # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 ::1 # # ~~~ WARNING ~~~ If the computer running Redis is directly exposed to the # internet, binding to all the interfaces is dangerous and will expose the # instance to everybody on the internet. So by default we uncomment the # following bind directive, that will force Redis to listen only into # the IPv4 loopback interface address (this means Redis will be able to # accept connections only from clients running into the same computer it # is running). # # IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES # JUST COMMENT THE FOLLOWING LINE. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # 指定Redis只接收来自该IP地址的请求,如果不指定,那么将处理所有地址的请求 # 多个IP用空格隔开 bind 127.0.0.1
# Protected mode is a layer of security protection, in order to avoid that # Redis instances left open on the internet are accessed and exploited. # # When protected mode is on and if: # # 1) The server is not binding explicitly to a set of addresses using the # ? ?"bind" directive. # 2) No password is configured. # # The server only accepts connections from clients connecting from the # IPv4 and IPv6 loopback addresses 127.0.0.1 and ::1, and from Unix domain # sockets. # # By default protected mode is enabled. You should disable it only if # you are sure you want clients from other hosts to connect to Redis # even if no authentication is configured, nor a specific set of interfaces # are explicitly listed using the "bind" directive. # 是否开启保护模式,默认是开启的 # 如果你希望Redis处理来自任意地址的请求,那么建议关闭它 # 如果你希望Redis只处理来自指定IP的请求,那么建议开启它 # 当开启后,禁止公网访问redis。 # 它启用的条件有两个,第一是没有使用bind绑定ip,第二是没有设置访问密码。 protected-mode yes
# Accept connections on the specified port, default is 6379 (IANA #815344). # If port 0 is specified Redis will not listen on a TCP socket. # 设定Redis服务的端口号 port 6379
# TCP listen() backlog. # # In high requests-per-second environments you need an high backlog in order # to avoid slow clients connections issues. Note that the Linux kernel # will silently truncate it to the value of /proc/sys/net/core/somaxconn so # make sure to raise both the value of somaxconn and tcp_max_syn_backlog # in order to get the desired effect. # 在客户端每秒请求数非常高的环境中(高并发场景), # 你需要设置一个较高的backlog值,以避免客户端连接缓慢 # Linux内核会一声不吭地将它设置为 /proc/sys/net/core/somaxconn对应的值 # 所以你可能需要提高 somaxconn 和 tcp_max_syn_backlog 的值才能达到预期 tcp-backlog 511
# Unix socket. # # Specify the path for the Unix socket that will be used to listen for # incoming connections. There is no default, so Redis will not listen # on a unix socket when not specified. # 将会指定用来监听连接的Unix 套接字 # 没有默认值,如果不指定,就不会监听 # unixsocket /tmp/redis.sock # unixsocketperm 700
# Close the connection after a client is idle for N seconds (0 to disable) # 在客户端空闲多少秒之后关闭连接(0就是不管它) timeout 0
# TCP keepalive. # TCP 心跳包 # If non-zero, use SO_KEEPALIVE to send TCP ACKs to clients in absence # of communication. This is useful for two reasons: # 如果设置为非零,则在与客户端缺乏通讯的时候使用SO_KEEPALIVE发送 TCP ACKs 给客户端 # 之所以这样做是因为这两个原因: # 1、防止死的peers # 2、保持网络中间件的活跃性 # 1) Detect dead peers. # 2) Take the connection alive from the point of view of network # ? ?equipment in the middle. # # On Linux, the specified value (in seconds) is the period used to send ACKs. # Note that to close the connection the double of the time is needed. # On other kernels the period depends on the kernel configuration. # # A reasonable value for this option is 300 seconds, which is the new # Redis default starting with Redis 3.2.1. # 一个合理的建议是300秒 # Redis 3.2.1 之后的版本默认也是这个值 tcp-keepalive 300
################################# GENERAL ##################################### ################################# 常用 #####################################
# By default Redis does not run as a daemon. Use 'yes' if you need it. # Note that Redis will write a pid file in /var/run/redis.pid when daemonized. # 是否作为守护进程运行,默认是 no daemonize yes
# If you run Redis from upstart or systemd, Redis can interact with your # supervision tree. Options: # ? supervised no ? ? ?- no supervision interaction # ? supervised upstart - signal upstart by putting Redis into SIGSTOP mode # ? supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET # ? supervised auto ? ?- detect upstart or systemd method based on # ? ? ? ? ? ? ? ? ? ? ? ?UPSTART_JOB or NOTIFY_SOCKET environment variables # Note: these supervision methods only signal "process is ready." # ? ? ? They do not enable continuous liveness pings back to your supervisor. # 可以通过 upstart 和 systemd 管理守护进程 # supervised no ?没有监督互动 # supervised upstart ?通过将Redis置于SIGSTOP模式来启动信号 # supervised systemd ?signal systemd将READY = 1写入$ NOTIFY_SOCKET # supervised auto ?检测upstart或systemd方法基于 UPSTART_JOB或NOTIFY_SOCKET环境变量 supervised no
# If a pid file is specified, Redis writes it where specified at startup # and removes it at exit. # # When the server runs non daemonized, no pid file is created if none is # specified in the configuration. When the server is daemonized, the pid file # is used even if not specified, defaulting to "/var/run/redis.pid". # # Creating a pid file is best effort: if Redis is not able to create it # nothing bad happens, the server will start and run normally. # 配置PID文件路径,当redis作为守护进程运行的时候, # 它会把 pid 默认写到 /var/run/redis_6379.pid 文件里面 # 扩展一下知识点: # pid文件的内容:用cat命令查看,可以看到pid文件的内容只有一行,记录了该进程的id # pid文件的作用:防止启动多个进程副本 # pid文件的原理:进程运行后会给.pid文件加一个文件锁,只有获得该锁的进程才有写入权限 # 把自身的pid写入该文件中,其他试图获得该锁的进程会自动退出 pidfile /var/run/redis_6379.pid
# Specify the server verbosity level. # This can be one of: # debug (a lot of information, useful for development/testing) # verbose (many rarely useful info, but not a mess like the debug level) # notice (moderately verbose, what you want in production probably) # warning (only very important / critical messages are logged) # 指定日志级别 loglevel notice
# Specify the log file name. Also the empty string can be used to force # Redis to log on the standard output. Note that if you use standard # output for logging but daemonize, logs will be sent to /dev/null # 指定日志文件的位置 logfile ""
# To enable logging to the system logger, just set 'syslog-enabled' to yes, # and optionally update the other syslog parameters to suit your needs. # 要想把日志记录到系统文件,就需要设置为yes #? # syslog-enabled no
# Specify the syslog identity. # 设置系统日志的ID # syslog-ident redis
# Specify the syslog facility. Must be USER or between LOCAL0-LOCAL7. # 指定系统日志的级别 # 必须是 USER 或者 LOCAL0-LOCAL7 之间的值 # syslog-facility local0
# Set the number of databases. The default database is DB 0, you can select # a different one on a per-connection basis using SELECT <dbid> where # dbid is a number between 0 and 'databases'-1 # 设置数据库的个数 # 默认是 DB0 # 你可以在不同的数据库里使用select <dbid> 的方式切换数据库 # dbid是介于0到databases -1 的值 databases 16
# By default Redis shows an ASCII art logo only when started to log to the # standard output and if the standard output is a TTY. Basically this means # that normally a logo is displayed only in interactive sessions. # # However it is possible to force the pre-4.0 behavior and always show a # ASCII art logo in startup logs by setting the following option to yes. # redis启动时是否显示Logo always-show-logo yes
################################ SNAPSHOTTING ?################################ # # Save the DB on disk: # # ? save <seconds> <changes> # # ? Will save the DB if both the given number of seconds and the given # ? number of write operations against the DB occurred. # ? 根据给定的时间间隔和写入次数将数据保存到磁盘 # # ? In the example below the behaviour will be to save: # ? after 900 sec (15 min) if at least 1 key changed # ? after 300 sec (5 min) if at least 10 keys changed # ? after 60 sec if at least 10000 keys changed # # ? Note: you can disable saving completely by commenting out all "save" lines. # # ? It is also possible to remove all the previously configured save # ? points by adding a save directive with a single empty string argument # ? like in the following example: # # ? save "" # ?900秒内至少有一次写入则保存数据到磁盘 # ?你也可以注释掉所有的save行来停用保存功能,或者直接写成 save "" save 900 1 save 300 10 save 60 10000
# By default Redis will stop accepting writes if RDB snapshots are enabled # (at least one save point) and the latest background save failed. # This will make the user aware (in a hard way) that data is not persisting # on disk properly, otherwise chances are that no one will notice and some # disaster will happen. # # If the background saving process will start working again Redis will # automatically allow writes again. # # However if you have setup your proper monitoring of the Redis server # and persistence, you may want to disable this feature so that Redis will # continue to work as usual even if there are problems with disk, # permissions, and so forth. # 如果用户开启了RDB快照功能,那么在Redis持久化数据到磁盘时如果出现失败, # 默认情况下,Redis会停止接受所有的写请求 # 这样做的好处在于可以让用户很明确的知道内存中的数据和磁盘上的数据已经不一致了 # 如果Redis不顾这种不一致,继续接受写请求,就可能会引起一些灾难性的后果 # 如果RDB下一次持久化成功,Redis会自动恢复接受写请求 # 如果不在乎这种数据不一致,或者有其他的手段发现和控制这种不一致的话,可以关闭这个功能 # 以便在快照写入失败时,也能确保Redis继续接受写请求 stop-writes-on-bgsave-error yes
# Compress string objects using LZF when dump .rdb databases? # For default that's set to 'yes' as it's almost always a win. # If you want to save some CPU in the saving child set it to 'no' but # the dataset will likely be bigger if you have compressible values or keys. # 对于存储到磁盘中的快照,可以设置是否进行压缩存储 # 如果是的话,Redis会采用LZF算法进行压缩 # 如果你不想压缩的话,可以关闭此功能,但是存储在磁盘上的快照会比较大 rdbcompression yes
# Since version 5 of RDB a CRC64 checksum is placed at the end of the file. # This makes the format more resistant to corruption but there is a performance # hit to pay (around 10%) when saving and loading RDB files, so you can disable it # for maximum performances. # # RDB files created with checksum disabled have a checksum of zero that will # tell the loading code to skip the check. # 在存储快照后,我们还可以让Redis使用CRC64算法来进行数据校验。 # 但是这样做会增加大约10%的性能消耗 # 如果你希望有较高的性能,可以关闭它 rdbchecksum yes
# The filename where to dump the DB # 设置快照的文件名 dbfilename dump.rdb
# The working directory. # # The DB will be written inside this directory, with the filename specified # above using the 'dbfilename' configuration directive. # # The Append Only File will also be created inside this directory. # # Note that you must specify a directory here, not a file name. # 设置快照文件的存放路径,注意,这个路径只能是目录,不可以是文件 dir ./
################################# REPLICATION ################################# ################################# 主从复制 #################################
# Master-Replica replication. Use replicaof to make a Redis instance a copy of # another Redis server. A few things to understand ASAP about Redis replication. # # ? +------------------+ ? ? ?+---------------+ # ? | ? ? ?Master ? ? ?| ---> | ? ?Replica ? ?| # ? | (receive writes) | ? ? ?| ?(exact copy) | # ? +------------------+ ? ? ?+---------------+ # # 1) Redis replication is asynchronous, but you can configure a master to # ? ?stop accepting writes if it appears to be not connected with at least # ? ?a given number of replicas. # 2) Redis replicas are able to perform a partial resynchronization with the # ? ?master if the replication link is lost for a relatively small amount of # ? ?time. You may want to configure the replication backlog size (see the next # ? ?sections of this file) with a sensible value depending on your needs. # 3) Replication is automatic and does not need user intervention. After a # ? ?network partition replicas automatically try to reconnect to masters # ? ?and resynchronize with them. # 设置master的ip和port,注意,只需要在slave上设置即可? # # replicaof <masterip> <masterport>
# If the master is password protected (using the "requirepass" configuration # directive below) it is possible to tell the replica to authenticate before # starting the replication synchronization process, otherwise the master will # refuse the replica request. # 如果master设置了requirepass,那么slave想要连上master,必须在这里填写master的密码 # masterauth <master-password>
# When a replica loses its connection with the master, or when the replication # is still in progress, the replica can act in two different ways: # # 1) if replica-serve-stale-data is set to 'yes' (the default) the replica will # ? ?still reply to client requests, possibly with out of date data, or the # ? ?data set may just be empty if this is the first synchronization. # # 2) if replica-serve-stale-data is set to 'no' the replica will reply with # ? ?an error "SYNC with master in progress" to all the kind of commands # ? ?but to INFO, replicaOF, AUTH, PING, SHUTDOWN, REPLCONF, ROLE, CONFIG, # ? ?SUBSCRIBE, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB, # ? ?COMMAND, POST, HOST: and LATENCY. # # 当从库同主机失去连接或者复制正在进行,从机库有两种运行方式: # 1) 如果slave-serve-stale-data设置为yes(默认设置),从库会继续响应客户端的请求。 # 2) 如果slave-serve-stale-data设置为no,那么INFO,replicaOF, AUTH, PING, SHUTDOWN, REPLCONF, ROLE, CONFIG,SUBSCRIBE, UNSUBSCRIBE, # PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB,COMMAND, POST, HOST: and LATENCY命令之外的任何请求 # 都会返回一个错误”SYNC with master in progress”
replica-serve-stale-data yes
# You can configure a replica instance to accept writes or not. Writing against # a replica instance may be useful to store some ephemeral data (because data # written on a replica will be easily deleted after resync with the master) but # may also cause problems if clients are writing to it because of a # misconfiguration. # # Since Redis 2.6 by default replicas are read-only. # # Note: read only replicas are not designed to be exposed to untrusted clients # on the internet. It's just a protection layer against misuse of the instance. # Still a read only replica exports by default all the administrative commands # such as CONFIG, DEBUG, and so forth. To a limited extent you can improve # security of read only replicas using 'rename-command' to shadow all the # administrative / dangerous commands. # 作为slave服务器,默认只读 replica-read-only yes
# Replication SYNC strategy: disk or socket. # # ------------------------------------------------------- # WARNING: DISKLESS REPLICATION IS EXPERIMENTAL CURRENTLY # ------------------------------------------------------- # # New replicas and reconnecting replicas that are not able to continue the replication # process just receiving differences, need to do what is called a "full # synchronization". An RDB file is transmitted from the master to the replicas. # The transmission can happen in two different ways: # # 1) Disk-backed: The Redis master creates a new process that writes the RDB # ? ? ? ? ? ? ? ? file on disk. Later the file is transferred by the parent # ? ? ? ? ? ? ? ? process to the replicas incrementally. # 2) Diskless: The Redis master creates a new process that directly writes the # ? ? ? ? ? ? ?RDB file to replica sockets, without touching the disk at all. # # With disk-backed replication, while the RDB file is generated, more replicas # can be queued and served with the RDB file as soon as the current child producing # the RDB file finishes its work. With diskless replication instead once # the transfer starts, new replicas arriving will be queued and a new transfer # will start when the current one terminates. # # When diskless replication is used, the master waits a configurable amount of # time (in seconds) before starting the transfer in the hope that multiple replicas # will arrive and the transfer can be parallelized. # # With slow disks and fast (large bandwidth) networks, diskless replication # works better. # 主从数据复制是否使用无硬盘复制功能。 # ?新的从站和重连后不能继续备份的从站,需要做所谓的“完全备份”,即将一个RDB文件从主站传送到从站。 # ?这个传送有以下两种方式: # ?1)硬盘备份:redis主站创建一个新的进程,用于把RDB文件写到硬盘上。过一会儿,其父进程递增地将文件传送给从站。 # ?2)无硬盘备份:redis主站创建一个新的进程,子进程直接把RDB文件写到从站的套接字,不需要用到硬盘。 # ?在硬盘备份的情况下,主站的子进程生成RDB文件。一旦生成,多个从站可以立即排成队列使用主站的RDB文件。 # ?在无硬盘备份的情况下,一次RDB传送开始,新的slave到达后,需要等待现在的传送结束,才能开启新的传送。 # ?如果使用无硬盘备份,master会在开始传送之间等待一段时间(可配置,以秒为单位),希望等待多个slave到达后并行传送。 # ?在硬盘低速而网络高速(高带宽)情况下,无硬盘备份更好。 # yes - socket方式; no - disk方式 repl-diskless-sync no
# When diskless replication is enabled, it is possible to configure the delay # the server waits in order to spawn the child that transfers the RDB via socket # to the replicas. # # This is important since once the transfer starts, it is not possible to serve # new replicas arriving, that will be queued for the next RDB transfer, so the server # waits a delay in order to let more replicas arrive. # # The delay is specified in seconds, and by default is 5 seconds. To disable # it entirely just set it to 0 seconds and the transfer will start ASAP. # 当启用无硬盘备份,服务器等待一段时间后才会通过套接字向slave传送RDB文件,这个等待时间是可配置的。 # 这一点很重要,因为一旦传送开始,就不可能再为一个新到达的slave服务,而是需要排队等待下一次RDB传送。 # 因此服务器等待一段时间以期更多的slave到达。(向多个slave并行传送) # 延迟时间以秒为单位,默认为5秒 # 如果要关掉这一功能,只需将它设置为0秒,传送会立即启动 repl-diskless-sync-delay 5
# Replicas send PINGs to server in a predefined interval. It's possible to change # this interval with the repl_ping_replica_period option. The default value is 10 # seconds. # slave会周期性的向master发出PING包,你可以通过repl_ping_slave_period指令来控制其周期,默认是10秒 # repl-ping-replica-period 10
# The following option sets the replication timeout for: # # 1) Bulk transfer I/O during SYNC, from the point of view of replica. # 2) Master timeout from the point of view of replicas (data, pings). # 3) Replica timeout from the point of view of masters (REPLCONF ACK pings). # # It is important to make sure that this value is greater than the value # specified for repl-ping-replica-period otherwise a timeout will be detected # every time there is low traffic between the master and the replica. # 复制连接超时时间 # master和slave都有超时时间的设置 # 1)从slave的角度,同步期间的批量传输的I/O # 2)slave角度认为的master超时(数据,ping) # 3)master角度认为的slave超时(REPLCONF ACK pings) # 需要注意的是repl-timeout需要设置一个比repl-ping-slave-period更大的值,不然会经常检测到超时 # repl-timeout 60
# Disable TCP_NODELAY on the replica socket after SYNC? # # If you select "yes" Redis will use a smaller number of TCP packets and # less bandwidth to send data to replicas. But this can add a delay for # the data to appear on the replica side, up to 40 milliseconds with # Linux kernels using a default configuration. # # If you select "no" the delay for data to appear on the replica side will # be reduced but more bandwidth will be used for replication. # # By default we optimize for low latency, but in very high traffic conditions # or when the master and replicas are many hops away, turning this to "yes" may # be a good idea. # 同步之后是否禁用slave上的TCP_NODELAY # 如果你选择yes,redis会使用较少量的TCP包和带宽向slave发送数据。但这会导致在slave增加一点数据的延时。 # Linux内核默认配置情况下最多40毫秒的延时。 # 如果选择no,slave的数据延时不会那么长,但备份需要的带宽相对较多。 # 默认情况下我们将潜在因素优化,但在高负载情况下或者在master和slave都跳的情况下,把它切换为yes是个好主意。 repl-disable-tcp-nodelay no
# Set the replication backlog size. The backlog is a buffer that accumulates # replica data when replicas are disconnected for some time, so that when a replica # wants to reconnect again, often a full resync is not needed, but a partial # resync is enough, just passing the portion of data the replica missed while # disconnected. # # The bigger the replication backlog, the longer the time the replica can be # disconnected and later be able to perform a partial resynchronization. # # The backlog is only allocated once there is at least a replica connected. # 复制缓冲区大小 # 这是一个环形复制缓冲区,用来保存最新复制的命令。 # 当slave断开连接后,master会把数据写入缓冲区 # 等到slave重新上线后,只需要把缓冲区的数据复制给slave即可,而不需要全量同步 # 缓冲区越大,slave离线的时间就可以越长。 # 缓冲区只有在有slave连接的时候才分配内存,没有slave的一段时间,内存会被释放出来 # 默认1m # repl-backlog-size 1mb
# After a master has no longer connected replicas for some time, the backlog # will be freed. The following option configures the amount of seconds that # need to elapse, starting from the time the last replica disconnected, for # the backlog buffer to be freed. # # Note that replicas never free the backlog for timeout, since they may be # promoted to masters later, and should be able to correctly "partially # resynchronize" with the replicas: hence they should always accumulate backlog. # # A value of 0 means to never release the backlog. # master在没有slave连接的一段时间后会释放复制缓冲区的内存 # repl-backlog-ttl 3600
# The replica priority is an integer number published by Redis in the INFO output. # It is used by Redis Sentinel in order to select a replica to promote into a # master if the master is no longer working correctly. # # A replica with a low priority number is considered better for promotion, so # for instance if there are three replicas with priority 10, 100, 25 Sentinel will # pick the one with priority 10, that is the lowest. # # However a special priority of 0 marks the replica as not able to perform the # role of master, so a replica with priority of 0 will never be selected by # Redis Sentinel for promotion. # # By default the priority is 100. # 从站优先级是可以从redis的INFO命令输出中查到的一个整数。 # 当主站不能正常工作时,redis 的哨兵机制将会选择一个从站并将它提升为主站。 # ?低优先级的从站被认为更适合于提升,因此如果有三个从站优先级分别是10, # 100,25,哨兵会选择优先级为10的从站,因为它的优先级最低。 # 然而优先级值为0的从站不能执行主站的角色,因此优先级为0的从站永远不会被redis sentinel提升。 # 默认优先级是100 replica-priority 100
# It is possible for a master to stop accepting writes if there are less than # N replicas connected, having a lag less or equal than M seconds. # # The N replicas need to be in "online" state. # # The lag in seconds, that must be <= the specified value, is calculated from # the last ping received from the replica, that is usually sent every second. # # This option does not GUARANTEE that N replicas will accept the write, but # will limit the window of exposure for lost writes in case not enough replicas # are available, to the specified number of seconds. # # For example to require at least 3 replicas with a lag <= 10 seconds use: # 主站可以停止接受写请求,当与它连接的从站少于N个,滞后少于M秒,N个从站必须是在线状态。 # 延迟的秒数必须<=所定义的值,延迟秒数是从最后一次收到的来自从站的ping开始计算。ping通常是每秒一次。 # 这一选项并不保证N个备份都会接受写请求,但是会限制在指定秒数内由于从站数量不够导致的写操作丢失的情况。 # 举个例子,如果想要至少3个从站且延迟少于10秒,这样配置即可: # min-replicas-to-write 3 # min-replicas-max-lag 10 # # Setting one or the other to 0 disables the feature. # # By default min-replicas-to-write is set to 0 (feature disabled) and # min-replicas-max-lag is set to 10.
# A Redis master is able to list the address and port of the attached # replicas in different ways. For example the "INFO replication" section # offers this information, which is used, among other tools, by # Redis Sentinel in order to discover replica instances. # Another place where this info is available is in the output of the # "ROLE" command of a master. # # The listed IP and address normally reported by a replica is obtained # in the following way: # # ? IP: The address is auto detected by checking the peer address # ? of the socket used by the replica to connect with the master. # # ? Port: The port is communicated by the replica during the replication # ? handshake, and is normally the port that the replica is using to # ? listen for connections. # # However when port forwarding or Network Address Translation (NAT) is # used, the replica may be actually reachable via different IP and port # pairs. The following two options can be used by a replica in order to # report to its master a specific set of IP and port, so that both INFO # and ROLE will report those values. # # There is no need to use both the options if you need to override just # the port or the IP address. # 如果你只需要覆盖掉端口或者IP,没必要两个都设置
# 当在端口转发或NAT网络环境中,slave有多个ip地址 # 可以使用下面两个选项指定slave的ip地址和端口号 # # replica-announce-ip 5.5.5.5 # replica-announce-port 1234
################################## SECURITY ###################################
# Require clients to issue AUTH <PASSWORD> before processing any other # commands. ?This might be useful in environments in which you do not trust # others with access to the host running redis-server. # # This should stay commented out for backward compatibility and because most # people do not need auth (e.g. they run their own servers). # # Warning: since Redis is pretty fast an outside user can try up to # 150k passwords per second against a good box. This means that you should # use a very strong password otherwise it will be very easy to break. # 用户连接Redis后需要使用AUTH命令来认证密码,认证通过后才能使用Redis服务的其他命令 # 注意:因为Redis的速度很快,可以达到15W次/秒, # 如果你要设置密码,最好设置得复杂一些,以避免被攻破 # requirepass foobared
# Command renaming. # # It is possible to change the name of dangerous commands in a shared # environment. For instance the CONFIG command may be renamed into something # hard to guess so that it will still be available for internal-use tools # but not available for general clients. # # Example: # # rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 # # It is also possible to completely kill a command by renaming it into # an empty string: # # 把危险的命令给修改成其他名称。 # 比如CONFIG命令可以重命名为一个很难被猜到的命令, # 这样用户不能使用,而内部工具还能继续着使用 # 设置成一个空值,可以禁用一个命令 # rename-command CONFIG "" # # Please note that changing the name of commands that are logged into the # AOF file or transmitted to replicas may cause problems.
################################### CLIENTS ####################################
# Set the max number of connected clients at the same time. By default # this limit is set to 10000 clients, however if the Redis server is not # able to configure the process file limit to allow for the specified limit # the max number of allowed clients is set to the current file limit # minus 32 (as Redis reserves a few file descriptors for internal uses). # # Once the limit is reached Redis will close all the new connections sending # an error 'max number of clients reached'. # 最大客户端连接数,默认最多允许10000个客户端连接 # maxclients 10000
############################## MEMORY MANAGEMENT ################################
# Set a memory usage limit to the specified amount of bytes. # When the memory limit is reached Redis will try to remove keys # according to the eviction policy selected (see maxmemory-policy). # # If Redis can't remove keys according to the policy, or if the policy is # set to 'noeviction', Redis will start to reply with errors to commands # that would use more memory, like SET, LPUSH, and so on, and will continue # to reply to read-only commands like GET. # # This option is usually useful when using Redis as an LRU or LFU cache, or to # set a hard memory limit for an instance (using the 'noeviction' policy). # # WARNING: If you have replicas attached to an instance with maxmemory on, # the size of the output buffers needed to feed the replicas are subtracted # from the used memory count, so that network problems / resyncs will # not trigger a loop where keys are evicted, and in turn the output # buffer of replicas is full with DELs of keys evicted triggering the deletion # of more keys, and so forth until the database is completely emptied. # # In short... if you have replicas attached it is suggested that you set a lower # limit for maxmemory so that there is some free RAM on the system for replica # output buffers (but this is not needed if the policy is 'noeviction'). # redis配置的最大内存容量。 # 当内存满了,需要配合maxmemory-policy策略进行处理。 # 注意,slave的输出缓冲区是不计算在maxmemory内的。 # 所以为了防止主机内存使用完,建议将maxmemory设置得更小一些, # 以便系统中有一些空闲RAM用于副本输出缓冲区 ? # maxmemory <bytes>
# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory # is reached. You can select among five behaviors: # # volatile-lru -> Evict using approximated LRU among the keys with an expire set. # allkeys-lru -> Evict any key using approximated LRU. # volatile-lfu -> Evict using approximated LFU among the keys with an expire set. # allkeys-lfu -> Evict any key using approximated LFU. # volatile-random -> Remove a random key among the ones with an expire set. # allkeys-random -> Remove a random key, any key. # volatile-ttl -> Remove the key with the nearest expire time (minor TTL) # noeviction -> Don't evict anything, just return an error on write operations.
# LRU means Least Recently Used # LRU 即 最长时间未被使用 # LFU means Least Frequently Used # LFU 即 最不常被使用的,也就是使用使用频率最小的 # # Both LRU, LFU and volatile-ttl are implemented using approximated # randomized algorithms. # # Note: with any of the above policies, Redis will return an error on write # ? ? ? operations, when there are no suitable keys for eviction. # # ? ? ? 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 # # The default is:
# 内存容量超过maxmemory后的处理策略。 # 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:不移除任何key,只是返回一个写错误。 # 上面的这些驱逐策略,如果redis没有合适的key驱逐,对于写命令,还是会返回错误。 # redis将不再接收写请求,只接收get请求。 # maxmemory-policy noeviction
# LRU, LFU and minimal TTL algorithms are not precise algorithms but approximated # algorithms (in order to save memory), so you can tune it for speed or # accuracy. For default Redis will check five keys and pick the one that was # used less recently, you can change the sample size using the following # configuration directive. # # The default of 5 produces good enough results. 10 Approximates very closely # true LRU but costs more CPU. 3 is faster but not very accurate. # lru检测的样本数。 # 使用lru或者ttl淘汰算法,从需要淘汰的列表中随机选择sample个key, # 将选出的所有key中闲置时间最长的key移除 # maxmemory-samples 5
# Starting from Redis 5, by default a replica will ignore its maxmemory setting # (unless it is promoted to master after a failover or manually). It means # that the eviction of keys will be just handled by the master, sending the # DEL commands to the replica as keys evict in the master side. # # This behavior ensures that masters and replicas stay consistent, and is usually # what you want, however if your replica is writable, or you want the replica to have # a different memory setting, and you are sure all the writes performed to the # replica are idempotent, then you may change this default (but be sure to understand # what you are doing). # # Note that since the replica by default does not evict, it may end using more # memory than the one set via maxmemory (there are certain buffers that may # be larger on the replica, or data structures may sometimes take more memory and so # forth). So make sure you monitor your replicas and make sure they have enough # memory to never hit a real out-of-memory condition before the master hits # the configured maxmemory setting.
# 是否忽略从节点的内存限制,默认yes # replica-ignore-maxmemory yes
############################# LAZY FREEING ####################################
# Redis has two primitives to delete keys. One is called DEL and is a blocking # deletion of the object. It means that the server stops processing new commands # in order to reclaim all the memory associated with an object in a synchronous # way. If the key deleted is associated with a small object, the time needed # in order to execute the DEL command is very small and comparable to most other # O(1) or O(log_N) commands in Redis. However if the key is associated with an # aggregated value containing millions of elements, the server can block for # a long time (even seconds) in order to complete the operation. # # For the above reasons Redis also offers non blocking deletion primitives # such as UNLINK (non blocking DEL) and the ASYNC option of FLUSHALL and # FLUSHDB commands, in order to reclaim memory in background. Those commands # are executed in constant time. Another thread will incrementally free the # object in the background as fast as possible. # # DEL, UNLINK and ASYNC option of FLUSHALL and FLUSHDB are user-controlled. # It's up to the design of the application to understand when it is a good # idea to use one or the other. However the Redis server sometimes has to # delete keys or flush the whole database as a side effect of other operations. # Specifically Redis deletes objects independently of a user call in the # following scenarios: # # 1) On eviction, because of the maxmemory and maxmemory policy configurations, # ? ?in order to make room for new data, without going over the specified # ? ?memory limit. # 2) Because of expire: when a key with an associated time to live (see the # ? ?EXPIRE command) must be deleted from memory. # 3) Because of a side effect of a command that stores data on a key that may # ? ?already exist. For example the RENAME command may delete the old key # ? ?content when it is replaced with another one. Similarly SUNIONSTORE # ? ?or SORT with STORE option may delete existing keys. The SET command # ? ?itself removes any old content of the specified key in order to replace # ? ?it with the specified string. # 4) During replication, when a replica performs a full resynchronization with # ? ?its master, the content of the whole database is removed in order to # ? ?load the RDB file just transferred. # # In all the above cases the default is to delete objects in a blocking way, # like if DEL was called. However you can configure each case specifically # in order to instead release memory in a non-blocking way like if UNLINK # was called, using the following configuration directives:
# lazy free可译为惰性删除或延迟释放; # 当删除键的时候,redis提供异步延时释放key内存的功能, # 把key释放操作放在bio(Background I/O)单独的子线程处理中, # 减少删除big key对redis主线程的阻塞, # 有效地避免删除big key带来的性能和可用性问题。
# Redis是single-thread程序(除少量的bio任务),当运行一个耗时较大的请求时, # 会导致所有请求排队等待redis不能响应其他请求,引起性能问题,甚至集群发生故障切换。 # 而redis删除大的集合键时,就属于这类比较耗时的请求。 # 一般情况下,删除一个100万个元素的集合键,耗时约1000ms左右,而在此期间其他的请求将会被阻塞
# flushall 命令,同步清理数据 # flushall asyn 命令,异步清理数据
# lazy free的使用分为2类: # 第一类是与DEL命令对应的主动删除 # 第二类是过期key删除、maxmemory key驱逐淘汰删除。
# lazy free应用于被动删除中,目前有4种场景,每种场景对应一个配置参数; 默认都是关闭
# redis内存使用达到maxmeory时需要淘汰一些key,此时是否采用异步删除 lazyfree-lazy-eviction no
# 删除过期的key时,是否采用异步方式 lazyfree-lazy-expire no
# 针对有些指令在处理已存在的键时,会带有一个隐式的DEL键的操作。 # 如rename命令,当目标键已存在,redis会先删除目标键, # 如果这些目标键是一个big key,那就会发生阻塞,导致性能问题。? # 此设置就是解决这类问题,建议可开启 lazyfree-lazy-server-del no
# 针对slave进行全量数据同步,slave在加载master的RDB文件前,会运行flushall来清理自己的数据场景。 # 此设置决定是否采用异步flush机制。 # 如果内存变动不大,建议开启。 # 可减少全量同步耗时,从而减少主库因输出缓冲区爆涨引起的内存使用增长。 replica-lazy-flush no
############################## APPEND ONLY MODE ###############################
# By default Redis asynchronously dumps the dataset on disk. This mode is # good enough in many applications, but an issue with the Redis process or # a power outage may result into a few minutes of writes lost (depending on # the configured save points). # # The Append Only File is an alternative persistence mode that provides # much better durability. For instance using the default data fsync policy # (see later in the config file) Redis can lose just one second of writes in a # dramatic event like a server power outage, or a single write if something # wrong with the Redis process itself happens, but the operating system is # still running correctly. # # AOF and RDB persistence can be enabled at the same time without problems. # If the AOF is enabled on startup Redis will load the AOF, that is the file # with the better durability guarantees. # # Please check http://redis.io/topics/persistence for more information. # 是以Append Only方式记录写操作,默认no # 它的出现是为了弥补RDB的不足(数据的不一致性), # 所以它采用日志的形式来记录每个写操作,并追加到文件中。 # Redis 重启时会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作 # 默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。 # 但是redis如果中途宕机,根据前面配置的save策略来进行持久化,可能会导致有几分钟的数据丢失 # Append Only File则是另一种持久化方式,它可以提供更好的持久化特性。 # Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次重启Redis时都会先读取这个文件 # yes 表示开启aof方式 appendonly no
# The name of the append only file (default: "appendonly.aof") # 指定aof文件的名称 appendfilename "appendonly.aof"
# The fsync() call tells the Operating System to actually write data on disk # instead of waiting for more data in the output buffer. Some OS will really flush # data on disk, some other OS will just try to do it ASAP. # # Redis supports three different modes: # # no: don't fsync, just let the OS flush the data when it wants. Faster. # always: fsync after every write to the append only log. Slow, Safest. # everysec: fsync only one time every second. Compromise. # # The default is "everysec", as that's usually the right compromise between # speed and data safety. It's up to you to understand if you can relax this to # "no" that will let the operating system flush the output buffer when # it wants, for better performances (but if you can live with the idea of # some data loss consider the default persistence mode that's snapshotting), # or on the contrary, use "always" that's very slow but a bit safer than # everysec. # # More details please check the following article: # http://antirez.com/post/redis-persistence-demystified.html # # If unsure, use "everysec".
# aof持久化策略的配置 # no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快 # always表示每次写入都执行fsync,以保证数据同步到磁盘 # everysec表示每秒执行一次fsync,可能会导致丢失这1s数据 # appendfsync always appendfsync everysec # appendfsync no
# When the AOF fsync policy is set to always or everysec, and a background # saving process (a background save or AOF log background rewriting) is # performing a lot of I/O against the disk, in some Linux configurations # Redis may block too long on the fsync() call. Note that there is no fix for # this currently, as even performing fsync in a different thread will block # our synchronous write(2) call. # # In order to mitigate this problem it's possible to use the following option # that will prevent fsync() from being called in the main process while a # BGSAVE or BGREWRITEAOF is in progress. # # This means that while another child is saving, the durability of Redis is # the same as "appendfsync none". In practical terms, this means that it is # possible to lose up to 30 seconds of log in the worst scenario (with the # default Linux settings). # # If you have latency problems turn this to "yes". Otherwise leave it as # "no" that is the safest pick from the point of view of durability. # bgrewriteaof机制,在一个子进程中进行aof的重写, # 从而不阻塞主进程对其余命令的处理,同时解决了aof文件过大问题。 # 现在问题出现了,同时在执行bgrewriteaof操作和主进程写aof文件的操作, # 两者都会操作磁盘,而bgrewriteaof往往会涉及大量磁盘操作, # 这样就会造成主进程在写aof文件的时候出现阻塞的情形, # 现在no-appendfsync-on-rewrite参数出场了。 # 如果该参数设置为no,是最安全的方式,不会丢失数据,但是要忍受阻塞的问题。 # 如果设置为yes呢?这就相当于将appendfsync设置为no, # 这说明并没有执行磁盘操作,只是写入了缓冲区, # 因此这样并不会造成阻塞(因为没有竞争磁盘), # 但是如果这个时候redis挂掉,就会丢失数据。 # 丢失多少数据呢? # 在linux的操作系统的默认设置下,最多会丢失30s的数据。
因此,如果应用系统无法忍受延迟,而可以容忍少量的数据丢失,则设置为yes。如果应用系统无法忍受数据丢失,则设置为no。 no-appendfsync-on-rewrite no
# Automatic rewrite of the append only file. # Redis is able to automatically rewrite the log file implicitly calling # BGREWRITEAOF when the AOF log size grows by the specified percentage. # # This is how it works: Redis remembers the size of the AOF file after the # latest rewrite (if no rewrite has happened since the restart, the size of # the AOF at startup is used). # # This base size is compared to the current size. If the current size is # bigger than the specified percentage, the rewrite is triggered. Also # you need to specify a minimal size for the AOF file to be rewritten, this # is useful to avoid rewriting the AOF file even if the percentage increase # is reached but it is still pretty small. # # Specify a percentage of zero in order to disable the automatic AOF # rewrite feature.
# aof文件增长比例,指当前aof文件比上次重写的增长比例大小。 # aof重写即在aof文件在一定大小之后,重新将整个内存写到aof文件当中, # 以反映最新的状态(相当于bgsave)。 # 这样就避免了,aof文件过大而实际内存数据小的问题(频繁修改数据问题) auto-aof-rewrite-percentage 100 # aof文件重写最小的文件大小,即最开始aof文件必须要达到这个文件时才触发, # 后面的每次重写就不会根据这个变量了(根据上一次重写完成之后的大小). # 此变量仅初始化启动redis有效.如果是redis恢复时,则lastSize等于初始aof文件大小 auto-aof-rewrite-min-size 64mb
# An AOF file may be found to be truncated at the end during the Redis # startup process, when the AOF data gets loaded back into memory. # This may happen when the system where Redis is running # crashes, especially when an ext4 filesystem is mounted without the # data=ordered option (however this can't happen when Redis itself # crashes or aborts but the operating system still works correctly). # # Redis can either exit with an error when this happens, or load as much # data as possible (the default now) and start if the AOF file is found # to be truncated at the end. The following option controls this behavior. # # If aof-load-truncated is set to yes, a truncated AOF file is loaded and # the Redis server starts emitting a log to inform the user of the event. # Otherwise if the option is set to no, the server aborts with an error # and refuses to start. When the option is set to no, the user requires # to fix the AOF file using the "redis-check-aof" utility before to restart # the server. # # Note that if the AOF file will be found to be corrupted in the middle # the server will still exit with an error. This option only applies when # Redis will try to read more data from the AOF file but not enough bytes # will be found. # 指redis在恢复时,会忽略最后一条可能存在问题的指令。 # 默认值yes。即在aof写入时,可能存在指令写错的问题(突然断电,写了一半), # 这种情况下,yes会log并继续,而no会直接恢复失败. aof-load-truncated yes
# When rewriting the AOF file, Redis is able to use an RDB preamble in the # AOF file for faster rewrites and recoveries. When this option is turned # on the rewritten AOF file is composed of two different stanzas: # # ? [RDB file][AOF tail] # # When loading Redis recognizes that the AOF file starts with the "REDIS" # string and loads the prefixed RDB file, and continues loading the AOF # tail. # 是否开启混合持久化 aof-use-rdb-preamble yes
# 混合持久化同样也是通过bgrewriteaof完成的, # 不同的是当开启混合持久化时,fork出的子进程先将共享的内存副本全量的以RDB方式写入aof文件, # 然后在将重写缓冲区的增量命令以AOF方式写入到文件,写入完成后通知主进程更新统计信息, # 并将新的含有RDB格式和AOF格式的AOF文件替换旧的的AOF文件。 # 简单的说:新的AOF文件前半段是RDB格式的全量数据后半段是AOF格式的增量数据
# RDB优点: # RDB是一个非常紧凑(compact)的文件,体积小,因此在传输速度上比较快,因此适合灾难恢复。 # RDB可以最大化Redis?的性能:父进程在保存RDB文件时唯一要做的就是fork出一个子进程, # 然后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘I/O操作。 # RDB在恢复大数据集时的速度比AOF的恢复速度要快。
# RDB缺点: # RDB是一个快照过程,无法完整的保存所以数据,尤其在数据量比较大时候,一旦出现故障丢失的数据将更多。 # 当redis中数据集比较大时候,RDB由于RDB方式需要对数据进行完成拷贝并生成快照文件,fork的子进程会耗CPU, # 并且数据越大,RDB快照生成会越耗时。 # RDB文件是特定的格式,阅读性差,由于格式固定,可能存在不兼容情况。
# AOF优点: # 数据更完整,秒级数据丢失(取决于设置fsync策略)。 # 兼容性较高,由于是基于redis通讯协议而形成的命令追加方式, # 无论何种版本的redis都兼容,再者aof文件是明文的,可阅读性较好。
# AOF缺点: # 数据文件体积较大,即使有重写机制,但是在相同的数据集情况下,AOF文件通常比RDB文件大。 # 相对RDB方式,AOF速度慢于RDB,并且在数据量大时候,恢复速度AOF速度也是慢于RDB。 # 由于频繁地将命令同步到文件中,AOF持久化对性能的影响相对RDB较大,但是对于我们来说是可以接受的。
# 混合持久化的优点: # 混合持久化结合了RDB持久化 和 AOF 持久化的优点, 由于绝大部分都是RDB格式,加载速度快, # 同时结合AOF,增量的数据以AOF方式保存了,数据更少的丢失。
# 混合持久化的缺点: # 兼容性差,一旦开启了混合持久化,在4.0之前版本都不识别该aof文件, # 同时由于前部分是RDB格式,阅读性较差
# 引用:Redis数据持久化之RDB-AOF混合方式
################################ LUA SCRIPTING ?###############################
# Max execution time of a Lua script in milliseconds. # # If the maximum execution time is reached Redis will log that a script is # still in execution after the maximum allowed time and will start to # reply to queries with an error. # # When a long running script exceeds the maximum execution time only the # SCRIPT KILL and SHUTDOWN NOSAVE commands are available. The first can be # used to stop a script that did not yet called write commands. The second # is the only way to shut down the server in the case a write command was # already issued by the script but the user doesn't want to wait for the natural # termination of the script. # # Set it to 0 or a negative value for unlimited execution without warnings. # 设置lua脚本的最大执行时间 lua-time-limit 5000
# Redis 的指令执行本身是单线程的,这个线程还要执行客户端的Lua 脚本, # 如果Lua脚本执行超时或者陷入了死循环,是不是没有办法为客户端提供服务了呢?
# 为了防止某个脚本执行时间过长导致Redis 无法提供服务,? # Redis 提供了lua-time-limit 参数限制脚本的最长运行时间,默认为5000毫秒
# 当脚本运行时间超过这一限制后, # Redis 将开始接受其他命令但不会执行(以确保脚本的原子性,因为此时脚本并没有被终止), # 而是会返回“BUSY”错误
# Redis 提供了一个script kill 的命令来中止脚本的执行, # 但是如果当前执行的Lua 脚本对Redis 的数据进行了修改(SET、DEL 等), # 那么通过script kill 命令是不能终止脚本运行的。 # 因为要保证脚本运行的原子性,如果脚本执行了一部分终止,那就违背了脚本原子性的要求。 # 最终要保证脚本要么都执行,要么都不执行。 # 遇到这种情况,只能通过shutdown nosave 命令来强行终止redis? # shutdown nosave 和shutdown 的区别在于shutdown nosave 不会进行持久化操作, # 意味着发生在上一次快照后的数据库修改都会丢失。
# 总结:如果我们有一些特殊的需求,可以用Lua 来实现,但是要注意那些耗时的操作
# 参考:Redis中的Lua脚本超时
################################ REDIS CLUSTER ?###############################
# Normal Redis instances can't be part of a Redis Cluster; only nodes that are # started as cluster nodes can. In order to start a Redis instance as a # cluster node enable the cluster support uncommenting the following: # 是否启用集群模式 # 普通的Redis实例是不能作为Redis集群的一部分来使用的 # 只有作为一个集群节点来启动时才可以。 # cluster-enabled yes
# Every cluster node has a cluster configuration file. This file is not # intended to be edited by hand. It is created and updated by Redis nodes. # Every Redis Cluster node requires a different cluster configuration file. # Make sure that instances running in the same system do not have # overlapping cluster configuration file names. # 每一个集群节点都有一个集群配置文件, # 这个文件不需要手动配置, # 每个Redis集群节点需要一个单独的配置文件 # cluster-config-file nodes-6379.conf
# Cluster node timeout is the amount of milliseconds a node must be unreachable # for it to be considered in failure state. # Most other internal time limits are multiple of the node timeout. # 集群节点互连的超时阈值,单位:毫秒 # cluster-node-timeout 15000
# A replica of a failing master will avoid to start a failover if its data # looks too old. # # There is no simple way for a replica to actually have an exact measure of # its "data age", so the following two checks are performed: # # 1) If there are multiple replicas able to failover, they exchange messages # ? ?in order to try to give an advantage to the replica with the best # ? ?replication offset (more data from the master processed). # ? ?Replicas will try to get their rank by offset, and apply to the start # ? ?of the failover a delay proportional to their rank. # # 2) Every single replica computes the time of the last interaction with # ? ?its master. This can be the last ping or command received (if the master # ? ?is still in the "connected" state), or the time that elapsed since the # ? ?disconnection with the master (if the replication link is currently down). # ? ?If the last interaction is too old, the replica will not try to failover # ? ?at all. # # The point "2" can be tuned by user. Specifically a replica will not perform # the failover if, since the last interaction with the master, the time # elapsed is greater than: # # ? (node-timeout * replica-validity-factor) + repl-ping-replica-period # # So for example if node-timeout is 30 seconds, and the replica-validity-factor # is 10, and assuming a default repl-ping-replica-period of 10 seconds, the # replica will not try to failover if it was not able to talk with the master # for longer than 310 seconds. # # A large replica-validity-factor may allow replicas with too old data to failover # a master, while a too small value may prevent the cluster from being able to # elect a replica at all. # # For maximum availability, it is possible to set the replica-validity-factor # to a value of 0, which means, that replicas will always try to failover the # master regardless of the last time they interacted with the master. # (However they'll always try to apply a delay proportional to their # offset rank). # # Zero is the only value able to guarantee that when all the partitions heal # the cluster will always be able to continue. # 在进行故障转移的时候,全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间了, # 导致数据过于陈旧,这样的slave不应该被提升为master。该参数就是用来判断slave节点与master断线的时间是否过长。 # 判断方法是: # ?比较slave断开连接的时间和(node-timeout * slave-validity-factor) + repl-ping-slave-period # ?如果节点超时时间为三十秒, 并且slave-validity-factor为10, # ?假设默认的repl-ping-slave-period是10秒,即如果超过310秒slave将不会尝试进行故障转移 # cluster-replica-validity-factor 10
# Cluster replicas are able to migrate to orphaned masters, that are masters # that are left without working replicas. This improves the cluster ability # to resist to failures as otherwise an orphaned master can't be failed over # in case of failure if it has no working replicas. # # Replicas migrate to orphaned masters only if there are still at least a # given number of other working replicas for their old master. This number # is the "migration barrier". A migration barrier of 1 means that a replica # will migrate only if there is at least 1 other working replica for its master # and so forth. It usually reflects the number of replicas you want for every # master in your cluster. # # Default is 1 (replicas migrate only if their masters remain with at least # one replica). To disable migration just set it to a very large value. # A value of 0 can be set but is useful only for debugging and dangerous # in production.
# cluster-migration-barrier属性可以保证redis集群中不会出现裸奔的主节点(这个主节点没有对应的从节点), # 当某个主节点的从节点挂掉裸奔后,会从其他富余的主节点分配一个从节点过来,确保每个主节点都有至少一个从节点, # 不至于因为主节点挂掉而没有相应从节点替换为主节点导致集群崩溃不可用。 # 但是前提是这个富余的主节点在分走一个从节点后其余正常可用的节点数 # 必须不少于cluster-migration-barrier指定的个数, # 否则这个富余的主节点是不会将自己的从节点分配出去的 # cluster-migration-barrier 1
# By default Redis Cluster nodes stop accepting queries if they detect there # is at least an hash slot uncovered (no available node is serving it). # This way if the cluster is partially down (for example a range of hash slots # are no longer covered) all the cluster becomes, eventually, unavailable. # It automatically returns available as soon as all the slots are covered again. # # However sometimes you want the subset of the cluster which is working, # to continue to accept queries for the part of the key space that is still # covered. In order to do so, just set the cluster-require-full-coverage # option to no. # # 集群是否只在完整的情况下才对外提供服务 # 比如搭建一个3主6从的集群架构, # 那3个master 平分16384个slot,每个master的小集群 负责 1/3的slot,对应一部分数据 # 如果这3个小集群中,任何一个(1主2从) 挂了,你这个集群对外可提供的数据只有2/3了, # 整个集群是不完整的, 当cluster-require-full-coverage设置为yes时,整个集群是不会对外提供服务的
# cluster-require-full-coverage yes
# This option, when set to yes, prevents replicas from trying to failover its # master during master failures. However the master can still perform a # manual failover, if forced to do so. # # This is useful in different scenarios, especially in the case of multiple # data center operations, where we want one side to never be promoted if not # in the case of a total DC failure.
# 当设置为yes时,当主节点故障时,主节点的副本将不会进行故障切换。 # 尽管如此,你依然可以手动进行强制性地故障切换 # 这种机制在某些情况下是有用的,尤其是有多个数据中心的情况下
# cluster-replica-no-failover no
# In order to setup your cluster make sure to read the documentation # available at http://redis.io web site.
########################## CLUSTER DOCKER/NAT support ?########################
# In certain deployments, Redis Cluster nodes address discovery fails, because # addresses are NAT-ted or because ports are forwarded (the typical case is # Docker and other containers).
# 当你以其他的方式部署redis服务时,比如用Docker部署redis, # 你可能会找不到Redis Cluster的端口,这是因为存在端口转发 # 此时你需要指定公共的端口
# In order to make Redis Cluster working in such environments, a static # configuration where each node knows its public address is needed. The # following two options are used for this scope, and are: # # * cluster-announce-ip # * cluster-announce-port # * cluster-announce-bus-port # # Each instruct the node about its address, client port, and cluster message # bus port. The information is then published in the header of the bus packets # so that other nodes will be able to correctly map the address of the node # publishing the information. # # If the above options are not used, the normal Redis Cluster auto-detection # will be used instead. # # Note that when remapped, the bus port may not be at the fixed offset of # clients port + 10000, so you can specify any port and bus-port depending # on how they get remapped. If the bus-port is not set, a fixed offset of # 10000 will be used as usually. # # Example: # 集群公告IP # 集群公告端口 # 集群公告总线端口 # # cluster-announce-ip 10.1.1.5 # cluster-announce-port 6379 # cluster-announce-bus-port 6380
################################## SLOW LOG ###################################
# The Redis Slow Log is a system to log queries that exceeded a specified # execution time. The execution time does not include the I/O operations # like talking with the client, sending the reply and so forth, # but just the time needed to actually execute the command (this is the only # stage of command execution where the thread is blocked and can not serve # other requests in the meantime). # # You can configure the slow log with two parameters: one tells Redis # what is the execution time, in microseconds, to exceed in order for the # command to get logged, and the other parameter is the length of the # slow log. When a new command is logged the oldest one is removed from the # queue of logged commands.
# The following time is expressed in microseconds, so 1000000 is equivalent # to one second. Note that a negative number disables the slow log, while # a value of zero forces the logging of every command.
# slow log是用来记录redis运行中执行比较慢的命令耗时 # 当命令的执行超过了指定时间,就记录在slow log中,slog log保存在内存中,所以没有IO操作 # 执行时间比slowlog-log-slower-than大的请求记录到slowlog里面,单位是微秒,所以1000000就是1秒 # 注意,负数时间会禁用慢查询日志,而0则会强制记录所有命令 slowlog-log-slower-than 10000
# There is no limit to this length. Just be aware that it will consume memory. # You can reclaim memory used by the slow log with SLOWLOG RESET.
# 慢查询日志长度 # 当一个新的命令被写进日志的时候,最老的那个记录会被删掉 # 这个长度没有限制,只要有足够的内存就行 # 你可以通过 SLOWLOG RESET 命令来释放内存 slowlog-max-len 128
################################ LATENCY MONITOR ##############################
# The Redis latency monitoring subsystem samples different operations # at runtime in order to collect data related to possible sources of # latency of a Redis instance. # # Via the LATENCY command this information is available to the user that can # print graphs and obtain reports. # # The system only logs operations that were performed in a time equal or # greater than the amount of milliseconds specified via the # latency-monitor-threshold configuration directive. When its value is set # to zero, the latency monitor is turned off. # # By default latency monitoring is disabled since it is mostly not needed # if you don't have latency issues, and collecting data has a performance # impact, that while very small, can be measured under big load. Latency # monitoring can easily be enabled at runtime using the command # "CONFIG SET latency-monitor-threshold <milliseconds>" if needed. # 延迟监控功能是用来监控redis中执行比较缓慢的一些操作 # 用LATENCY打印redis实例在跑命令时的耗时图表 # 只记录大于等于下边设置的值的操作 # 0的话,就是关闭监视 # 默认延迟监控功能是关闭的,如果你需要打开,也可以通过CONFIG SET命令动态设置 latency-monitor-threshold 0
############################# EVENT NOTIFICATION ##############################
# Redis can notify Pub/Sub clients about events happening in the key space. # This feature is documented at http://redis.io/topics/notifications # # For instance if keyspace events notification is enabled, and a client # performs a DEL operation on key "foo" stored in the Database 0, two # messages will be published via Pub/Sub: # # PUBLISH __keyspace@0__:foo del # PUBLISH __keyevent@0__:del foo # # It is possible to select the events that Redis will notify among a set # of classes. Every class is identified by a single character: # # ?K ? ? Keyspace events, published with __keyspace@<db>__ prefix. # ?E ? ? Keyevent events, published with __keyevent@<db>__ prefix. # ?g ? ? Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ... # ?$ ? ? String commands # ?l ? ? List commands # ?s ? ? Set commands # ?h ? ? Hash commands # ?z ? ? Sorted set commands # ?x ? ? Expired events (events generated every time a key expires) # ?e ? ? Evicted events (events generated when a key is evicted for maxmemory) # ?A ? ? Alias for g$lshzxe, so that the "AKE" string means all the events. # # ?The "notify-keyspace-events" takes as argument a string that is composed # ?of zero or multiple characters. The empty string means that notifications # ?are disabled. # # ?Example: to enable list and generic events, from the point of view of the # ? ? ? ? ? event name, use: # # ?notify-keyspace-events Elg # # ?Example 2: to get the stream of the expired keys subscribing to channel # ? ? ? ? ? ? name __keyevent@0__:expired use: # # ?notify-keyspace-events Ex # # ?By default all notifications are disabled because most users don't need # ?this feature and the feature has some overhead. Note that if you don't # ?specify at least one of K or E, no events will be delivered.
# 键空间通知使得客户端可以通过订阅频道或模式,来接收那些以某种方式改动了 Redis 数据集的事件 # 因为开启键空间通知功能需要消耗一些 CPU ,所以在默认配置下,该功能处于关闭状态 # notify-keyspace-events 的参数可以是以下字符的任意组合,它指定了服务器该发送哪些类型的通知: # K 键空间通知,所有通知以 __keyspace@__ 为前缀 # E 键事件通知,所有通知以 __keyevent@__ 为前缀 # g DEL 、 EXPIRE 、 RENAME 等通用命令的通知 # $ 字符串命令的通知 # l 列表命令的通知 # s 集合命令的通知 # h 哈希命令的通知 # z 有序集合命令的通知 # x 过期事件:每当有过期键被删除时发送 # e 驱逐(evict)事件:每当有键因为 maxmemory 政策而被删除时发送 # A 参数 g$lshzxe 的别名,相当于ALL ? 所以AKE就表示所有的事件 # 输入的参数中至少要有一个 K 或者 E,否则的话,不管其余的参数是什么,都不会有任何通知被分发
notify-keyspace-events ""
############################### ADVANCED CONFIG ############################### # Redis的数据类型总共有5种 # 字符串(String)、列表(List)、哈希(Hash)、集合(Set)、有序集合(ZSet)
# ziplist编码的列表对象使用压缩列表作为底层实现, # ziplist 的优点是内存紧凑,访问效率高 # 缺点是更新效率低,并且数据量较大时,可能导致大量的内存复制。
# linkedlist编码的列表对象使用双端链表作为底层实现, # linkedlist 的优点是节点修改的效率高, # 但是需要额外的内存开销,并且节点较多时,会产生大量的内存碎片。
# 在 redis 3.2 之后,list 的底层实现变为快速列表 quicklist # 快速列表是 linkedlist 与 ziplist 的结合:? # quicklist 包含多个内存不连续的节点,但每个节点本身就是一个 ziplist # 参考:redis 压缩列表ziplist、quicklist
# 当列表(List)对象同时满足下面2个条件时,列表对象使用ziplist编码,否则使用linkedlist编码。 # 1、列表保存的元素数量小于list-max-ziplist-entries # 2、列表保存的所有元素成员的长度都小于config get list-max-ziplist-value # 在redis客户端: # config set list-max-ziplist-value 4 ?设定值 # config get list-max-ziplist-entries 查询你设定的值 # object encoding strs ?查看列表strs的编码
# Hashes are encoded using a memory efficient data structure when they have a # small number of entries, and the biggest entry does not exceed a given # threshold. These thresholds can be configured using the following directives.
# Hash(哈希)保存的元素数量小于512且列表保存的所有元素的长度都小于64时采用ziplist编码,否则采用hash编码 hash-max-ziplist-entries 512 hash-max-ziplist-value 64
# Lists are also encoded in a special way to save a lot of space. # The number of entries allowed per internal list node can be specified # as a fixed maximum size or a maximum number of elements. # For a fixed maximum size, use -5 through -1, meaning: # -5: max size: 64 Kb ?<-- not recommended for normal workloads # -4: max size: 32 Kb ?<-- not recommended # -3: max size: 16 Kb ?<-- probably not recommended # -2: max size: 8 Kb ? <-- good # -1: max size: 4 Kb ? <-- good # Positive numbers mean store up to _exactly_ that number of elements # per list node. # The highest performing option is usually -2 (8 Kb size) or -1 (4 Kb size), # but if your use case is unique, adjust the settings as necessary.
# 列表允许以一种特殊的方式进行编码,从而节省大量空间 # 你可以指定每个内部列表允许的最大条目数 # 当列表的size不超过8kb时采用ziplist编码,否则采用linkedlist编码 list-max-ziplist-size -2
# Lists may also be compressed. # Compress depth is the number of quicklist ziplist nodes from *each* side of # the list to *exclude* from compression. ?The head and tail of the list # are always uncompressed for fast push/pop operations. ?Settings are: # 0: disable all list compression # 1: depth 1 means "don't start compressing until after 1 node into the list, # ? ?going from either the head or tail" # ? ?So: [head]->node->node->...->node->[tail] # ? ?[head], [tail] will always be uncompressed; inner nodes will compress. # 2: [head]->[next]->node->node->...->node->[prev]->[tail] # ? ?2 here means: don't compress head or head->next or tail->prev or tail, # ? ?but compress all nodes between them. # 3: [head]->[next]->[next]->node->node->...->node->[prev]->[prev]->[tail] # etc.
# quicklist的数据结构有两大特征: # 无缝切换:结合了 linkedlist 与 ziplist 的优点,无需在两种结构之间进行切换 # 中间压缩:作为队列使用的场景下,list 中间的数据被访问的频率比较低,可以选择进行压缩以减少内存占用 # 你可以设置数据压缩的深度 # 0 表示禁用压缩 # 1 表示只有头尾不压缩 [head]->node->node->...->node->[tail] # 2 表示 [head]->[next]->node->node->...->node->[prev]->[tail] # 3 表示 [head]->[next]->[next]->node->node->...->node->[prev]->[prev]->[tail] # 依次类推 list-compress-depth 0
# Sets have a special encoding in just one case: when a set is composed # of just strings that happen to be integers in radix 10 in the range # of 64 bit signed integers. # The following configuration setting sets the limit in the size of the # set in order to use this special memory saving encoding.
# Set集合的编码类型有两种,分别是intset和hashtable # intset编码作为集合(set)类型编码的一种,内部表现为存储有序,不重复的整数集。 # 当集合只包含整数且长度不超过set-max-intset-entries配置时才会采用intset编码进行存储 # 参考:Redis的内存优化 # 通常,intset编码占用的内存空间约为hashtable编码的十分之一 set-max-intset-entries 512
# Similarly to hashes and lists, sorted sets are also specially encoded in # order to save a lot of space. This encoding is only used when the length and # elements of a sorted set are below the following limits: # 有序集合(ZSet)保存的元素数量小于128且集合保存的所有元素的长度都小于64时采用ziplist编码 zset-max-ziplist-entries 128 zset-max-ziplist-value 64
# HyperLogLog sparse representation bytes limit. The limit includes the # 16 bytes header. When an HyperLogLog using the sparse representation crosses # this limit, it is converted into the dense representation. # # A value greater than 16000 is totally useless, since at that point the # dense representation is more memory efficient. # # The suggested value is ~ 3000 in order to have the benefits of # the space efficient encoding without slowing down too much PFADD, # which is O(N) with the sparse encoding. The value can be raised to # ~ 10000 when CPU is not a concern, but space is, and the data set is # composed of many HyperLogLogs with cardinality in the 0 - 15000 range. # HyperLogLog 稀疏模式的字节限制,包括了 16 字节的头,默认值为 3000 # 当超出这个限制后 HyperLogLog 将从稀疏模式转为稠密模式 # 不建议将此值设置为超过16000,因为超过16000时使用稠密模式更省空间 hll-sparse-max-bytes 3000
# Streams macro node max size / items. The stream data structure is a radix # tree of big nodes that encode multiple items inside. Using this configuration # it is possible to configure how big a single node can be in bytes, and the # maximum number of items it may contain before switching to a new node when # appending new stream entries. If any of the following settings are set to # zero, the limit is ignored, so for instance it is possible to set just a # max entires limit by setting max-bytes to 0 and max-entries to the desired # value. # 设置stream单个节点的最大大小和最多能保存多少个元素 stream-node-max-bytes 4096 stream-node-max-entries 100
# Active rehashing uses 1 millisecond every 100 milliseconds of CPU time in # order to help rehashing the main Redis hash table (the one mapping top-level # keys to values). The hash table implementation Redis uses (see dict.c) # performs a lazy rehashing: the more operation you run into a hash table # that is rehashing, the more rehashing "steps" are performed, so if the # server is idle the rehashing is never complete and some more memory is used # by the hash table. # # The default is to use this millisecond 10 times every second in order to # actively rehash the main dictionaries, freeing memory when possible. # # If unsure: # use "activerehashing no" if you have hard latency requirements and it is # not a good thing in your environment that Redis can reply from time to time # to queries with 2 milliseconds delay. # # use "activerehashing yes" if you don't have such hard requirements but # want to free memory asap when possible. # 当启用这个功能后,每100毫秒的CPU时间中将有1毫秒用于对Redis的主hash表进行rehash操作 # Redis 的哈希表采用的 rehash 策略是一个惰性策略: # 如果你对hash table的操作越多,那么rehash的次数就越多 # 如果你从不对hash table 进行操作,那就不会发生rehash,这时的hash表可能会占用更多内存 # 默认情况下会在每1秒内会用 10 毫秒来对主哈希表进行 rehash # 如果你要求Redis低延迟、快速反应,就设置为 no , # 否则就可以设置为yes,这样可以更及时地释放空闲的内存 activerehashing yes
# The client output buffer limits can be used to force disconnection of clients # that are not reading data from the server fast enough for some reason (a # common reason is that a Pub/Sub client can't consume messages as fast as the # publisher can produce them). # # The limit can be set differently for the three different classes of clients: # # normal -> normal clients including MONITOR clients # replica ?-> replica clients # pubsub -> clients subscribed to at least one pubsub channel or pattern # # The syntax of every client-output-buffer-limit directive is the following: # # client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds> # # A client is immediately disconnected once the hard limit is reached, or if # the soft limit is reached and remains reached for the specified number of # seconds (continuously). # So for instance if the hard limit is 32 megabytes and the soft limit is # 16 megabytes / 10 seconds, the client will get disconnected immediately # if the size of the output buffers reach 32 megabytes, but will also get # disconnected if the client reaches 16 megabytes and continuously overcomes # the limit for 10 seconds. # # By default normal clients are not limited because they don't receive data # without asking (in a push way), but just after a request, so only # asynchronous clients may create a scenario where data is requested faster # than it can read. # # Instead there is a default limit for pubsub and replica clients, since # subscribers and replicas receive data in a push fashion. # # Both the hard or the soft limit can be disabled by setting them to zero.
# 客户端输出缓冲区限制可用于强制断开因为某些原因从服务器读取数据的速度不够快的客户端? # (一个常见的原因是 Pub/Sub 客户端处理发布者的消息不够快) # 大致可以将所有客户端分为下面三种类型: # normal ?普通客户端,包括 MONITOR 客户端 # replica ?redis集群的从节点slave # pubsub ?发布/订阅模式的客户端 # client-output-buffer-limit 选项的语法为: # client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds> # 当一个客户端到达 hard limit 后会马上被断开,或者在到达 soft limit 并持续 soft seconds 秒后会被断开 # 默认情况下,普通客户端不会有限制,因为除非主动请求否则他们不会收到信息,? # 只有异步的客户端才可能发生发送请求的速度比读取响应的速度快的情况 # 默认情况下 pubsub 和 replica 客户端会有默认的限制, # 因为这些客户端是以 Redis 服务端 push 的方式接收数据的。 # soft limit 或者 hard limit 都可以设置为 0,这表示不启用此限制 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 buffers accumulate new commands. They are limited to a fixed # amount by default in order to avoid that a protocol desynchronization (for # instance due to a bug in the client) will lead to unbound memory usage in # the query buffer. However you can configure it here if you have very special # needs, such us huge multi/exec requests or alike. # 对于Redis服务器的输出(也就是命令的返回值)来说,其大小通常是不可控制的。 # 有可能一个简单的命令,能够产生体积庞大的返回数据。 # 另外也有可能因为执行了太多命令,导致产生返回数据的速率超过了往客户端发送的速率, # 这也会使服务器堆积大量消息,从而导致输出缓冲区越来越大,占用过多内存,甚至导致系统崩溃。 # client-query-buffer-limit 1gb
# In the Redis protocol, bulk requests, that are, elements representing single # strings, are normally limited ot 512 mb. However you can change this limit # here. # 在 Redis 协议中,批量请求通常限制在 512 mb 内,可以通过修改 proto-max-bulk-len 选项改变这个限制 # proto-max-bulk-len 512mb
# Redis calls an internal function to perform many background tasks, like # closing connections of clients in timeout, purging expired keys that are # never requested, and so forth. # # Not all tasks are performed with the same frequency, but Redis checks for # tasks to perform according to the specified "hz" value. # # By default "hz" is set to 10. Raising the value will use more CPU when # Redis is idle, but at the same time will make Redis more responsive when # there are many keys expiring at the same time, and timeouts may be # handled with more precision. # # The range is between 1 and 500, however a value over 100 is usually not # a good idea. Most users should use the default of 10 and raise this up to # 100 only in environments where very low latency is required.
# Redis会在后台处理一些任务,比如断开超时的连接、清理过期的key等等 # hz 的值就是Redis执行这些后台任务的频次 # hz默认为10,如果提高这个值,在Redis空闲时会占用更多CPU, # 但是另一方面,断开超时的连接、清理过期的key也会更加及时 # hz值的范围在1到500之间,但是不建议超过100 # 一般来说,普通用户设置为默认的10已经够用了, # 除非你需要低延迟的环境,可以适当调高一点 hz 10
# Normally it is useful to have an HZ value which is proportional to the # number of clients connected. This is useful in order, for instance, to # avoid too many clients are processed for each background task invocation # in order to avoid latency spikes. # # Since the default HZ value by default is conservatively set to 10, Redis # offers, and enables by default, the ability to use an adaptive HZ value # which will temporary raise when there are many connected clients. # # When dynamic HZ is enabled, the actual configured HZ will be used as # as a baseline, but multiples of the configured HZ value will be actually # used as needed once more clients are connected. In this way an idle # instance will use very little CPU time while a busy instance will be # more responsive. # Redis5.0版本新加入了dynamic-hz参数,可根据客户端连接数动态调整hz的值 # 从而实现Redis定期任务执行频率的自动调整 # 上面的hz参数用于指定Redis定期任务的执行频率,这些任务包括关闭超时的客户端连接、主动清除过期key等。 # 当定期任务的执行频率为一个固定值时,容易产生以下问题: # 如果该值过小,在超时的客户端连接数较多或过期key较多等情况下, # 资源无法被及时整理回收,可能影响Redis服务的性能甚至导致服务崩溃。 # 如果该值过大,定期任务将会消耗过多的CPU资源,同样可能影响Redis服务的稳定性。 # 为了平衡Redis的CPU使用率和响应及时性,Redis 5.0版本新增了dynamic-hz参数 # 当dynamic-hz设置为yes时,上面设置的hz值将作为基线值, # 而Redis服务中的实际hz值会在基线值的基础上根据已连接到Redis的客户端数量自动调整, # 连接的客户端越多,实际hz值越高,Redis执行定期任务的频率就越高 dynamic-hz yes
# When a child rewrites the AOF file, if the following option is enabled # the file will be fsync-ed every 32 MB of data generated. This is useful # in order to commit the file to the disk more incrementally and avoid # big latency spikes.
# Redis数据持久化的方式有两种:RDB和AOF # AOF的工作流程: # 1. 所有的写入命令追加到aof_buf缓冲区中。 # 2. AOF会根据对应的策略向磁盘做同步操作。刷盘策略由appendfsync参数决定。 # 3. 定期对AOF文件进行重写。重写策略由auto-aof-rewrite-percentage,auto-aof-rewrite-min-size两个参数决定。
# 重写机制 # 为什么要重写? # 因为重写后可以加快节点启动时的加载时间。 # 重写后的文件为什么可以变小? # 1. 进程内超时的数据不用再写入到AOF文件中。 # 2. 存在删除命令。 # 3. 多条写命令可以合并为一个。
# 重写条件: # 1. 手动触发 # 直接调用bgrewriteaof命令。 # 2. 自动触发。 # 与auto-aof-rewrite-percentage,auto-aof-rewrite-min-size两个参数有关。 # 触发条件,aof_current_size > auto-aof-rewrite-min-size? # 并且 (aof_current_size ?- aof_base_size) / aof_base_size >= auto-aof-rewrite-percentage。 # 其中,aof_current_size是当前AOF文件大小,aof_base_size 是上一次重写后AOF文件的大小, # 这两部分的信息可从info Persistence处获取。
# AOF重写的流程: # 1. 执行AOF重写请求。 # 如果当前进程正在执行bgsave操作,重写命令会等待bgsave执行完后再执行。 # 2. 父进程执行fork创建子进程。 # 3. fork操作完成后,主进程会继续响应其它命令。 # 所有修改命令依然会写入到aof_buf中,并根据appendfsync策略持久化到AOF文件中。 # 4. 因fork操作运用的是写时复制技术,所以子进程只能共享fork操作时的内存数据, # 对于fork操作后,生成的数据,主进程会单独开辟一块aof_rewrite_buf保存。 # 5. 子进程根据内存快照,按照命令合并规则写入到新的AOF文件中。 # 每次批量写入磁盘的数据量由aof-rewrite-incremental-fsync参数控制, # 默认为32M,避免单次刷盘数据过多造成硬盘阻塞。 # 6. 新AOF文件写入完成后,子进程发送信号给父进程,父进程更新统计信息。 # 7. 父进程将aof_rewrite_buf(AOF重写缓冲区)的数据写入到新的AOF文件中。 # 8. 使用新AOF文件替换老文件,完成AOF重写。 # 实际上,当Redis节点执行完一个命令后,它会同时将这个写命令发送到AOF缓冲区和AOF重写缓冲区。
# 当子进程进行 AOF 的重写时,如果启用了 aof-rewrite-incremental-fsync,? # 子进程会每生成 32 MB 数据就进行一次 fsync 操作 aof-rewrite-incremental-fsync yes
# When redis saves RDB file, if the following option is enabled # the file will be fsync-ed every 32 MB of data generated. This is useful # in order to commit the file to the disk more incrementally and avoid # big latency spikes. # 当 Redis 保存 RDB 文件时,如果启用了 rdb-save-incremental-fsync 功能,? # Redis 会每生成 32 MB 数据就执行一次 fsync 操作 rdb-save-incremental-fsync yes
# LFU,全称Least Frequently Used,中文是 最不常用的,是Redis的一种数据回收算法 # 也就是最频繁被访问的数据将来最有可能被访问到
# Redis LFU eviction (see maxmemory setting) can be tuned. However it is a good # idea to start with the default settings and only change them after investigating # how to improve the performances and how the keys LFU change over time, which # is possible to inspect via the OBJECT FREQ command. #? # Redis LFU 回收策略(忘了的话可以回顾下 maxmemory 选项)是可以调整的。? # 只有当你知道如何提升性能以及LFU策略如何随时间而改变时你才可以去修改这两个值,否则建议你使用默认的设置 # 至于如何监测性能变化以及时间对LFU策略的影响,你可以用 OBJECT FREQ 命令。 # # There are two tunable parameters in the Redis LFU implementation: the # counter logarithm factor and the counter decay time. It is important to # understand what the two parameters mean before changing them. #? # LFU的具体实现目前有两个可调整的参数: # 计数器对数因子(couter logarithm factor) 和 计数器衰退时间(counter decay time)。? # # The LFU counter is just 8 bits per key, it's maximum value is 255, so Redis # uses a probabilistic increment with logarithmic behavior. Given the value # of the old counter, when a key is accessed, the counter is incremented in # this way: # # 1. A random number R between 0 and 1 is extracted. # 2. A probability P is calculated as 1/(old_value*lfu_log_factor+1). # 3. The counter is incremented only if R < P.
# # 每个 key 的 LFU 计数器只有 8 bits,也就是说最大值为 255 # 当一个 key 被访问后,计数器通过如下方式进行增加(假设计数器的旧值为 old_value): # 1. 取出一个 0 到 1 之间的随机数 R # 2. 通过如下方式算出概率 P: 1 / (old_value * lfu_log_factor + 1) # 3. 只有当 R < P 时,才增加计数器 # # The default lfu-log-factor is 10. This is a table of how the frequency # counter changes with a different number of accesses with different # logarithmic factors: #? # 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 ? ? ? ?| # +--------+------------+------------+------------+------------+------------+ # # NOTE: The above table was obtained by running the following commands: # 注意:上表是通过如下两个命令获取的 # # ? redis-benchmark -n 1000000 incr foo # ? redis-cli object freq foo # # NOTE 2: The counter initial value is 5 in order to give new objects a chance # to accumulate hits. # 注意:计数器的初始值是5 # # The counter decay time is the time, in minutes, that must elapse in order # for the key counter to be divided by two (or decremented if it has a value # less <= 10). # # The default value for the lfu-decay-time is 1. A Special value of 0 means to # decay the counter every time it happens to be scanned. # 默认的lfu-decay-time是1,0表示每次都对计数器进行衰减 # # lfu-log-factor 10 # lfu-decay-time 1
########################### ACTIVE DEFRAGMENTATION ####################### ########################### 在线碎片整理 ####################### # # WARNING THIS FEATURE IS EXPERIMENTAL. However it was stress tested # even in production and manually tested by multiple engineers for some # time. # # 警告:这个功能是实验性的。 # 当然此功能已经在包括生产环境在内的环境中通过压力测试,并且被多名工程师手工测过一段时间。 # # What is active defragmentation? # ------------------------------- # # Active (online) defragmentation allows a Redis server to compact the # spaces left between small allocations and deallocations of data in memory, # thus allowing to reclaim back memory. # # Fragmentation is a natural process that happens with every allocator (but # less so with Jemalloc, fortunately) and certain workloads. Normally a server # restart is needed in order to lower the fragmentation, or at least to flush # away all the data and create it again. However thanks to this feature # implemented by Oran Agra for Redis 4.0 this process can happen at runtime # in an "hot" way, while the server is running. # # 在线碎片整理允许 Redis 服务器压缩内存中由于申请和释放数据块导致的碎片,从而回收内存。? # 碎片是每次申请内存(幸运的是 Jemalloc 出现碎片的几率小很多)的时候会自然发生的。? # 通常来说,为了降低碎片化程度需要重启服务,或者至少需要刷新所有的数据然后重新创建。? # 得益于 Oran Agra 在 Redis 4.0 实现的这个特性,进程可以在服务运行时以 “热” 方式完成这些目的。 # # Basically when the fragmentation is over a certain level (see the # configuration options below) Redis will start to create new copies of the # values in contiguous memory regions by exploiting certain specific Jemalloc # features (in order to understand if an allocation is causing fragmentation # and to allocate it in a better place), and at the same time, will release the # old copies of the data. This process, repeated incrementally for all the keys # will cause the fragmentation to drop back to normal values. # # 通常来说当碎片化达到一定程度(查看下面的配置)Redis 会使用 Jemalloc 的特性创建连续的内存空间,? # 并在此内存空间对现有的值进行拷贝,拷贝完成后会释放掉旧的数据。? # 这个过程会对所有的导致碎片化的 key 以增量的形式进行。 # # Important things to understand: # # 1. This feature is disabled by default, and only works if you compiled Redis # ? ?to use the copy of Jemalloc we ship with the source code of Redis. # ? ?This is the default with Linux builds. #? # 1. 这个特性默认是关闭的,并且只有在编译 Redis 时使用我们代码中的 Jemalloc 版本才生效。(这是 Linux 下的默认行为) # # 2. You never need to enable this feature if you don't have fragmentation # ? ?issues. # # 2. 如果没有碎片问题,你永远不需要启用这项特性 # # 3. Once you experience fragmentation, you can enable this feature when # ? ?needed with the command "CONFIG SET activedefrag yes". # # 3. 如果你需要试验这项特性,可以通过命令 CONFIG SET activefrag yes 来启用 # # The configuration parameters are able to fine tune the behavior of the # defragmentation process. If you are not sure about what they mean it is # a good idea to leave the defaults untouched.
# 相关的配置参数可以很好的调整碎片整理过程。如果你不知道这些选项的作用最好使用默认值。
# Enabled active defragmentation # 启用碎片整理 # activedefrag yes
# Minimum amount of fragmentation waste to start active defrag # 当碎片达到 100mb 时,开启内存碎片整理 # active-defrag-ignore-bytes 100mb
# Minimum percentage of fragmentation to start active defrag # 当碎片超过 10% 时,开启内存碎片整理 # active-defrag-threshold-lower 10
# Maximum percentage of fragmentation at which we use maximum effort # 内存碎片超过 100%,则尽最大努力整理 # active-defrag-threshold-upper 100
# Minimal effort for defrag in CPU percentage # 内存自动整理最低占用5%的CPU # active-defrag-cycle-min 5
# Maximal effort for defrag in CPU percentage # 内存自动整理最高占用75%的CPU # active-defrag-cycle-max 75
# Maximum number of set/hash/zset/list fields that will be processed from # the main dictionary scan # 进行主字典扫描时处理的 set/hash/zset/list 字段的最大数量 # 就是说在进行主字典扫描时 set/hash/zset/list 的长度小于这个值才会处理, # 大于这个值的会放在一个列表中延迟处理 # active-defrag-max-scan-fields 1000
# 实际生产环境中遇到Redis性能变慢,可以通过日志查看是否正在进行碎片清理。 # 如果因为Redis正在清理碎片导致情能下降,建议调整Redis碎片清理参数,例如调小active-defrag-cycle-max阀值。
|