文章目录
  1. 1 配置概述
    1. 1.1 配置项格式
    2. 1.2 容量值的形式
    3. 1.3 参数传递方式
    4. 1.4 服务器运行时更改配置
  2. 2 配置指令
    1. 2.1 include 指令
    2. 2.2 loadmodule 指令
  3. 3 网络相关参数
    1. 3.1 服务绑定的地址
    2. 3.2 服务绑定的端口
    3. 3.3 保护模式
    4. 3.4 最大客户端数
    5. 3.5 TCP连接最大积压数
    6. 3.6 客户端连接空闲超时时长
  4. 4 常规参数
    1. 4.1 守护进程模式
    2. 4.2 指定 PID 文件
    3. 4.3 指定日志文件
    4. 4.4 指定日志级别
    5. 4.5 指定数据库个数
    6. 4.6 启动日志中是否显示 redis 徽标
  5. 5 快照相关参数(磁盘持久化)
    1. 5.1 快照生成时机
    2. 5.2 快照文件目录
    3. 5.3 快照文件名称
    4. 5.4 快照中字符串值是否压缩
    5. 5.5 生成快照失败时是否禁止修改
    6. 5.6 快照中字符串值是否压缩
    7. 5.7 快照校验开关
  6. 6 主从同步相关参数
    1. 6.1 指定主库地址
    2. 6.2 指定主库密码
    3. 6.3 从库是否答复陈旧数据
    4. 6.4 从库是否只许读取
    5. 6.5 无盘同步(现阶段是实验性的)
    6. 6.6 更多参数
  7. 7 安全相关参数
    1. 7.1 客户端连接密码
    2. 7.2 命令改名
  8. 8 内存管理相关参数
    1. 8.1 Redis 内存使用上限
    2. 8.2 内存达到上限时的键值清除策略
    3. 8.3 清除键值时取样数量
    4. 8.4 懒释放相关参数
  9. 9 慢日志相关参数
  10. 10 更多参数
    1. 10.1 AOF 相关参数
    2. 10.2 事件通知相关参数
    3. 10.3 碎片整理参数(实验性)
    4. 10.4 集群相关参数(实验性)
    5. 10.5 集群 DOCKER/NAT 相关参数
    6. 10.6 高级配置参数

恰当地设定 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
3
127.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
2
3
include /path/common1.conf
include /path/common2.conf
include /path/common3.conf

2.2 loadmodule 指令

服务启动时,加载功能扩展模块。这些模块,可以使用网上的,也可以自己开发。
相关资料:Redis Loadable Modules SystemRedis Enterprise Module Hubneural-redis

1
2
3
loadmodule /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>
在大量客户端连接的情况下,应该提高该值,以免客户端连接慢。
但该值受系统内核参数的限制,包括 somaxconntcp_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
文章目录
  1. 1 配置概述
    1. 1.1 配置项格式
    2. 1.2 容量值的形式
    3. 1.3 参数传递方式
    4. 1.4 服务器运行时更改配置
  2. 2 配置指令
    1. 2.1 include 指令
    2. 2.2 loadmodule 指令
  3. 3 网络相关参数
    1. 3.1 服务绑定的地址
    2. 3.2 服务绑定的端口
    3. 3.3 保护模式
    4. 3.4 最大客户端数
    5. 3.5 TCP连接最大积压数
    6. 3.6 客户端连接空闲超时时长
  4. 4 常规参数
    1. 4.1 守护进程模式
    2. 4.2 指定 PID 文件
    3. 4.3 指定日志文件
    4. 4.4 指定日志级别
    5. 4.5 指定数据库个数
    6. 4.6 启动日志中是否显示 redis 徽标
  5. 5 快照相关参数(磁盘持久化)
    1. 5.1 快照生成时机
    2. 5.2 快照文件目录
    3. 5.3 快照文件名称
    4. 5.4 快照中字符串值是否压缩
    5. 5.5 生成快照失败时是否禁止修改
    6. 5.6 快照中字符串值是否压缩
    7. 5.7 快照校验开关
  6. 6 主从同步相关参数
    1. 6.1 指定主库地址
    2. 6.2 指定主库密码
    3. 6.3 从库是否答复陈旧数据
    4. 6.4 从库是否只许读取
    5. 6.5 无盘同步(现阶段是实验性的)
    6. 6.6 更多参数
  7. 7 安全相关参数
    1. 7.1 客户端连接密码
    2. 7.2 命令改名
  8. 8 内存管理相关参数
    1. 8.1 Redis 内存使用上限
    2. 8.2 内存达到上限时的键值清除策略
    3. 8.3 清除键值时取样数量
    4. 8.4 懒释放相关参数
  9. 9 慢日志相关参数
  10. 10 更多参数
    1. 10.1 AOF 相关参数
    2. 10.2 事件通知相关参数
    3. 10.3 碎片整理参数(实验性)
    4. 10.4 集群相关参数(实验性)
    5. 10.5 集群 DOCKER/NAT 相关参数
    6. 10.6 高级配置参数