12.配置文件redis.conf

 

1. 配置文件redis.conf

Redis的配置文件redis.conf位于/usr/local/src/redis-6.0.9目录下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@localhost redis-6.0.9]# pwd
/usr/local/src/redis-6.0.9
[root@localhost redis-6.0.9]# ls -l
total 292
-rw-r--r--. 1 root root 108806 Nov 29 11:38 00-RELEASENOTES
-rw-r--r--. 1 root root 51 Nov 29 11:38 BUGS
-rw-r--r--. 1 root root 2499 Nov 29 11:38 CONTRIBUTING
-rw-r--r--. 1 root root 1487 Nov 29 11:38 COPYING
drwxr-xr-x. 6 root root 192 Nov 29 11:38 deps
-rw-r--r--. 1 root root 11 Nov 29 11:38 INSTALL
-rw-r--r--. 1 root root 151 Nov 29 11:38 Makefile
-rw-r--r--. 1 root root 6888 Nov 29 11:38 MANIFESTO
-rw-r--r--. 1 root root 21099 Nov 29 11:38 README.md
-rw-r--r--. 1 root root 84841 Nov 29 11:38 redis.conf
-rwxr-xr-x. 1 root root 275 Nov 29 11:38 runtest
-rwxr-xr-x. 1 root root 280 Nov 29 11:38 runtest-cluster
-rwxr-xr-x. 1 root root 795 Nov 29 11:38 runtest-moduleapi
-rwxr-xr-x. 1 root root 281 Nov 29 11:38 runtest-sentinel
-rw-r--r--. 1 root root 10744 Nov 29 11:38 sentinel.conf
drwxr-xr-x. 3 root root 8192 Nov 29 11:45 src
drwxr-xr-x. 11 root root 182 Nov 29 11:38 tests
-rw-r--r--. 1 root root 3055 Nov 29 11:38 TLS.md
drwxr-xr-x. 9 root root 4096 Nov 29 11:38 utils
1
2
3
4
5
6
# 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-server /path/to/redis.conf

1.1 Units单位

  • 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit
  • 对大小写不敏感
1
2
3
4
5
6
7
8
9
10
11
# 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.

1.2 INCLUDES包含

和我们的spring配置文件类似,可以包含其他配置文件,redis.conf通过include包含其他配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
################################## 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.
#
# Note that 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
# include /path/to/other.conf

1.3 NETWORK通用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
################################## NETWORK #####################################

# By default, if no "bind" configuration directive is specified, Redis listens
# for connections from all available network interfaces on the host machine.
# 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 on the
# IPv4 loopback interface address (this means Redis will only be able to
# accept client connections from the same host that it is running on).
#
# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
# JUST COMMENT OUT THE FOLLOWING LINE.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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.
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.
port 6379

# TCP listen() backlog.
#
# In high requests-per-second environments you need a high backlog in order
# to avoid slow clients connection 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

# 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.
#
# unixsocket /tmp/redis.sock
# unixsocketperm 700

# Close the connection after a client is idle for N seconds (0 to disable)
timeout 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) Force network equipment in the middle to consider the connection to be
# alive.
#
# 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.
tcp-keepalive 300
  1. bind   

默认情况下,redis 在 server 上所有有效的网络接口上监听客户端连接。如果只想在一个或多个网络接口上监听,那就绑定一个IP或者多个IP。多个ip用空格分隔即可。

  1. port运行端口

  2. Tcp-backlog

设置tcp的backlog,backlog其实是一个连接队列,backlog队列总和 = 未完成三次握手队列 + 已经完成三次握手队列。

在高并发环境下你需要一个高backlog值来避免慢客户端连接问题。注意Linux内核会将这个值减小到/proc/sys/net/core/somaxconn的值,所以需要确认增大somaxconn和tcp_max_syn_backlog两个值来达到想要的效果。

1
2
3
4
5
6
7
8
9
[root@localhost ~]# cd /proc/sys/net/core/
[root@localhost core]# ls
bpf_jit_enable default_qdisc message_cost optmem_max warnings xfrm_aevent_rseqth
bpf_jit_harden dev_weight netdev_budget rmem_default wmem_default xfrm_larval_drop
bpf_jit_kallsyms dev_weight_rx_bias netdev_max_backlog rmem_max wmem_max
busy_poll dev_weight_tx_bias netdev_rss_key rps_sock_flow_entries xfrm_acq_expires
busy_read message_burst netdev_tstamp_prequeue somaxconn xfrm_aevent_etime
[root@localhost core]# cat somaxconn
128
  1. timeout 

当客户端闲置多少秒后关闭连接,如果设置为0表示关闭该功能。

  1. tcp-keepalive 300

