进学阁

业精于勤荒于嬉,行成于思毁于随

0%

Redis配置文件详解

Redis服务配置

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
# 是否以守护进程启动 默认:no
daemonize no
# 用于设置Redis绑定的网络接口(网卡)。如果不配置bind,默认情况下Redis监听所有可用的网卡,redis只接受来自绑定网络接口的请求。
# Redis的配置文件中一般默认有bind 127.0.0.1,只允许本地连接,如果想要被远程访问注释掉bind配置或者bind外网ip即可。
bind 127.0.0.1
# 是否开启保护模式 默认:yes,是否有效会被bind和requirepass配置影响
## 当protected-mode为yes
### 注释bind和requirepass,redis的保护模式生效,只能通过本地连接
### 只注释bind,配置requirepass,redis的保护模式失效,可以通过密码远程连接
### 只注释requirepass,redis的保护模式失效,可以通过bind的ip无密码连接
## 当protected-mode为no
### 无论上面的哪种场景,客户端都可以根据 bind 及 requirepass 实际参数来连接到 redis
protected-mode yes
# redis服务端口 默认:6379
port 6379
# 客户端连接空闲时间单位秒,如果在指定时间内没有操作则会断开连接 默认:0(不超时)
timeout 0
# tcp心跳检测时间单位秒,对访问客户端的一种心跳检测,每个n秒检测一次 默认:0(不检测),建议设置成60
tcp-keepalive 0
# 客户端最大连接数,设置redis同时可以与多少个客户端进行连接 默认:10000
maxclients 10000
# 日志级别配置 默认:notice
## debug:能设置的最高的日志级别,打印所有信息,包括debug信息。
## verbose:打印除了debug日志之外的所有日志。
## notice:打印除了debug和verbose级别的所有日志。
## warning:仅打印非常重要的信息。
loglevel notice
# 日志文件输出路径配置
## 该路径默认为空。可以根据自己需要把日志文件输出到指定位置。
logfile ""
# 数据库数量配置 默认:16
databases 16

持久化配置

RDB全量持久化配置(默认开启)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 持久化数据存储在本地的文件名称 默认:dump.rdb
dbfilename dump.rdb
# 持久化数据存储在本地的路径,默认:./(当前工作目录)
dir /data

# 用于设置RDB持久化的时间间隔和条件
## 表示每900秒内有至少1个写操作就保存一次RDB文件
save 900 1
## 表示每300秒内有至少10个写操作就保存一次RDB文件
save 300 10
## 表示每10秒内有至少1000个写操作就保存一次RDB文件
save 60 10000

# 当RDB持久化时出现错误无法继续时,是否阻塞客户端变更操作,错误可能因为磁盘已满/磁盘故障/OS级别异常等 默认:yes
stop-writes-on-bgsave-error yes
# 是否启用RDB文件压缩,默认: yes,压缩往往意味着额外的cpu消耗,同时也意味这较小的文件尺寸以及较短的网络传输时间
rdbcompression yes

AOF增量持久化配置

可以简单的认为 AOF 就是日志文件,此文件只会记录“变更操作”(例如:set/del 等),如果 server 中持续的大量变更操作,将会导致 AOF 文件非常的庞大,意味着 server 失效后,数据恢复的过程将会很长;事实上,一条数据经过多次变更,将会产生多条 AOF 记录,其实只要保存当前的状态,历史的操作记录是可以抛弃的;因为 AOF 持久化模式还伴生了“AOF rewrite”。

优点:可以保持更高的数据完整性,如果设置追加file的时间是1s,如果redis发生故障,最多会丢失1s的数据;且如果日志写入不完整支持redis-check-aof来进行日志修复;AOF文件没被rewrite之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的flushall)

缺点:AOF文件比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
# 是否开启AOF 默认:no
appendonly yes

# 指定AOF文件名称
appendfilename appendonly.aof

# 用于设置AOF文件的同步策略 默认:everysec
## 可以选择"always"、"everysec"或"no"。always表示每次写入都同步,everysec表示每秒同步一次,no表示由操作系统决定何时同步
appendfsync everysec

#当同时执行主进程的写操作和子进程的重写操作时,两者都会操作磁盘,而重写往往会涉及到大量的磁盘操作,这样就会造成主进程在写aof文件的时候出现阻塞的情形。
##如果该参数设置为no,是最安全的方式,不会丢失数据,但是要忍受阻塞的问题;
##如果设置为yes,这就相当于将appendfsync设置为no,这说明并没有执行磁盘操作,只是写入了缓冲区。因此这样并不会造成阻塞(因为没有竞争磁盘),但是如果这个时候redis挂掉,就会丢失数据。丢失多少数据呢?在linux的操作系统的默认设置下,最多会丢失30s的数据。
##如果应用系统无法忍受延迟,而可以容忍少量的数据丢失,则设置为yes;如果应用系统无法忍受数据丢失,则设置为no。
no-appendfsync-on-rewrite no

