17丨redis.conf配置详解

Posted by Jiefang's Blog on February 5, 2021

Redis.conf配置详解

Redis版本为redis-5.0.8

网络

1
2
3
4
5
6
7
8
9
10
11
12
13
################################## NETWORK #####################################
# 指定 redis 只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求。
bind 127.0.0.1
# 是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。要是开启了密码和bind,可以开启。否则最好关闭,设置为no。
protected-mode yes
# redis监听的端口号
port 6379
# 此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度, 当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxconn值,默认是511,而Linux的默认参数值是128。当系统并发量大并且客户端速度缓慢的时候,可以将这二个参数一起参考设定。该内核参数默认值一般是128,对于负载很大的服务程序来说大大的不够。一般会将它修改为2048或者更大。在/etc/sysctl.conf中添加:net.core.somaxconn = 2048,然后在终端中执行sysctl -p
tcp-backlog 511
# 此参数为设置客户端空闲超过timeout,服务端会断开连接,为0则服务端不会主动断开连接,不能小于0
timeout 0
# tcp keepalive参数。如果设置不为0,就使用配置tcp的SO_KEEPALIVE值,使用keepalive有两个好处:检测挂掉的对端。降低中间设备出问题而导致网络看似连接却已经与对端端口的问题。在Linux内核中,设置了keepalive,redis会定时给对端发送ack。检测到对端关闭需要两倍的设置值
tcp-keepalive 300

基本配置

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
################################# GENERAL #####################################
# 默认情况下 redis 不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成 yes。当redis作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件里面
daemonize no
# 可以通过upstart和systemd管理Redis守护进程
# 选项:
#  supervised no - 没有监督互动
#  supervised upstart - 通过将Redis置于SIGSTOP模式来启动信号
#  supervised systemd - signal systemd将READY = 1写入$ NOTIFY_SOCKET
#  supervised auto - 检测upstart或systemd方法基于 UPSTART_JOB或NOTIFY_SOCKET环境变量
supervised no
# 配置PID文件路径
pidfile /var/run/redis_6379.pid
#日志级别
#参数:
# debug
# verbose
# notice
# warning
loglevel notice
# 日志文件
logfile ""
# 数据库的数量,默认使用的数据库是DB 0
# 可以通过”SELECT “命令选择一个db
# 集群环境默认只有DB 0
databases 16
# 是否一直显示logo
always-show-logo yes

数据持久化RDB

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
################################ SNAPSHOTTING  ################################
# 保存数据到磁盘:
# Save the DB on disk:
#
#   save <seconds> <changes>
#
#   Will save the DB if both the given number of seconds and the given
#   number of write operations against the DB occurred.
#
#   In the example below the behaviour will be to save:
#   15分钟有一个key发生变化就保存数据到磁盘
#   after 900 sec (15 min) if at least 1 key changed
#   5分钟有10个key发生变化就保存数据到磁盘
#   after 300 sec (5 min) if at least 10 keys changed
#   1分钟有10000个key发生变化就保存数据到磁盘
#   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
# 持久化出现错误后,是否依然进行继续进行工作
stop-writes-on-bgsave-error yes
# 是否校验rdb文件
rdbcompression yes
# 使用压缩rdb文件,rdb文件压缩使用LZF压缩算法
rdbchecksum yes
# rdb文件名称
dbfilename dump.rdb
# rdb使用上面的“dbfilename配置指令的文件名保存到这个目录
dir ./