单位是秒,表示将周期性的使用SO_KEEPALIVE检测客户端是否还处于健康状态,避免服务器一直阻塞,官方给出的建议值是300秒,建议设置成60

1.4 GENERAL通用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
################################# 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
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
# requires "expect stop" in your upstart job config
# 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 pings back to your supervisor.
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.
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.
# 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 <dbid> where
# dbid is a number between 0 and '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.
always-show-logo yes

daemonize no: 是否以守护模式启动,默认为no,配置为yes时以守护模式启动,这时redis instance会将进程号pid写入默认文件/var/run/redis.pid

supervised no: 可以通过upstart和systemd管理Redis守护进程,这个参数是和具体的操作系统相关的。

pidfile /var/run/redis_6379.pid: 配置pid文件路径。当redis以守护模式启动时,如果没有配置pidfile,pidfile默认值是/var/run/redis.pid

loglevel notice: 日志级别。可选项有:debug(记录大量日志信息,适用于开发、测试阶段);verbose(较多日志信息);notice(适量日志信息,使用于生产环境);warning(仅有部分重要、关键信息才会被记录)。

logfile "": 日志文件的位置,当指定为空字符串时,为标准输出,如果redis已守护进程模式运行,那么日志将会输出到 /dev/null

syslog-enabled no: 是否把日志记录到系统日志。

syslog-ident: 设置系统日志的id,日志文件名前缀,如: syslog-ident redis

databases 16: 设置数据库的数目。默认的数据库是DB 0,可以在每个连接上使用select [dbid]命令选择一个不同的数据库,dbid是一个介于0到(databases-1)之间的数值。

always-show-logo yes: 是否一直显示logo

注: /var/run/redis_6379.pid: Redis在启动时写入这个文件,当退出时移除这个文件。当启动多个redis实例时,redis_6379.pid记录最后一个redis实例的pid

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
[root@localhost bin]# ps -ef | grep redis
root 2181 1 0 23:14 ? 00:00:00 ./redis-server 127.0.0.1:6379
root 2196 1 0 23:17 ? 00:00:00 ./redis-server 127.0.0.1:6380
root 2215 1 1 23:18 ? 00:00:00 ./redis-server 127.0.0.1:6381
root 2226 1 6 23:19 ? 00:00:00 ./redis-server 127.0.0.1:6378
root 2232 1801 0 23:19 pts/0 00:00:00 grep --color=auto redis
[root@localhost run]# ls -l
total 36
-rw-r--r--. 1 root root 4 Dec 1 21:26 auditd.pid
drwxr-xr-x. 2 root root 40 Dec 1 21:26 console
drwxr-xr-x. 7 root root 140 Dec 1 21:26 container-storage-setup
-rw-r--r--. 1 root root 4 Dec 1 21:26 crond.pid
----------. 1 root root 0 Dec 1 21:26 cron.reboot
drwx------. 2 root root 40 Dec 1 21:26 cryptsetup
drwxr-xr-x. 2 root root 60 Dec 1 21:26 dbus
-rw-r--r--. 1 root root 4 Dec 1 23:07 dhclient-ens33.pid
prw-------. 1 root root 0 Dec 1 21:26 dmeventd-client
prw-------. 1 root root 0 Dec 1 21:26 dmeventd-server
drwx------. 6 root root 120 Dec 1 21:26 docker
-rw-r--r--. 1 root root 4 Dec 1 21:26 docker.pid
srw-rw----. 1 root root 0 Dec 1 21:26 docker.sock
-rw-------. 1 root root 0 Dec 1 21:26 ebtables.lock
drwxr-xr-x. 2 root root 40 Dec 1 21:26 faillock
drwxr-x---. 2 root root 40 Dec 1 21:26 firewalld
drwxr-xr-x. 4 root root 120 Dec 1 21:26 initramfs
drwxr-xr-x. 5 root root 120 Dec 1 21:26 lock
drwxr-xr-x. 3 root root 60 Dec 1 21:26 log
drwx------. 3 root root 100 Dec 1 21:26 lvm
-rw-r--r--. 1 root root 4 Dec 1 21:26 lvmetad.pid
drwxr-xr-x. 2 root root 40 Dec 1 21:26 mount
drwxrwxr-x. 2 root root 40 Dec 1 21:26 netreport
drwxr-xr-x. 3 root root 120 Dec 1 21:26 NetworkManager
drwxr-xr-x. 2 root root 40 Dec 1 21:26 plymouth
-rw-r--r--. 1 root root 5 Dec 1 23:19 redis_6379.pid
drwxr-xr-x. 2 root root 80 Dec 1 21:26 rhsm
drwxr-xr-x. 2 root root 40 Dec 1 21:26 sepermit
drwxr-xr-x. 2 root root 40 Dec 1 21:26 setrans
-rw-r--r--. 1 root root 5 Dec 1 21:26 sshd.pid
drwx--x--x. 3 root root 60 Dec 1 21:26 sudo
-rw-------. 1 root root 4 Dec 1 21:26 syslogd.pid
drwxr-xr-x. 18 root root 440 Dec 1 21:26 systemd
drwxr-xr-x. 2 root root 60 Dec 1 21:26 tmpfiles.d
drwxr-xr-x. 2 root root 60 Dec 1 21:26 tuned
drwxr-xr-x. 7 root root 160 Dec 1 21:26 udev
drwxr-xr-x. 3 root root 60 Dec 1 21:31 user
-rw-rw-r--. 1 root utmp 1920 Dec 1 23:11 utmp
drwxr-xr-x. 2 root root 60 Dec 1 21:26 vmware
-rw-------. 1 root root 0 Dec 1 21:26 xtables.lock
[root@localhost run]# cat redis_6379.pid
2226