# 用于设置自动AOF重写的阈值。当AOF文件的扩展比例超过该值时,Redis会自动执行重写操作。默认值为100,表示当AOF文件的大小是上一次重写后大小的一倍时触发重写。
auto-aof-rewrite-percentage 100

# 用于设置自动AOF重写的最小大小。只有在AOF文件的大小大于该值时,才会执行重写操作。默认值为64MB,建议512mb
auto-aof-rewrite-min-size 64mb

# 用于设置在执行AOF文件重写时是否禁用同步。如果设置为yes,则在进行重写时不会进行同步操作,默认:no
no-appendfsync-on-rewrite no

# 用于设置在加载AOF文件时是否允许Redis忽略出现错误的命令。如果设置为"yes",则忽略错误;如果设置为"no",则不允许加载出现错误的AOF文件。默认:yes
aof-load-truncated yes

# 用于设置AOF文件的开头是否包含RDB格式的部分。如果设置为"yes",则在AOF文件的开头会先保存一份RDB格式的数据,这有助于加速数据加载。默认:no
aof-use-rdb-preamble no




安全认证配置

1
2
# 连接密码配置 默认无密码
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 主库的ip及端口 5.0以上使用replica的指令
# slaveof <masterip> <masterport>

# 主库,如果设置密码,需要加主库的密码
# masterauth <master-password>

# 当从节点与主节点连接失败了。这是yes,则表示从节点继续应答客户端;设置no,所有连接到这台从节点的客户端,会提示正在与主节点进行同步
slave-serve-stale-data yes

# 从节点只读。
slave-read-only yes

# 新的从节点或者从节点与主节点长期没有增量同步,需要全量同步
# 使用磁盘模式,会在从节点上新建redis快照的文件(根据配置)
# 使用socket方式,同步数据到从节点,不落地磁盘上,效率更高, 主节点可并行传输到多个从节点上。
repl-diskless-sync no

# 从节点,配置x秒,向主节点ping一次。
# repl-ping-slave-period 10

# 同时时间设置
# repl-timeout 60

# 使用更少的宽带同步,但是会导致从节点数据延迟,建议不设置
repl-disable-tcp-nodelay no

# 当从节点与主节点断开后,主节点同步的数据会缓存到缓冲区;开启这个配置,设置大小
# 如果不开启配置,则不缓存
# repl-backlog-size 1mb

# 当从节点一直没起来,设置这个数据为了是否缓冲区,如果配置0,则永久不释放。
# repl-backlog-ttl 3600

# 选举权重,越小权重越大,设置0,不参与
slave-priority 100

# 副本同步会存在延迟,至少3个写操作,时间延迟小于等于10秒的副本,主节点就停止写入操作。这两个参数只要一个设置为0,就禁用该功能
# min-slaves-to-write 3
# min-slaves-max-lag 10
#
# redis服务没有跟哨兵在同一个网络,比如:在容器里面跑,info replication查看到IP和端口,哨兵就有可能访问不到,这时候就需要,指定对外的IP和端口,提供给哨兵检测。
# slave-announce-ip 5.5.5.5
# slave-announce-port 1234

Redis key过期监听配置

过期key事件监听可用于订单超时处理和已完成订单自动评价等功能,当给对应的key设置的过期时间到了会自动通知客户端,客户端将监听到的数据进行处理。

1
2
3
# key过期监听 默认:""(关闭),将notify-keyspace-events设置为Ex代表开启
notify-keyspace-events Ex

Redis内存淘汰策略

内存淘汰算法

noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键

allkeys-lru:加入键的时候,如果过限,首先通过LRU算法驱逐最久没有使用的键

volatile-lru:加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最久没有使用的键

allkeys-random:加入键的时候如果过限,从所有key随机删除

volatile-random:加入键的时候如果过限,从过期键的集合中随机驱逐

volatile-ttl:从配置了过期时间的键中驱逐马上就要过期的键

volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键

allkeys-lfu:从所有键中驱逐使用频率最少的键

1
2
3
4
5
6
7
8
9
10
11
# 将redis存储内存设置100mb的界限,当超过这个数值开始走淘汰策略
maxmemory 100mb

# 配置策略 默认:noeviction
maxmemory-policy allkeys-lru

# LRU、LFU和最小TTL算法不是精确算法,而是近似算法
算法(为了节省内存),因此您可以根据速度或精确默认情况下,Redis将检查五个键并选择最近使用较少,可以使用以下命令更改样本大小
配置指令。默认值为5会产生足够好的结果。10非常接近真正的LRU,但成本更高的CPU。3更快,但不是很准确。
# maxmemory-samples 5

LAZY FREEING(惰性删除主要用于bigkey删除)

