Redis 服务器常用配置参数
恰当地设定 Redis 服务器参数,才能保证服务器正确、高性能、安全地运转。通过这些参数,我们还能了解 Redis 服务器内部运转的机制和细节。同时,主从复制和 Redis 集群的部署也要掌握相关配置项。
作者:王克锋
出处:https://kefeng.wang/2017/08/12/redis-config/
版权:自由转载-非商用-非衍生-保持署名,转载请标明作者和出处。
1 配置概述
官方文档:Redis 配置,redis.conf
1.1 配置项格式
格式:keyword argument1 argument2 ... argumentN
例子:slaveof 127.0.0.1 6379
一个参数名称,后跟1至多个参数值,名称与各值之间以空格分隔。
如果单个值内包含空格,该值必须以双引号界定。
1.2 容量值的形式
有三种格式,单位里的字母大小写无关,比如 kb/kB/Kb/KB 是一样的。
- 没有单位:单位为字节,比如
4096
表示 4096 字节 - 无b单位:
1k
=1000 字节,1m
=1000x1000 字节,1g
=1000x1000x1000 字节 - 带b单位:
1kb
=1024 字节,1mb
=1024x1024 字节,1gb
=1024x1024x1024 字节
1.3 参数传递方式
服务启动命令行:redis-server redis.conf --slaveof localhost 6379
redis-server
可以无参数启动,此时使用内置的默认配置(建议仅实验时这样用);- 指定配置文件(可选,建议指定):必须是
redis-server
之后的首个参数; - 指定配置参数(可选):参数名称和取值与配置文件内部一致,只是关键字前加前缀(–),Redis 会在内存中生成临时配置文件。
1.4 服务器运行时更改配置
命令 CONFIG GET
: 查询配置项及其值(可使用通配符);
命令 CONFIG SET
: 修改配置项(服务器不重启的情况下立即生效)。1
2
3127.0.0.1:6379> config get max* ## 查询多个配置项
127.0.0.1:6379> config get save ## 查询单个配置项
127.0.0.1:6379> config set save "900 1 300 10 60 10000" ## 修改配置
2 配置指令
2.1 include 指令
redis.conf 文件中,可以使用 include 指令引入外部配置文件。
比如,多个 Redis 实例中,把相同的配置提取出来保存成文件,各个实例引入此实例,更容易维护配置文件。
1 | include /path/common1.conf |
2.2 loadmodule 指令
服务启动时,加载功能扩展模块。这些模块,可以使用网上的,也可以自己开发。
相关资料:Redis Loadable Modules System、Redis Enterprise Module Hub、neural-redis1
2
3loadmodule /path/module1.so
loadmodule /path/module2.so
loadmodule /path/module3.so
3 网络相关参数
3.1 服务绑定的地址
格式:bind <ip> <ip> ...
bind 0.0.0.0
(默认): 允许整个互联网上的客户端连接,最不安全,应当避免;bind 127.0.0.1
: 只允许本机客户端连接,最安全;bind 127.0.0.1 192.168.1.102
: 只允许本机和局域网客户端连接。
注意:切莫设置为bind 192.168.1.102
这种形式,否则本机无法连接,也无法启停 Redis 服务。
3.2 服务绑定的端口
格式:bind <port>
,默认值为 6379
比如:bind 6379
3.3 保护模式
格式:protected-mode yes|no
,建议使用默认值 yes
当没有指定 bind(相当于 bind 0.0.0.0
) 和 requirepass 时:
如果开启保护模式(默认值),则服务器强制当作配置了 bind 127.0.0.1
;
如果关闭保护模式,服务器当作配置了 bind 0.0.0.0
,接受所有外部主机的连接。除非确认无风险,再关闭保护模式。
3.4 最大客户端数
格式:maxclients 10000
同一时刻最多可以接纳的客户端数目(Redis 服务要占用其中的大约 32 个文件描述符)。
如果客户端连接数达到该上限,新来客户端将被告知“已达到最大客户端连接数”。
3.5 TCP连接最大积压数
格式:tcp-backlog <num>
在大量客户端连接的情况下,应该提高该值,以免客户端连接慢。
但该值受系统内核参数的限制,包括 somaxconn
和 tcp_max_syn_backlog
。
3.6 客户端连接空闲超时时长
格式:timeout <seconds>
,建议使用 0
当连接的客户端连续空闲指定时间后,就断开该连接。指定值为0时禁用超时机制。
4 常规参数
4.1 守护进程模式
格式:daemonize yes|no
,建议使用 yes
设定是否以守护进程启动服务,守护进程会生成 PID 文件 /var/run/redis_6379.pid
。
4.2 指定 PID 文件
格式:pidfile /var/run/redis_6379.pid
启用守护进程模式时,会生成该文件。
4.3 指定日志文件
格式:logfile /var/log/redis_6379.log
指定保存日志的文件。
4.4 指定日志级别
格式:loglevel debug|verbose|notice|warning
,推荐使用 notice
通常设置为 notice,需要更详细日志时可改为 verbose 甚至 debug。
4.5 指定数据库个数
格式:databases 16
表示该 Redis 实例创建 16 个数据库,编号分别是 0~15。
客户端连接后,当前数据库默认切换至 0,可以用 SELECT n
切换至其他数据库。
4.6 启动日志中是否显示 redis 徽标
格式:always-show-logo yes|no
除了耍酷,没啥用,建议关闭(no)。
5 快照相关参数(磁盘持久化)
5.1 快照生成时机
格式:save <seconds> <changes>
,可设置为多条。
指定时间间隔后,如果数据变化达到指定次数,则导出至快照文件。
如果没有指定任何 save
行,则彻底禁止磁盘持久化行为。
如果指定 save ""
,则相当于清除前面指定的所有 save
行。
5.2 快照文件目录
格式:dir /var/lib/redis/6379
指定保存快照文件的目录(不包括文件名称)。
同时,AOF(Append Only File) 文件也会生成到该目录。
5.3 快照文件名称
格式:dbfilename dump.rdb
指定保存快照文件的名称(不包括文件目录)。
5.4 快照中字符串值是否压缩
格式:rdbcompression yes
,建议 yes
以 CPU 换存储空间。
5.5 生成快照失败时是否禁止修改
格式:stop-writes-on-bgsave-error yes|no
在启用快照的情况下(指定了有效的 save
),如果遇到某次快照生成失败(比如目录无权限),之后的数据修改就会被禁止。这有利于用户及早发现快照保存失败,以免更多的数据不能持久化而丢失的风险。当快照恢复正常后,数据的修改会自动开启。
如果你有其他的持久化监控,你可以关闭本机制。
5.6 快照中字符串值是否压缩
格式:rdbcompression yes
,建议 yes
以 CPU 换存储空间。
5.7 快照校验开关
格式:rdbchecksum yes
如果开启,校验和会被放在文件尾部。这将使快照数据更可靠,但会在快照生成与加载时降低大约 10% 的性能,追求高性能时可关闭该功能。
6 主从同步相关参数
6.1 指定主库地址
格式:slaveof <masterip> <masterport>
当前 Redis 实例作为从库(副本),指定用来复制数据的主库的 IP 和端口。
6.2 指定主库密码
格式:masterauth <master-password>
如果主库设置了连接密码(参数 requirepass
),从库连接主库后必须指定密码,才能继续。
6.3 从库是否答复陈旧数据
格式:slave-serve-stale-data yes|no
当从库与主库连接中断,或者主从同步正在进行时,如果有客户端向从库读取数据:
- yes: 从库答复现有数据,可能是陈旧数据(初始从未修改的值则为空值)
- no: 从库报错“正在从主库同步”
6.4 从库是否只许读取
格式:slave-read-only yes|no
,默认为 yes
设定从库只许读取。
6.5 无盘同步(现阶段是实验性的)
格式:repl-diskless-sync no
新连接(包括连接中断后重连)的从库不可采用增量同步,只能采用全量同步(RDB文件由主库传给从库),有两种传递方式:
- 磁盘形式:主库创建子进程,子进程写入磁盘 RDB 文件,再由父进程立即传给从库;
- 无磁盘形式:主库创建子进程,子进程把 RDB 文件直接写入从库的 SOCKET 连接。
6.6 更多参数
repl-ping-slave-period 10
:从库向主库PING的间隔(秒);repl-timeout 60
:从库向主库PING的超时时长,应大于repl-ping-slave-period
repl-disable-tcp-nodelay no
:是否关闭 TCP_NODELAY 选项repl-backlog-size 1mb
repl-backlog-ttl 3600
slave-priority 100
min-slaves-to-write 3
min-slaves-max-lag 10
slave-announce-ip 5.5.5.5
slave-announce-port 1234
7 安全相关参数
7.1 客户端连接密码
格式:requirepass passwd
当设置为requirepass ""
时,表示不要求客户端连接后指定密码。
客户端连接后,执行其他命令之前,必须用命令 AUTH passwd
认证。
注意:由于 Redis 响应速度极快(每秒可达 15 万次),密码应设置的足够复杂强壮,以防被暴力破解。
7.2 命令改名
格式:rename-command <command-name-old> <command-name-new>
对于一些敏感的命令,不希望任意客户端都可以执行,可以改为奇特的名字,新名字只告知特定的客户端来执行。
可以是命令改名:rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
可以是禁用命令:rename-command CONFIG ""
,即新名称为空串。
需要注意的是,命令改名保存至 AOF 文件或传输至从库,可能导致问题。
8 内存管理相关参数
8.1 Redis 内存使用上限
格式:maxmemory <bytes>
当内存达到上限时,Redis 将使用指定的策略清除其他键值。
如果 Redis 无法清除(或者策略不允许清除键值),将对占用内存的命令报错,但对只读的命令正常服务。
8.2 内存达到上限时的键值清除策略
格式:maxmemory-policy noeviction
下面几种策略中,LRU(Least Recently Used)表示最近最少使用,LFU(Least Frequently Used)表示最不经常使用。
- volatile-lru: 针对到期的键值,采取 LRU 策略;
- volatile-lfu: 针对到期的键值,采取 LFU 策略;
- volatile-random: 针对到期的键值,采取随机策略;
- allkeys-lru: 针对所有键值,采取 LRU 策略;
- allkeys-lfu: 针对所有键值,采取 LFU 策略;
- allkeys-random: 针对所有键值,采取随机策略;
- volatile-ttl: Remove the key with the nearest expire time (minor TTL)
- noeviction: 不清除任何内容,只是在写入操作时报错。
8.3 清除键值时取样数量
格式:maxmemory-samples 5
LRU/LFU 等策略,是从指定个数(而不是全部)的键值中检查并挑选一个。
取样越多,就越精确,但性能会下降,所以要平衡该数值。
8.4 懒释放相关参数
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
9 慢日志相关参数
与 MySQL 类似,当 Redis 命令执行时间(不包括I/O和网络耗时)超过指定时长时,会被记入慢日志队列(内存)中。
slowlog-log-slower-than 10000
:执行时长达到该数值时(微秒,1s/1000000)就存入慢日志队列。0表示所有命令都当作慢操作,负数表示所有命令都不当作慢操作;slowlog-max-len 128
: 慢日志队列的长度(内存中),只能保存最近这么多条慢操作,过多时挑最早的挤出去。
慢操作相关命令:
SLOWLOG LEN
: 查询当前记录的慢操作条数;SLOWLOG GET
: 查看当前记录的慢操作详情,每个慢操作都记录了执行时间点、耗时、命令及其参数;SLOWLOG RESET
: 清空当前记录的慢操作。
10 更多参数
10.1 AOF 相关参数
默认情况下,Redis 采取异步策略生成数据快照文件,这在 Redis 出现异常或断电时,会导致上次快照以来的写操作丢失。
AOF(Append Only File)则更实时地将写操作数据记入 AOF 文件,减少数据丢失的风险。
AOF 可以和 RDB 同时启用。
appendonly no
: AOF 的总开关appendfilename "appendonly.aof"
: AOF 文件名称,而 AOF 的路径与 RDB 路径相同;appendfsync everysec|always|no
: 指定操作系统 flush 至磁盘文件的策略,每秒、实时、OS自己定;no-appendfsync-on-rewrite no
: 当 RDB 正在生成时,暂不进入 AOF 操作;auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
10.2 事件通知相关参数
相关资料:notifications
Redis 具有发布/订阅机制,当某个键值产生事件时,订阅者将会收到通知。
格式:notify-keyspace-events <eventFlags>
每类事件用一个字符表示,<eventFlags>
是这样事件标识的序列,指定空串表示不关注任何事件。
10.3 碎片整理参数(实验性)
与操作系统磁盘碎片类似,Redis 反复增删键值之后,内存中会有大量碎片,影响之后申请大块连续的内存,需要在碎片达到一定程度时整理碎片。
activedefrag no|yes
:默认未启用active-defrag-ignore-bytes 100mb
active-defrag-threshold-lower 10
active-defrag-threshold-upper 100
active-defrag-cycle-min 25
active-defrag-cycle-max 75
10.4 集群相关参数(实验性)
Redis Cluster 是稳定的,但需要更多的生产环境去验证。
cluster-enabled no|yes
: 普通 Redis 节点不能作为集群节点,除非打开了本开关;cluster-config-file nodes-6379.conf
: 集群节点的配置文件,由节点自动生成;cluster-node-timeout 15000
cluster-slave-validity-factor 10
cluster-migration-barrier 1
cluster-require-full-coverage yes
10.5 集群 DOCKER/NAT 相关参数
cluster-announce-ip 10.1.1.5
cluster-announce-port 6379
cluster-announce-bus-port 6380
10.6 高级配置参数
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
client-query-buffer-limit 1gb
proto-max-bulk-len 512mb
aof-rewrite-incremental-fsync yes
lfu-log-factor 10
lfu-decay-time 1