5. SNAPSHOTTING快照

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
################################ 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 behavior 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 ""

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

# Compress string objects using LZF when dump .rdb databases?
# By default compression is enabled 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

# 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.
rdbchecksum yes

# The filename where to dump the DB
dbfilename dump.rdb

# Remove RDB files used by replication in instances without persistence
# enabled. By default this option is disabled, however there are environments
# where for regulations or other security concerns, RDB files persisted on
# disk by masters in order to feed replicas, or stored on disk by replicas
# in order to load them for the initial synchronization, should be deleted
# ASAP. Note that this option ONLY WORKS in instances that have both AOF
# and RDB persistence disabled, otherwise is completely ignored.
#
# An alternative (and sometimes better) way to obtain the same effect is
# to use diskless replication on both master and replicas instances. However
# in the case of replicas, diskless is not always an option.
rdb-del-sync-files no

# 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 ./

save: 保存数据到磁盘。格式是:save [seconds] [changes],含义是在seconds秒之后至少有changes个keys发生改变则保存一次。
例如:

  • save 900 1: 900秒有一条数据改变就保存
  • save 300 10: 300秒有10条数据改变就保存
  • save 60 10000: 600秒有10000条数据改变就保存

stop-writes-on-bgsave-error yes: 默认情况下,如果 redis 最后一次的后台保存失败,redis 将停止接受写操作,这样以一种强硬的方式让用户知道数据不能正确的持久化到磁盘, 否则就会没人注意到灾难的发生。 如果后台保存进程重新启动工作了,redis 也将自动的允许写操作。然而你要是安装了靠谱的监控,你可能不希望 redis 这样做,那你就改成 no 好了。

rdbcompression yes: 是否在dump.rdb数据库的时候压缩字符串,默认设置为yes。如果你想节约一些cpu资源的话,可以把它设置为no,这样的话数据集就可能会比较大。

rdbchecksum yes: 是否CRC64校验rdb文件,会有一定的性能损失(大概10%)

dbfilename dump.rdb: 设置rdb文件的名字。

dir ./: 数据文件保存路径为当前的路径,即redis的bin所在的路径,/usr/local/redis-6.0.9/bin

6. REPLICATION复制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
################################# 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.
#
# replicaof <masterip> <masterport>

...

7. SECURITY安全

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
################################## SECURITY ###################################

# Warning: since Redis is pretty fast, an outside user can try up to
# 1 million passwords per second against a modern box. This means that you
# should use very strong passwords, otherwise they will be very easy to break.
# Note that because the password is really a shared secret between the client
# and the server, and should not be memorized by any human, the password
# can be easily a long string from /dev/urandom or whatever, so by using a
# long and unguessable password no brute force attack will be possible.

...

# IMPORTANT NOTE: starting with Redis 6 "requirepass" is just a compatibility
# layer on top of the new ACL system. The option effect will be just setting
# the password for the default user. Clients will still authenticate using
# AUTH <password> as usually, or more explicitly with AUTH default <password>
# if they follow the new protocol: both will work.
#
# requirepass foobared
requirepass 123456

...

主要用于访问密码和查看,设置和取消

可以使用config get requirepass查看密码,config set requirepass [password]设置密码,auth [password]输入密码

redis.conf:

1
2
3
4
5
6
7
8
# IMPORTANT NOTE: starting with Redis 6 "requirepass" is just a compatibility
# layer on top of the new ACL system. The option effect will be just setting
# the password for the default user. Clients will still authenticate using
# AUTH <password> as usually, or more explicitly with AUTH default <password>
# if they follow the new protocol: both will work.
#
# requirepass foobared
requirepass 123456
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@localhost bin]# ./redis-cli
127.0.0.1:6379> ping
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "123456"
127.0.0.1:6379> config set requirepass abc
OK
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "abc"
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> quit
[root@localhost bin]# ./redis-cli
127.0.0.1:6379> ping
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123456
(error) WRONGPASS invalid username-password pair
127.0.0.1:6379> auth abc
OK
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>