主从复制

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
################################# REPLICATION #################################
# 指定主节点。旧版本是:slaveof
# replicaof <masterip> <masterport>
# master的密码
# masterauth <master-password>
# 当一个slave失去和master的连接,或者同步正在进行中,slave的行为有两种可能:如果 replica-serve-stale-data 设置为 “yes” (默认值),slave会继续响应客户端请求,可能是正常数据,也可能是还没获得值的空数据。
# 如果 replica-serve-stale-data 设置为 “no”,slave会回复"正在从master同步(SYNC with master in progress)"来处理各种请求,除了 INFO 和 SLAVEOF 命令。
replica-serve-stale-data yes
# 配置从是否为只读,开启后从则不能写入数据,旧版本是:slave-read-only yes
replica-read-only yes
# 同步策略: 磁盘或socket,默认磁盘方式
repl-diskless-sync no
# 如果非磁盘同步方式开启,可以配置同步延迟时间,以等待master产生子进程通过socket传输RDB数据给slave。默认值为5秒,设置为0秒则每次传输无延迟。
repl-diskless-sync-delay 5
# slave根据指定的时间间隔向master发送ping请求。默认10秒。
# repl-ping-replica-period 10
#同步的超时时间
#slave在与master SYNC期间有大量数据传输,造成超时
#在slave角度,master超时,包括数据、ping等
#在master角度,slave超时,当master发送REPLCONF ACK pings#确保这个值大于指定的repl-ping-slave-period,否则在主从间流量不高时每次都会检测到超时
# repl-timeout 60
#是否在slave套接字发送SYNC之后禁用 TCP_NODELAY
#如果选择yes,Redis将使用更少的TCP包和带宽来向slaves发送数据。但是这将使数据传输到slave上有延迟,Linux内核的默认配置会达到40毫秒。
#如果选择no,数据传输到salve的延迟将会减少但要使用更多的带宽。
#默认我们会为低延迟做优化,但高流量情况或主从之间的跳数过多时,可以设置为“yes”。
repl-disable-tcp-nodelay no
# 设置数据备份的backlog大小
# repl-backlog-size 1mb
# 从最后一个slave断开开始计时多少秒后,backlog缓冲将会释放。
# repl-backlog-ttl 3600
# 优先级
replica-priority 100
# 如果master少于N个延时小于等于M秒的已连接slave,就可以停止接收写操作。N个slave需要是“oneline”状态。
# 延时是以秒为单位,并且必须小于等于指定值,是从最后一个从slave接收到的ping(通常每秒发送)开始计数。
# 该选项不保证N个slave正确同步写操作,但是限制数据丢失的窗口期。
# 例如至少需要3个延时小于等于10秒的slave用下面的指令:
# min-replicas-to-write 3
# min-replicas-max-lag 10

安全

1
2
3
4
5
################################## SECURITY ###################################
# 密码
# requirepass foobared
# 命令重命名,设置命令为空时禁用命令
# rename-command CONFIG ""

客户端

1
2
################################### CLIENTS ####################################
# maxclients 10000

内存管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
############################## MEMORY MANAGEMENT ################################
# 内存限制
# maxmemory <bytes>
# 内存淘汰策略
# 如果达到上方最大的内存限制,Redis如何选择删除key
# volatile-lru -> 根据LRU算法删除设置过期时间的key
# allkeys-lru -> 根据LRU算法删除任何key
# volatile-random -> 随机移除设置过过期时间的key
# allkeys-random -> 随机移除任何key
# volatile-ttl -> 移除即将过期的key(minor TTL)
# noeviction -> 不移除任何key,只返回一个写错误
# 注意:对所有策略来说,如果Redis找不到合适的可以删除的key都会在写操作时返回一个错误。
# maxmemory-policy noeviction
# LRU和最小TTL算法的样本个数
# maxmemory-samples 5

惰性删除

1
2
3
4
5
6
7
8
9
############################# LAZY FREEING ####################################
# 内存满逐出
lazyfree-lazy-eviction no
# 过期key删除
lazyfree-lazy-expire no
# 内部删除,比如rename oldkey newkey时,如果newkey存在需要删除newkey
lazyfree-lazy-server-del no
# 接收完RDB文件后清空数据选项
replica-lazy-flush no

持久化方式AOF

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
############################## APPEND ONLY MODE ###############################
# AOF持久化是否开启
appendonly no
# AOF文件名称
appendfilename "appendonly.aof"
# fsync()从缓存持久化到硬盘,Redis支持三种不同的模式:
# 每次写操作都立刻写入到aof文件。慢,但是最安全。
# appendfsync always
# 每秒刷新缓存到硬盘,折中
appendfsync everysec
# 由操作系统决定需要刷的时候再刷。比较快。
# appendfsync no
# 如果AOF的同步策略设置成 “always” 或者 “everysec”,并且后台的存储进程(后台存储或写入AOF 日志)会产生很多磁盘I/O开销。某些Linux的配置下会使Redis因为 fsync()系统调用而阻塞很久。
# 注意,目前对这个情况还没有完美修正,甚至不同线程的 fsync() 会阻塞我们同步的write(2)调用。
# 为了缓解这个问题,可以用下面这个选项。它可以在 BGSAVE 或 BGREWRITEAOF 处理时阻止fsync()。
# 这就意味着如果有子进程在进行保存操作,那么Redis就处于"不可同步"的状态。
# 这实际上是说,在最差的情况下可能会丢掉30秒钟的日志数据。(默认Linux设定)
# 如果把这个设置成"yes"带来了延迟问题,就保持"no",这是保存持久数据的最安全的方式。
no-appendfsync-on-rewrite no
# 自动重写AOF文件。如果AOF日志文件增大到指定百分比,Redis能够通过 BGREWRITEAOF 自动重写AOF日志文件。
# 工作原理:Redis记住上次重写时AOF文件的大小(如果重启后还没有写操作,就直接用启动时的AOF大小)
# 这个基准大小和当前大小做比较。如果当前大小超过指定比例,就会触发重写操作。
# 你还需要指定被重写日志的最小尺寸,这样避免了达到指定百分比但尺寸仍然很小的情况还要重写。
# 指定百分比为0会禁用AOF自动重写特性。
auto-aof-rewrite-percentage 100
# 文件达到大小阈值的时候进行重写
auto-aof-rewrite-min-size 64mb
# 如果设置为yes,如果一个因异常被截断的AOF文件被redis启动时加载进内存,redis将会发送日志通知用户
# 如果设置为no,erdis将会拒绝启动。此时需要用"redis-check-aof"工具修复文件。
aof-load-truncated yes
# 加载时Redis识别出AOF文件以“REDIS”开头字符串,并加载带此前缀的RDB文件,然后继续加载AOF
aof-use-rdb-preamble yes