1
2
3
4
5
6
7
8
9
# lazy free可以认为是惰性删除或延迟释放,针对bigkey也有很好的释放策略,有效的针对bigkey带来的性能问题
# lazyfree-lazy-eviction 针对redis的超过了maxmeory,并设置了meory-prolicy情况下,在淘汰,释放使用lazy-free
lazyfree-lazy-eviction no
# lazyfree-lazy-expire 针对redis设置ttl淘汰策略,达到过期后,是否使用lazy-free
lazyfree-lazy-expire no
# lazyfree-lazy-server-del 是针对已经存在的key,会存在隐式的带来del操作,比如rename操作,就是先del操作。如果有bigkey,就可能会带来阻塞的情况
lazyfree-lazy-server-del no
# slave-lazy-flush 针对slave进行全量数据同步,slave在加载master的RDB文件前,会运行flushall来清理自己的数据场景, 参数设置决定是否采用异常flush机制
slave-lazy-flush no

lua 脚本

1
2
3
4
5
# lua脚本执行最大的时间
# lua脚本的好处①高效,在服务器上执行,节省了网络传输开销等,特别lua脚本,执行多个脚本,好处就体现出来了。
# lua脚本的好处②原子性;一个业务需要多个指令完成,lua脚本比较好的选择
# lua脚本的坏处:那就是如果你lua过于复杂,假如在里面取bigkey操作了,就会阻塞;执行时间过长;
lua-time-limit 5000

redis cluster 集群

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#
# 是否开启集群
# cluster-enabled yes

# 集群配置文件名,这个文件不需要人为配置,集群会自动更新这个配置
# cluster-config-file nodes-6379.conf

# 节点连接超时时间(毫秒)
# cluster-node-timeout 15000

# 在master宕机后,所有slave节点都会申请成为master;当由于redis节点与master连接过久,数据过于陈旧了。可能不适合做为master
# 通过过下公式可以来判断是否不适合
# (node-timeout * slave-validity-factor) + repl-ping-slave-period
# 假设15秒超时 * 这个默认配置10 + 从节点配置ping一次时间
# 15 * 10 + 10 = 160
# cluster-slave-validity-factor 10

# master的slave节点大于这个配置,则尝试把这个节点迁移到其他的master上。
# cluster-migration-barrier 1

# 默认情况下,集群全部的slot有节点负责,集群状态才为ok,才能提供服务。设置为no,可以在slot没有全
部分配的时候提供服务。不建议打开该配置,这样会造成分区的时候,小分区的master一直在接受写请求,而
造成很长时间数据不一致
# cluster-slave-no-failover no

慢记录 SLOW LOG

1
2
3
4
5
6
7
8
9
10
11
# 记录执行慢的指令,建议开启,这里单位是微妙
# 1000000 这里就是1秒;10000 = 100毫秒 = 0.1秒
# 设置0,强制记录所有,设置 < 0 则不记录慢日志
slowlog-log-slower-than 10000

# 慢查询日志长度。当一个新的命令被写进日志的时候,最老的那个记录会被删掉。这个长度没有限制。只要有足
够的内存就行。你可以通过 SLOWLOG RESET 来释放内存
# Redis使用了一个列表来存储慢查询日志。Redis 使用了一个List 实现了一个先进先出的队列
slowlog-max-len 128

# 可通过slowlog get 数量 slowlog len | slowlog reset

高级设置

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
# hash命令,个数及长度大于阈值就进行压缩,这里内部是为了节省空间
hash-max-ziplist-entries 512
hash-max-ziplist-value 64

#
list-max-ziplist-size -2

# list指令,是否可以进行压缩 0:表示禁止列表压缩 1:表示内部节点压缩
# 头部 -> 节点 -> 节点 ...> 尾部;内部节点进行压缩
list-compress-depth 0

set-max-intset-entries 512

# zset指令,个数及长度大于阈值就进行压缩,这里内部是为了节省空间
zset-max-ziplist-entries 128
zset-max-ziplist-value 64

# HyperLogLog 指令设置
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

hz 10

aof-rewrite-incremental-fsync yes

# lfu-log-factor 10
# lfu-decay-time 1

碎片清理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 为什么会有redis内存碎片?
# Redis存储存储数据的时候向操作系统申请的内存空间可能会大于数据实际需要的存储空间或者频繁的进行修改 就会导致内存碎片
# redis 内存碎片整理,默认是关闭,打开就开启内存碎片整理;要么就直接重启
# 要么设置这个地方
# activedefrag yes

# 内存碎片大于100m的时候就进行清理
# 内存碎片:used_memory_rss - used_memory
# active-defrag-ignore-bytes 100mb

# 内存碎片率计算:used_memory_rss(从操作角度来看,给redis分配的空间)/used_memory (redis使用的内容) ; 如果这里超过1.5,内存碎片就比较严重
# active-defrag-threshold-lower 10

# Maximum percentage of fragmentation at which we use maximum effort
# active-defrag-threshold-upper 100

# 内存碎片清理占用cpu比例不读与25
# active-defrag-cycle-min 25

# 内存碎片清理占用cpu比例不读与75
# active-defrag-cycle-max 75