# Redis configuration file example
Note on units: when memory size is needed, it is possible to specify //1 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit
// 2 对大小写不敏感
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.
include /path/to/local.conf // 和Struts2配置文件类似,可以通过includes包含,redis.conf可以作为总闸,包含其他
include /path/to/other.conf
################################ 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.
daemonize no //作为守护进程运行 默认no
When running daemonized, Redis writes a pid file in /var/run/redis.pid by
default. You can specify a custom pid file location here.
pidfile /var/run/redis.pid //PID文件位置
Accept connections on the specified port, default is 6379.
If port 0 is specified Redis will not listen on a TCP socket.
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.
tcp-backlog 511 //tcp-backlog
设置tcp的backlog,backlog其实是一个连接队列,backlog队列总和=未完成三次握手队列 + 已经完成三次握手队列。
在高并发环境下你需要一个高backlog值来避免慢客户端连接问题。注意Linux内核会将这个值减小到/proc/sys/net/core/somaxconn的值,
所以需要确认增大somaxconn和tcp_max_syn_backlog两个值
来达到想要的效果
By default Redis listens for connections from all the network interfaces
available on the server. It is possible to listen to just one or multiple
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
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.
unixsocket /tmp/redis.sock
unixsocketperm 700
Close the connection after a client is idle for N seconds (0 to disable)
timeout 0 //会话失效时间,0永不失效
TCP keepalive.
If non-zero, use SO_KEEPALIVE to send TCP ACKs to clients in absence
of communication. This is useful for two reasons:
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 60 seconds.
tcp-keepalive 0
Specify the server verbosity level.
This can be one of:
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 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
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 "" . 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
logfile stdout
To enable logging to the system logger, just set 'syslog-enabled' to yes,
and optionally update the other syslog parameters to suit your needs.
syslog-enabled no
Specify the syslog identity.
syslog-ident redis
Specify the syslog facility. Must be USER or between 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 where
dbid is a number between 0 and 'databases'-1
databases 16 //设置数据库的数量,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id
################################ SNAPSHOTTING ################################ //快照
Save the DB on disk:
save
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
# 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
# save
# Redis默认配置文件中提供了三个条件:
# save 900 1
# save 300 10
# save 60 10000
# 分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
points by adding a save directive with a single empty string argument
like in the following example:
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.
stop-writes-on-bgsave-error yes 后台保存数据出错,前台停止写入,如果配置成no,表示你不在乎数据不一致或者有其他的手段发现和控制
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.
rdbcompression yes 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
Since version 5 of RDB a CRC64 checksum is placed at the end of the file.
hit to pay (around 10%) when saving and loading RDB files, so you can disable it
RDB files created with checksum disabled have a checksum of zero that will
tell the loading code to skip the check.
rdbchecksum yes rdbchecksum:在存储快照后,还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约
10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能
The filename where to dump the DB 指定rdb备份文件名,默认值为dump.rdb
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-Slave replication. Use slaveof to make a Redis instance a copy of
another Redis server. A few things to understand ASAP about Redis replication.
stop accepting writes if it appears to be not connected with at least
a given number of slaves.
master if the replication link is lost for a relatively small amount of
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 slaves automatically try to reconnect to masters
and resynchronize with them.
#设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
# slaveof
slaveof
If the master is password protected (using the "requirepass" configuration
directive below) it is possible to tell the slave to authenticate before
starting the replication synchronization process, otherwise the master will
refuse the slave request.
# 当master服务设置了密码保护时,slav服务连接master的密码
# masterauth
masterauth
When a slave loses its connection with the master, or when the replication
is still in progress, the slave can act in two different ways:
1) if slave-serve-stale-data is set to 'yes' (the default) the slave 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 slave-serve-stale-data is set to 'no' the slave will reply with
an error "SYNC with master in progress" to all the kind of commands
but to INFO and SLAVEOF.
slave-serve-stale-data yes
a slave instance may be useful to store some ephemeral data (because data
written on a slave 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 slaves are read-only.
Note: read only slaves 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 slave 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 slaves using 'rename-command' to shadow all the
administrative / dangerous commands.
slave-read-only yes
Replication SYNC strategy: disk or socket.
-------------------------------------------------------
WARNING: DISKLESS REPLICATION IS EXPERIMENTAL CURRENTLY
-------------------------------------------------------
New slaves and reconnecting slaves 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 slaves.
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 slaves incrementally.
2) Diskless: The Redis master creates a new process that directly writes the
RDB file to slave sockets, without touching the disk at all.
With disk-backed replication, while the RDB file is generated, more slaves
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 slaves 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 slaves
will arrive and the transfer can be parallelized.
With slow disks and fast (large bandwidth) networks, diskless replication
works better.
repl-diskless-sync no
the server waits in order to spawn the child that transfers the RDB via socket
to the slaves.
This is important since once the transfer starts, it is not possible to serve
new slaves arriving, that will be queued for the next RDB transfer, so the server
waits a delay in order to let more slaves 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.
repl-diskless-sync-delay 5
Slaves send PINGs to server in a predefined interval. It's possible to change
this interval with the repl_ping_slave_period option. The default value is 10
seconds.
repl-ping-slave-period 10
The following option sets the replication timeout for:
1) Bulk transfer I/O during SYNC, from the point of view of slave.
2) Master timeout from the point of view of slaves (data, pings).
3) Slave 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-slave-period otherwise a timeout will be detected
every time there is low traffic between the master and the slave.
repl-timeout 60
Disable TCP_NODELAY on the slave socket after SYNC?
If you select "yes" Redis will use a smaller number of TCP packets and
less bandwidth to send data to slaves. But this can add a delay for
the data to appear on the slave side, up to 40 milliseconds with
Linux kernels using a default configuration.
If you select "no" the delay for data to appear on the slave 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 slaves are many hops away, turning this to "yes" may
be a good idea.
repl-disable-tcp-nodelay no
Set the replication backlog size. The backlog is a buffer that accumulates
slave data when slaves are disconnected for some time, so that when a slave
wants to reconnect again, often a full resync is not needed, but a partial
resync is enough, just passing the portion of data the slave missed while
disconnected.
The bigger the replication backlog, the longer the time the slave can be
The backlog is only allocated once there is at least a slave connected.
repl-backlog-size 1mb
After a master has no longer connected slaves for some time, the backlog
need to elapse, starting from the time the last slave disconnected, for
the backlog buffer to be freed.
A value of 0 means to never release the backlog.
repl-backlog-ttl 3600
The slave priority is an integer number published by Redis in the INFO output.
master if the master is no longer working correctly.
for instance if there are three slaves with priority 10, 100, 25 Sentinel will
pick the one with priority 10, that is the lowest.
role of master, so a slave with priority of 0 will never be selected by
By default the priority is 100.
slave-priority 100
It is possible for a master to stop accepting writes if there are less than
N slaves connected, having a lag less or equal than M seconds.
The N slaves 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 slave, 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 slaves
are available, to the specified number of seconds.
For example to require at least 3 slaves with a lag <= 10 seconds use:
min-slaves-to-write 3
min-slaves-max-lag 10
Setting one or the other to 0 disables the feature.
By default min-slaves-to-write is set to 0 (feature disabled) and
min-slaves-max-lag is set to 10.
################################## SECURITY ################################### //SECURITY安全
Require clients to issue AUTH 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.
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连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH 命令提供密码,默认关闭
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
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:
rename-command CONFIG ""
Please note that changing the name of commands that are logged into the
AOF file or transmitted to slaves may cause problems.
################################### LIMITS #################################### //限制
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
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'.
#设置redis同时可以与多少个客户端进行连接。默认情况下为10000个客户端。当你
#无法设置进程文件句柄限制时,redis会设置为当前的文件句柄限制值减去32,因为redis会为自
#身内部处理逻辑留一些句柄出来。如果达到了此限制,redis则会拒绝新的连接请求,并且向这
#些连接请求方发出“max number of clients reached”以作回应。
maxclients 10000
Don't use more memory than 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 cache, or to set
a hard memory limit for an instance (using the 'noeviction' policy).
WARNING: If you have slaves attached to an instance with maxmemory on,
the size of the output buffers needed to feed the slaves 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 slaves 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 slaves attached it is suggested that you set a lower
limit for maxmemory so that there is some free RAM on the system for slave
output buffers (but this is not needed if the policy is 'noeviction').
#指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,
#仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
# maxmemory
maxmemory
MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
is reached. You can select among five behaviors:
volatile-lru -> remove the key with an expire set using an LRU algorithm
allkeys-lru -> remove any key according to the LRU algorithm
volatile-random -> remove a random key 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 expire at all, just return an error on write operations
(1)volatile-lru:使用LRU算法移除key,只对设置了过期时间的键
(2)allkeys-lru:使用LRU算法移除key
(3)volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键
(4)allkeys-random:移除随机的key
(5)volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key
(6)noeviction:不进行移除。针对写操作,只是返回错误信息
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:
#设置redis可以使用的内存量。一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。如果redis无法根据移除规则来移除内存中的数据,
#或者设置了“不允许移除”,
#那么redis则会针对那些需要申请内存的指令返回错误信息,比如SET、LPUSH等。
#但是对于无内存申请的指令,仍然会正常响应,比如GET等。如果你的redis是主redis(说明你的redis有从redis),那么在设置内存使用上限时,需要在系统中留出一些内存空间给同步队列缓存,
#只有在你设置的是“不移除”的情况下,才不用考虑这个因素
maxmemory-policy noeviction
LRU 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 a bit more CPU. 3 is very fast but not very accurate.
#设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小,
redis默认会检查这么多个key并选择其中LRU的那个
maxmemory-samples 5
############################## APPEND ONLY MODE ############################### 追加 AOF
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 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.
appendonly no 默认Aof备份策略关闭
The name of the append only file (default: "appendonly.aof")
appendfilename "appendonly.aof" 默认备份文件名default: "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
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:
If unsure, use "everysec".
appendfsync always AOF appendfsync 备份策略always:同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好,
everysec:出厂默认推荐,异步操作,每秒记录 如果一秒内宕机,有数据丢失,no表示等操作系统进行数据缓存同步到磁盘(快)
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
Redis may block too long on the fsync() call. Note that there is no fix for
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.
no-appendfsync-on-rewrite no 重写时是否可以运用Appendfsync,用默认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.
auto-aof-rewrite-percentage 100 设置重写的基准值
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
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.
aof-load-truncated yes
################################ 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-time-limit 5000
################################ REDIS CLUSTER ###############################
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
WARNING EXPERIMENTAL: Redis Cluster is considered to be stable code, however
in order to mark it as "mature" we need to wait for a non trivial percentage
of users to deploy it in production.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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-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.
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 slave of a failing master will avoid to start a failover if its data
looks too old.
There is no simple way for a slave to actually have a exact measure of
1) If there are multiple slaves able to failover, they exchange messages
in order to try to give an advantage to the slave with the best
replication offset (more data from the master processed).
Slaves 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 slave 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 slave will not try to failover
at all.
the failover if, since the last interaction with the master, the time
elapsed is greater than:
(node-timeout * slave-validity-factor) + repl-ping-slave-period
So for example if node-timeout is 30 seconds, and the slave-validity-factor
is 10, and assuming a default repl-ping-slave-period of 10 seconds, the
slave will not try to failover if it was not able to talk with the master
for longer than 310 seconds.
A large slave-validity-factor may allow slaves with too old data to failover
a master, while a too small value may prevent the cluster from being able to
elect a slave at all.
For maximum availability, it is possible to set the slave-validity-factor
to a value of 0, which means, that slaves 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.
cluster-slave-validity-factor 10
Cluster slaves are able to migrate to orphaned masters, that are masters
that are left without working slaves. 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 slaves.
Slaves migrate to orphaned masters only if there are still at least a
given number of other working slaves for their old master. This number
is the "migration barrier". A migration barrier of 1 means that a slave
will migrate only if there is at least 1 other working slave for its master
and so forth. It usually reflects the number of slaves you want for every
master in your cluster.
Default is 1 (slaves migrate only if their masters remain with at least
one slave). 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 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.
cluster-require-full-coverage yes
In order to setup your cluster make sure to read the documentation
################################## 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).
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.
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-max-len 128
################################ LATENCY MONITOR ##############################
The Redis latency monitoring subsystem samples different operations
latency of a Redis instance.
print graphs and obtain reports.
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
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 " if needed.
latency-monitor-threshold 0
############################# EVENT NOTIFICATION ##############################
Redis can notify Pub/Sub clients about events happening in the key space.
For instance if keyspace events notification is enabled, and a client
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@__ prefix.
E Keyevent events, published with __keyevent@__ 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.
notify-keyspace-events ""
############################### ADVANCED CONFIG ###############################
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
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
Similarly to hashes, small lists are also encoded in a special way in order
to save a lot of space. The special representation is only used when
you are under the following limits:
list-max-ziplist-entries 512
list-max-ziplist-value 64
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-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-max-ziplist-entries 128
zset-max-ziplist-value 64
HyperLogLog sparse representation bytes limit. The limit includes the
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.
hll-sparse-max-bytes 3000
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)
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.
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
slave -> slave 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
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
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 slave clients, since
subscribers and slaves receive data in a push fashion.
Both the hard or the soft limit can be disabled by setting them to zero.
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
closing connections of clients in timeout, purging expired keys that are
never requested, and so forth.
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.
hz 10
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.
aof-rewrite-incremental-fsync yes