Lua脚本配置

1
2
3
################################ LUA SCRIPTING  ###############################
# Lua 脚本的最大执行毫秒数
lua-time-limit 5000

集群

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
################################ REDIS CLUSTER  ###############################
# 开启redis集群
# cluster-enabled yes
# 配置redis自动生成的集群配置文件名。确保同一系统中运行的各redis实例该配置文件不要重名。
# cluster-config-file nodes-6379.conf
# 集群节点超时毫秒数
# cluster-node-timeout 15000
# 如果数据太旧,集群中的不可用master的slave节点会避免成为备用master。如果slave和master失联时间超过:(node-timeout * slave-validity-factor) + repl-ping-slave-period则不会被提升为master。
# 如node-timeout为30秒,slave-validity-factor为10, 默认default repl-ping-slave-period为10秒,失联时间超过310秒slave就不会成为master。
# 较大的slave-validity-factor值可能允许包含过旧数据的slave成为master,同时较小的值可能会阻止集群选举出新master。
# 为了达到最大限度的高可用性,可以设置为0,即slave不管和master失联多久都可以提升为master
# cluster-replica-validity-factor 10
# 只有在之前master有其它指定数量的工作状态下的slave节点时,slave节点才能提升为master。默认为1(即该集群至少有3个节点,1 master+2 slaves,master宕机,仍有另外1个slave的情况下其中1个slave可以提升)
# 测试环境可设置为0,生成环境中至少设置为1
# cluster-migration-barrier 1
# 默认情况下如果redis集群如果检测到至少有1个hash slot不可用,集群将停止查询数据。
# 如果所有slot恢复则集群自动恢复。
# 如果需要集群部分可用情况下仍可提供查询服务,设置为no。
# cluster-require-full-coverage yes
# 选项设置为yes时,会阻止replicas尝试对其master在主故障期间进行故障转移,然而,master仍然可以执行手动故障转移,如果强制这样做的话。
# cluster-replica-no-failover no

Docker集群配置

1
2
3
4
5
6
7
########################## CLUSTER DOCKER/NAT support  ########################
# 默认情况下,Redis会自动检测自己的IP和从配置中获取绑定的PORT,告诉客户端或者是其他节点。而在Docker环境中,如果使用的不是host网络模式,在容器内部的IP和PORT都是隔离的,那么客户端和其他节点无法通过节点公布的IP和PORT建立连接。
# 如果开启以下配置,Redis节点会将配置中的这些IP和PORT告知客户端或其他节点。而这些IP和PORT是通过Docker转发到容器内的临时IP和PORT的。
# cluster-announce-ip
# cluster-announce-port
# 集群总线端口
# cluster-announce-bus-port

慢查询日志

1
2
3
4
5
################################## SLOW LOG ###################################
# 记录超过多少微秒的查询命令,1000000等于1秒,设置为0则记录所有命令
slowlog-log-slower-than 10000
# 记录大小,可通过SLOWLOG RESET命令重置
slowlog-max-len 128

延时监控系统

1
2
3
################################ LATENCY MONITOR ##############################
# 记录执行时间大于或等于预定时间(毫秒)的操作,为0时不记录
latency-monitor-threshold 0

事件通知

1
2
3
############################# EVENT NOTIFICATION ##############################
# Redis能通知 Pub/Sub 客户端关于键空间发生的事件,默认关闭
notify-keyspace-events ""