8. LIMITS限制

8.1 maxclients 10000

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
################################### 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'.
#
# IMPORTANT: When Redis Cluster is used, the max number of connections is also
# shared with the cluster bus: every node in the cluster will use two
# connections, one incoming and another outgoing. It is important to size the
# limit accordingly in case of very large clusters.
#
# maxclients 10000

设置redis同时可以与多少个客户端进行连接。默认情况下为10000个客户端。当你无法设置进程文件句柄限制时,redis会设置为当前的文件句柄限制值减去32,因为redis会为自身内部处理逻辑留一些句柄出来。如果达到了此限制,redis则会拒绝新的连接请求,并且向这些连接请求方发出“max number of clients reached”以作回应。

8.2 maxmemory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
############################## 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').
#
# maxmemory <bytes>

设置redis可以使用的内存量。一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。如果redis无法根据移除规则来移除内存中的数据,或者设置了“不允许移除”,那么redis则会针对那些需要申请内存的指令返回错误信息,比如SET、LPUSH等。但是对于无内存申请的指令,仍然会正常响应,比如GET等。如果你的redis是主redis(说明你的redis有从redis),那么在设置内存使用上限时,需要在系统中留出一些内存空间给同步队列缓存,只有在你设置的是“不移除”的情况下,才不用考虑这个因素

8.3 maxmemory-policy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
# is reached. You can select one from the following behaviors:
#
# volatile-lru -> Evict using approximated LRU, only keys with an expire set.
# allkeys-lru -> Evict any key using approximated LRU.
# volatile-lfu -> Evict using approximated LFU, only keys with an expire set.
# allkeys-lfu -> Evict any key using approximated LFU.
# volatile-random -> Remove a random key having 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
# LFU means Least Frequently Used
#
# 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-policy noeviction

(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:不进行移除。针对写操作,只是返回错误信息

8.4 maxmemory-samples

1
2
3
4
5
6
7
8
9
10
# 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. By default Redis will check five keys and pick the one that was
# used least 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.
#
# maxmemory-samples 5

设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小,redis默认会检查这么多个key并选择其中LRU的那个

9. APPEND ONLY MODE 追加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
############################## 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.

appendonly no

# The name of the append only file (default: "appendonly.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".

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

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.

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
# 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.
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, then continues loading the AOF
# tail.
aof-use-rdb-preamble yes

2. redis.conf常见配置介绍

redis.conf 配置项说明如下:

  1. daemonize no

Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程

  1. pidfile /var/run/redis.pid

当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定

  1. port 6379

指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字

  1. bind 127.0.0.1 0.0.0.0

绑定的主机地址

  1. timeout 300

当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能

  1. loglevel verbose

指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose

  1. logfile stdout

日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null

  1. databases 16

设置数据库的数量,默认数据库为0,可以使用SELECT [dbid]命令在连接上指定数据库id

  1. save [seconds] [changes]

指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合

Redis默认配置文件中提供了三个条件:

save 900 1: 900秒(15分钟)内有1个更改

save 300 10: 300秒(5分钟)内有10个更改

save 60 10000: 60秒内有10000个更改

  1. rdbcompression yes

指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大

  1. dbfilename dump.rdb

指定本地数据库文件名,默认值为dump.rdb

  1. dir ./

指定本地数据库存放目录(/redis的安装目录/bin)

  1. slaveof <masterip> <masterport>

设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步

  1. masterauth <master-password>

当master服务设置了密码保护时,slav服务连接master的密码

  1. requirepass foobared

设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH [password]命令提供密码,默认关闭

  1. maxclients 128

设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息

  1. maxmemory <bytes>

指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区

  1. appendonly no

指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no

  1. appendfilename appendonly.aof

指定更新日志文件名,默认为appendonly.aof
   
20. appendfsync everysec

指定更新日志条件,共有3个可选值: 

no:表示等操作系统进行数据缓存同步到磁盘(快) 

always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) 

everysec:表示每秒同步一次(折衷,默认值)

  1. vm-enabled no

指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)

  1. vm-swap-file /tmp/redis.swap

虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享

  1. vm-max-memory 0

将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0

  1. vm-page-size 32

Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值

  1. vm-pages 134217728

设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。

  1. vm-max-threads 4

设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4

  1. glueoutputbuf yes

设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启

  1. 1
    2
    hash-max-zipmap-entries 64
    hash-max-zipmap-value 512

指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法

  1. activerehashing yes

指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)

  1. include /path/to/local.conf

指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件