内部数据结构

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
############################### ADVANCED CONFIG ###############################
# 当hash只有少量的entry时,并且最大的entry所占空间没有超过指定的限制时,会用一种节省内存的数据结构来编码。可以通过下面的指令来设定限制
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
# 当取正值的时候,表示按照数据项个数来限定每个quicklist节点上的ziplist长度。比如,当这个参数配置
# 成5的时候,表示每个quicklist节点的ziplist最多包含5个数据项。
# 当取负值的时候,表示按照占用字节数来限定每个quicklist节点上的ziplist长度。这时,它只能取-1到-5
# 这五个值,每个值含义如下:
# -5: 每个quicklist节点上的ziplist大小不能超过64 Kb。(注:1kb => 1024 bytes)
# -4: 每个quicklist节点上的ziplist大小不能超过32 Kb。
# -3: 每个quicklist节点上的ziplist大小不能超过16 Kb。
# -2: 每个quicklist节点上的ziplist大小不能超过8 Kb。(-2是Redis给出的默认值)
# -1: 每个quicklist节点上的ziplist大小不能超过4 Kb。
list-max-ziplist-size -2
# 这个参数表示一个quicklist两端不被压缩的节点个数。
# 注:这里的节点个数是指quicklist双向链表的节点个数,而不是指ziplist里面的数据项个数。
# 实际上,一个quicklist节点上的ziplist,如果被压缩,就是整体被压缩的。
# 参数list-compress-depth的取值含义如下:
# 0: 是个特殊值,表示都不压缩。这是Redis的默认值。
# 1: 表示quicklist两端各有1个节点不压缩,中间的节点压缩。
# 2: 表示quicklist两端各有2个节点不压缩,中间的节点压缩。
# 3: 表示quicklist两端各有3个节点不压缩,中间的节点压缩。
# 依此类推…由于0是个特殊值,很容易看出quicklist的头节点和尾节点总是不被压缩的,以便于在表的两端进行快速存取。
list-compress-depth 0
#set有一种特殊编码的情况:当set数据全是十进制64位有符号整型数字构成的字符串时。下面这个配置项就是用来设置set使用这种编码来节省内存的最大长度。
set-max-intset-entries 512
# 与hash和list相似,有序集合也可以用一种特别的编码方式来节省大量空间。这种编码只适合长度和元素都小于下面限制的有序集合
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# HyperLogLog稀疏结构表示字节的限制。该限制包括16个字节的头。当HyperLogLog使用稀疏结构表示这些限制,它会被转换成密度表示。值大于16000是完全没用的,因为在该点密集的表示是更多的内存效率。建议值是3000左右,以便具有的内存好处, 减少内存的消耗
hll-sparse-max-bytes 3000
# Streams宏节点最大大小/项目。流数据结构是基数编码内部多个项目的大节点树。使用此配置可以配置单个节点的字节数,以及切换到新节点之前可能包含的最大项目数追加新的流条目。如果以下任何设置设置为0,忽略限制,因此例如可以设置一个大入口限制将max-bytes设置为0,将max-entries设置为所需的值
stream-node-max-bytes 4096
stream-node-max-entries 100
# 启用哈希刷新,每100个CPU毫秒会拿出1个毫秒来刷新Redis的主哈希表(顶级键值映射表)
activerehashing yes
# 客户端的输出缓冲区的限制,可用于强制断开那些因为某种原因从服务器读取数据的速度不够快的客户端
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
# 客户端查询缓冲区累积新命令。它们仅限于固定的默认情况下,多数情况下为了避免协议不同步导致客户端查询缓冲区中未绑定的内存使用量的错误。但是,如果你有使用的话,你可以在这里配置它,比如我们有很多执行请求或类似的。
# client-query-buffer-limit 1gb
# 在Redis协议中,批量请求,即表示单个的元素strings,通常限制为512 MB。但是,您可以z更改此限制
# proto-max-bulk-len 512mb
# 默认情况下,“hz”的被设定为10。提高该值将在Redis空闲时使用更多的CPU时,但同时当有多个key同时到期会使Redis的反应更灵敏,以及超时可以更精确地处理
hz 10
# 开启动态hz
dynamic-hz yes
# 当一个子进程重写AOF文件时,如果启用下面的选项,则文件每生成32M数据会被同步
aof-rewrite-incremental-fsync yes
# 当redis保存RDB文件时,如果启用了以下选项,每生成32 MB数据,文件将被fsync。这很有用,以便以递增方式将文件提交到磁盘并避免大延迟峰值。
rdb-save-incremental-fsync yes

碎片整理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启用主动碎片整理
# activedefrag yes
# 启动活动碎片整理的最小碎片浪费量
# active-defrag-ignore-bytes 100mb
# 启动碎片整理的最小碎片百分比
# active-defrag-threshold-lower 10
# 使用最大消耗时的最大碎片百分比
# active-defrag-threshold-upper 100
# 在CPU百分比中进行碎片整理的最小消耗
# active-defrag-cycle-min 5
# 磁盘碎片整理的最大消耗
# active-defrag-cycle-max 75
# 将从主字典扫描处理的最大set / hash / zset / list字段数
# active-defrag-max-scan-fields 1000