redis5.0 配置文件

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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
# Redis configuration file example.
#
# 启动 redis-server 第一个参数必须指定配置文件的位置,不指定就使用默认的配置
# ./redis-server /path/to/redis.conf

# 单位,不区分大小写
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes

################################## INCLUDE #####################################

# 这里可以引入一个以上的其他配置文件,用于将通用配置和特殊配置区分开来,被引入的配置文件中也可包含其他配置文件
# include配置不会被 CONFIG REWRITE 或者 sentinel 重写,由于 redis 是以最后一个同名配置项为准的
# 因此最好将引入文件放在前面
include /path/to/local.conf
include /path/to/other.conf

################################## MODULE #####################################

# 指定服务启动时需要加载的模块,模块加载失败服务会终止
loadmodule /path/to/my_module.so
loadmodule /path/to/other_module.so

################################## NETWORK #####################################

# 为 redis 设置 IP 白名单,如果运行 redis 的服务器直接暴露在互联网中这很危险,要注意此项配置
# 如果把配置注释掉,所有 IP 都可通过
bind 192.168.1.100 10.0.0.1
bind 127.0.0.1 ::1
bind 127.0.0.1

# 保护模式是一个安全保护层,可以避免远程访问 redis 实例
# 如果保护模式打开:bind 配置无效、password 配置无效
# redis-server 只接受来自127.0.0.1和::1以及 Unix 套接字的链接
# 默认情况下保护模式开启
protected-mode yes

# 设置服务启动占用的端口
port 6379

# TCP/IP协议中backlog参数,他其实是一个限制 tcp 连接队列长度的参数,在高并发的环境下
# 你需要设置一个高的 tcp-backlog,以避免过慢的客户端连接占用连接池导致并发数量降低
# 超出队列长度的连接会被关闭,要确保同时提高 linux 的/proc/sys/net/core/somaxconn 和 tcp_max_syn_backlog
tcp-backlog 511

# 使用 unix socket 方式连接 redis-server 时 .sock 文件的路径以及访问权限
# 使用这种方式可以提高 TCP/IP 带来的性能瓶颈,
unixsocket /tmp/redis.sock
unixsocketperm 700

# 在一个客户端连接多少时间无操作后将其关闭
timeout 0

# 每隔多长时间发送一次 TCP ACK 标志用来检查连接是否存活
tcp-keepalive 300

################################# GENERAL #####################################

# 是否使用守护进程模式运行
daemonize no

# 通过upstart和systemd管理Redis守护进程
# no/upstart/systemd/auto
supervised no

# 以守护进程方式启动时,指定系统将 pid 写入的位置
pidfile /var/run/redis_6379.pid

# 日志等级
# debug (详细信息)
# verbose (较少的有用信息)
# notice (适度的信息,可用在生产环境)
# warning (只记录非常关键的信息)
loglevel notice

# 指定日志文件的位置
logfile ""

# 如果需要将日志记录在系统日志中,设置为 yes
syslog-enabled no

# 指定系统日志标识
syslog-ident redis

# 指定系统日志的设备,必须在 LOCAL0-LOCAL7 之间
syslog-facility local0

# 设置可用的数据库数量
databases 16

# 是否在交互式的标准输出中显示 redis 的 logo
always-show-logo yes

################################ SNAPSHOTTING ################################

# 将数据保存至硬盘,两项分别表示秒数和操作次数,两个条件达到其中一个就会发生保存操作
save 900 1
save 300 10
save 60 10000

# 默认情况下,如果 redis 启用了快照并且至少有一次保存操作,redis 将停止接收写入操作
# 这样可以使用户意识到出现了严重问题
# 如果 bgsave 又开始正常工作,redis 将恢复允许写入操作
# 如果已经设置了适当的数据监控和持久化策略,可以禁用此配置,防止因为权限、磁盘问题导致的接入失败
stop-writes-on-bgsave-error yes

# 对持久化的数据进行压缩
rdbcompression yes

# CRC64校验可以让数据格式更加安全,但是在加载 rdb 文件时会有10%左右的性能下降,可以去掉此配置以提高性能
rdbchecksum yes

# 设置持久化的文件名
dbfilename dump.rdb

# 设置 redis-server 工作主目录
dir ./

################################# REPLICATION #################################

# Master-Replica复制,使用replicaof让一个实例尽快复制另一个实例,下面快速了解下 ASAP 复制
# +------------------+ +---------------+
# | Master | ---> | Replica |
# | (receive writes) | | (exact copy) |
# +------------------+ +---------------+
# 1、redis复制是异步的,但是你能配置master节点不接受写入如果主master与副本没有都没有连接
# 2、如果复制链路断开时间相对较短,redis副本能够与主服务器执行部分数据的重新同步
# 3、复制是自动操作,不需要用户干预,网络分区副本重新连接之后将与主节点自动重新同步数据
replicaof <masterip> <masterport>

# 如果master节点有密码保护,即使用requirepass配置指令,则通过下面的配置在同步复制操作开始之前
# 告诉副本进行身份验证,否则master节点将拒绝复制请求
masterauth <master-password>

# 副本与主节点的连接断掉或者复制在进行中时,副本可以有两种工作方式
# 1、设置为yes,副本将在同步数据的同时应答客户端的命令请求,但是可能返回过期的数据或者返回空
# 因为现在的副本其实是需要被清空并且将主节点的数据完全复制过来的
# 2、如果设置为no,副本会对下面所有请求返回一个"SYNC with master in progress"的错误信息
# INFO, replicaOF, AUTH, PING, SHUTDOWN, REPLCONF, ROLE, CONFIG,
# SUBSCRIBE, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB,
# COMMAND, POST, HOST: and LATENCY.
replica-serve-stale-data yes

# 下面配置可以让副本接受写入数据,如果副本需要存储一些临时数据是有用的
# 因为副本与主节点进行数据同步时会将自己写入的数据删除,一般没影响
# 但是如何客户端因为配置错误导致数据写入,可能会出现问题
# 从redis 2.6开始副本默认只读
# 注意:只读副本的设计不是为了让他可以暴露在互联网上被不受信任的客户端连接
# 它只是一个防止滥用实例的保护层,只用一个只读副本导出所有的命令即可,例如CONFIG/DEBUG等
# 只读副本使用rename-command命令隐藏一些危险的命令操作,在一定程度上可以提高只读副本安全性
replica-read-only yes

# 复制同步策略:磁盘或者套接字
# -------------------------------------------------------
# 注意,现在磁盘复制是实验性质的
# -------------------------------------------------------
# 新的副本和重新连接的副本不能只是接收推过来的数据,需要执行"full synchronization"
# RDB文件从主节点传输至副本
# 1、Disk-backed 主节点创建一个新的进程,将RDB文件写入磁盘,然后递增的传输给副本
# 2、Diskless: 主节点创建一个新进程,直接将RDB文件写入副本socket,根本不接触磁盘
# disk-backed复制时一旦子进程写入磁盘完成,就可以同时为多个副本提供服务
# diskless复制时,新到来的副本只能等待当前正在复制的副本结束才能开始自己的复制过程
# 下面配置作用是diskless时主节点在开始传输之前等待一段可配置的时间,希望多个副本到达并且可以并行化传输
# 随着带宽的提升,diskless效果会更好一些
repl-diskless-sync no

# 使用diskless复制时,配置服务器等待的延迟,以便生成通过套接字将RDB传输到副本的子进程
# 这个很重要,因为一旦传输开始就不能为新到的副本提供服务,只能等待下一次RDB传输队列,所以这个配置是为了让更多的副本到达
# 延迟以秒为单位指定,设置为0秒禁用,传输会尽快开始
repl-diskless-sync-delay 5

# 副本定时向服务器发送ping命令,可以使用下面配置项修改此时间间隔,默认10秒
repl-ping-replica-period 10

# 下面的情况需要设置超时时间
# 1、副本进行数据复制期间的大容量传输I/O
# 2、从副本的角度看主节点的超时时间
# 3、从主节点角度看副本复制的超时时间
# 配置值大于repl-ping-replica-period很重要,否则主从节点通信质量不好时会出现各种超时
repl-timeout 60

# SYNC之后是否要禁用副本套接字上的TCP_NODELAY?
# 选择yes,redis将使用较少数量的TCP数据包和较少的带宽将数据发送给副本
# 但这可能会增加数据在副本出现的延迟,使用默认配置这个延迟最多能到40毫秒
# 选择no,数据传给副本的延迟将减少,但是耗费的带宽将增加
# 默认redis将会对低延迟进行优化,但是在大流量或者主节点和副本有很多跳转时,设置为yes是个好主意
repl-disable-tcp-nodelay no

# 设置副本backlog的大小,这个backlog是一个缓冲区,当副本断开连接的一段时间内这个副本会进行数据积累
# 当副本进行重连时通常不需要进行数据完全同步,只是部分同步即可,只传输断开连接时副本丢失的副本数据
# backlog设置的越大,允许副本断开的时间就越长
# 只有当至少一个副本被连接时,才会为backlog分配空间
repl-backlog-size 1mb

# 在主节点不再连接副本一段时间后,释放backlog,下面选项配置从上一个副本断开连接时到释放backlog所需要的时间
# 副本不会释放backlog,无论超时时间设置为了,因为副本以后可能会因为故障转移而提升为主节点
# 这样的话就需要副本能够正确的进行数据部分重新同步,因此副本会积累backlog
# 设置为0,永远不会释放backlog
repl-backlog-ttl 3600

# 复制优先级是由redis公开在info中的,他供sentinel使用,用于在主节点出错时进行故障转移
# 优先级低的副本被认为更加适合作为主节点,因此如果有10/100/25,那么会优先选择10的副本
# 有一个特殊的值0,用来表示不能被选择为主节点,因此snetinel一定不会选0优先级的副本作为主节点
replica-priority 100

# 可以配置主节点在连接的副本小于n个或者副本回应超过m秒时停止接受写入操作
# n个副本需要处于在线状态
# 滞后的秒数,必须小于等于一个特性的值,是从副本接收的最后一次ping计算的
# 例如需要至少3个延迟小于等于10秒的副本
min-replicas-to-write 3
min-replicas-max-lag 10
# 将其中任何一个设置为0即可禁用该特性
# 通常来说将min-replicas-to-write设置为0,min-replicas-max-lag设置为10

# 主节点能够以多种方式列出副本的地址和端口
# 例如使用 INFO replication 提供基本信息,sentinel能够使用此信息进行副本发现
# 此信息可用的另一个位置是role命令的输出信息
# 由副本主动报告的IP和端口从以下途径获得
# IP:通过检查副本使用的socket的peer地址来自动获取,以便和主节点连接
# Port:端口在复制握手期间由副本传递,通常是副本用来监听服务的端口
# 然而当使用端口转发或网络地址转换(NAT)时,副本实际上可以通过不同的IP和端口来访问
# 副本可以使用以下两个选项,以便向主节点报告一组特定的IP和端口,让info和role都可以拿这些值
# 如果需要重写端口或IP地址,则不需要重写这两个配置
replica-announce-ip 5.5.5.5
replica-announce-port 1234

################################## SECURITY ###################################

# 设置 redis-server 连接密码
requirepass foobared

# 重命名/禁用命令
rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
rename-command CONFIG ""

################################### CLIENTS ####################################

# 设置可以连接的客户端最大数量,redis 会保留一部分文件描述符供内部使用
# 超出的连接将提示 max number of clients reached
maxclients 10000

############################## MEMORY MANAGEMENT ################################

# 将内存使用限制设置为指定的字节数,当达到内存限制时,redis将根据设置的数据淘汰策略尝试删除key
# 如果redis无法根据数据淘汰策略移除key,或者淘汰策略被设置为noeviction
# 内存使用满了之后每次写入操作都会触发数据淘汰策略,优先删除设置了expire的键值,如果数据已经无法淘汰
# redis将会对所有想要使用更多内存的命令返回错误消息,例如set/lpush等命令,依旧会正常回复读操作
# 当redis作为LRU/LFU缓存使用或者要对内存用量设置限制时,这个配置就很有用
# 注意:如果使用主从复制,那么设置maxmemory时要将所需要的缓冲区大小从总内存大小中减去
# 为缓冲区提供一些内存使用,因为如果不为缓冲区提供内存,那么在发生删除键的操作时会向从节点发送删除命令
# 会占用缓冲区,然后redis的可用内存遭到挤压,导致触发淘汰策略,更多的键被淘汰,然后这些del命令又被加入缓冲区
# 导致redis占用的内存数量又遭到挤压,形成恶性循环,最后redis中所有的数据都被删除
# TODO:有一个问题,缓冲区中的数据量不会减少吗?缓冲区中的命令会均匀的发出吧?
# 如果有slaver的情况下,建议适当调低maxmemory,给output buffer留出一定的可用空间是合理的。
# 总之,如果你要做主从节点,那么建议设置内存的使用上限,同时给缓冲区留出一些空间
maxmemory <bytes>

# 数据淘汰策略,当内存用量达到最大内存时,redis将选择使用何种方式进行数据淘汰
# volatile-lru -> 在设置了过期时间的key中使用LRU方式淘汰数据
# allkeys-lru -> 直接使用LRU方式淘汰数据
# volatile-lfu -> 在设置了过期时间的key中使用LFU方式淘汰数据
# allkeys-lfu -> 直接使用LFU方式淘汰数据
# volatile-random -> 随机删除带有过期时间的key
# allkeys-random -> 随机删除一个key
# volatile-ttl -> 删除离过期时间离当前时间最近的key
# noeviction -> 不删除任何数据,内存满了后在写入时返回一个错误
# 注意:在上面的部分策略中,如果redis找不到可以淘汰的key,也会返回一个错误
# 会触发错误的命令有: 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
maxmemory-policy noeviction

# LRU/LFU/最小TTL都不是精确算法,而是近似算法,这样的目的是为了节省内存,所以你可以根据速度和精度来调整
# 默认redis每次抽出5个key挑出符合要求的一个,可以用下面配置修改这个值
# 默认的5基本会产生一个比较好的结果,设置为10即非常接近准确的LRU方式但要消耗更多的CPU,3最快,但不准确
maxmemory-samples 5

# 从redis5开始,从节点忽略maxmemory设置,也就是说key的删除由master节点处理,然后将del命令发送给从节点
# 这样是为了保证主从数据一致,并且也是大家想要的结果,但是如果副本设置了可写,或者你希望副本具有不同的内存设置
# 那么你一定要明白自己修改了这个值意味着什么
# 由于副本默认不进行数据淘汰,因此它有可能会使用比主节点更多的内存,因此要保证副本所在的机器有足够的内存
replica-ignore-maxmemory yes

############################# LAZY FREEING ####################################

# redis有两个删除key的原始方法,一个是DEL对象阻塞式的删除,这意味着服务器将会停止处理新的命令
# 以便可以以同步的方式回收与被删除的key相关联的内存,如果删除的key与一个小的对象有关
# 那么速度会很快,如果key与包含数百万的数值集合关联,则服务器会阻塞较长的时间来完成这个操作
# FLUSHALL和FLUSHDB的DEL/UNLINK/ASYNC是由用户控制的
# 让程序来决定使用何种方式比较好,但有时需要redis服务必须删除key或者刷新整个数据库,这是其他操作的副作用
# 特别是在下面场景下,redis会自主的删除对象
#1、在淘汰数据时,由于maxmemory和淘汰策略配置,为了给新数据腾出空间,并且不超过内存限制
#2、一个键过期后必须从内存中删除
#3、由于某些命令导致的数据删除,例如重命名,重复的set等操作使得必须删除旧数据
#4、在主从复制时,从节点要完全复制主节点的数据,必须删除整个数据库的内容
# 默认情况下,上述四种命令删除方式都是阻塞方式,就和调用DEL一样,但是可以通过下面四个命令
# 配置以非阻塞方式释放内存,就像调用UNLINK一样
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no

############################## APPEND ONLY MODE ###############################

# redis 默认异步的将数据持久化到磁盘上,在大多数时候这是没有问题的
# 但有时 redis 挂掉后重载全部数据要耗费一些时间
# AOF 模式是一种更好的持久化数据解决方案,它使用 fsync 进行数据写入
# 就算 redis 挂掉,只要系统不挂掉,就能保证写入成功
# AOF 和 RDB 两种方式可以同时启用不会有冲突,如果启用了 AOF,那么优先加载 AOF 备份文件
appendonly no

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

# fsync 方法告知操作系统尽快将数据写入磁盘,而不是等待缓冲区中积累更多数据
# AOF 持久化方式 redis 支持三种数据写入磁盘模式:
# no 不使用 fsync,让操作系统决定何时刷新缓冲区写入磁盘,最快,不太安全
# always 每次操作后都用 fsync 进行数据写入,最慢,最安全
# everysec 每秒写入一次,就算丢数据也能丢的少一点儿
# 默认使用每秒写入,这是一个介于速度和安全之间的一个选择,这取决于你的理解
# 想要获得更高的安全性还是获得更快的速度

appendfsync always
appendfsync everysec
appendfsync no

# AOF 写入如果被设置为 always 或者 everysec,后台写入进程可能会导致 IO 阻塞
# 在一些 linux 配置中可能会阻塞很长时间,这个问题目前还没有得到解决
# 为了避免这个问题,可以配置下面项,当 BGSAVE 或者 BGREWRITEAOF 正在进行时,防止主进程调用 fsync
# 当一个存储进程正在继续时,redis持久化操作和“appendfsync none”等同,这意味着使用 linux 默认配置
# 的最坏情况下,最多将损失30秒的数据
# 如果你有超时阻塞问题,就设置为 yes,否则设置为 no,这是比较安全的做法
no-appendfsync-on-rewrite no

# AOF 重写机制,redis 能够后台自动重写 AOF 日志文件,清理垃圾数据
# BGREWRITEAOF 命令是当 AOF 日志文件大小超过指定的百分比后进行重写
# redis 会记录最后一次重写后 AOF 文件的大小
# 基础文件大小就是当前文件大小,当文件大小超过了来配置的百分比后,将会触发重写
# 你需要为要重写的 AOF 文件指定最小的大小,也就是说文件大小如果未达到这个值
# 即时文件增长率达到了设置值也不会发生重写
# 将百分比设置为0可以禁用自动重写机制
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# AOF 文件有时会出现被截断的问题,比如 redis 重启时正在将 AOF 写入内存,这只会出现在
# redis 运行崩溃时,已经写入缓存的不会丢失
# redis 在发生错误时会退出,再次重启时如果发现 AOF 文件被截断,则加载尽可能多的数据后启动
# 如果下面配置设置为 yes,则 redis 加载被截断的文件时会向日志文件加入信息说加载了被截断的 AOF 文件
# 设置为 no 会启动失败,此时需要用户手动调用 redis-check-aof 程序修复 aof 文件
# 请注意,如果 AOF 文件中间被损坏,服务依旧会报错退出,下面配置项只适用在 redis 尝试从
# AOF 文件读取更多数据,但是不会补足缺失的数据
# 这个配置的本质就是设置 AOF 文件备份出现问题时 redis 如何选择启动策略
aof-load-truncated yes

# 重写 AOF 文件时,redis能够使用 RDB 作为前导让 AOF 更加快速的备份和恢复
# 如果打开这个配置项,重写的 AOF 文件将由下面两部分字节组成
# [RDB file][AOF tail]
# redis 启动时识别出 AOF 文件以 "REDIS" 开始就会加载带前缀的 RDB,然后继续加载后缀 AOF
aof-use-rdb-preamble yes

################################ LUA SCRIPTING ###############################

# 设置 lua 脚本的最大执行时间
# 如果超过最大执行时间,redis 将把脚本已经超过最大执行时间但是仍未结束记录在日志中,并报错
# 当长时间运行的脚本超过最大执行时间时,只有 SCRIPT KILL 和 SHUTDOWN NOSAVE 可用
# SCRIPT KILL 命令用来停止一个还未写入命令的脚本
# SHUTDOWN NOSAVE 用在脚本已经发出写入命令但是用户不愿等待脚本执行结束情况下主动停止脚本进程
# 设置为0或者负值,脚本将无警告一直执行直到结束
lua-time-limit 5000

################################ REDIS CLUSTER ###############################

# 开启集群
cluster-enabled yes

# 集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息
# 这个文件并不需要手动配置,这个配置文件有Redis生成并更新
# 每个Redis集群节点需要一个单独的配置文件,请确保与实例运行的系统中配置文件名称不冲突
cluster-config-file nodes-6379.conf

# 节点互连超时的阈值。集群节点超时毫秒数
cluster-node-timeout 15000

# 在进行故障转移的时候,全部slave都会请求申请为master
# 但是有些slave可能与master断开连接一段时间了,导致数据过于陈旧
# 这样的slave不应该被提升为master。该参数就是用来判断slave节点与master断线的时间是否过长
# 判断方法是:
# 比较slave断开连接的时间和(node-timeout * slave-validity-factor) + repl-ping-slave-period
# 如果节点超时时间为三十秒, 并且slave-validity-factor为10
# 假设默认的repl-ping-slave-period是10秒,即如果超过310秒slave将不会尝试进行故障转移
cluster-replica-validity-factor 10

# master的slave数量大于该值,slave才能迁移到其他孤立master上,
# 如这个参数若被设为2,那么只有当一个主节点拥有2 个可工作的从节点时,它的一个从节点会尝试迁移。
cluster-migration-barrier 1

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

# 设置为yes时,会阻止副本在主节点故障期间尝试故障转移其主节点
# 但是,如果强制执行此操作,主节点仍可执行手动故障转移
# 这在不同的场景中很有用,特别是在多个数据中心操作的情况下
# 如果不是在总DC故障的情况下,我们希望永远不会提升一方
cluster-replica-no-failover no

########################## CLUSTER DOCKER/NAT support ########################

# 在某些情况下,redis集群节点地址自动发现失败了,因为地址是NAT或者端口被转发,典型的是docer和其他容器
# 为了使集群可以在这种环境中工作,需要一个静态配置其中每个节点都知道其公共地址
# * cluster-announce-ip
# * cluster-announce-port
# * cluster-announce-bus-port
cluster-announce-ip 10.1.1.5
cluster-announce-port 6379
cluster-announce-bus-port 6380

################################## SLOW LOG ###################################

# redis 慢查询日志是一个记录超过指定执行时间的查询的系统,执行时间不包括 I/O 操作
# 如与客户端交互、发送回复等,只包括实际执行这条命令所需的时间(这个阶段线程堵塞,不能服务于其他请求)
# 有两个可配置项:
# 一个配置项用于规定执行时间超过多长时间的查询算是慢查询
# 另一个参数是慢查询日志的记录长度,用于当要记录新的慢查询时从旧的命令记录中删除旧命令
# 慢查询命令的时间配置单位是微秒,所以1000000相当于1秒
# 使用负数是禁用慢查询日志,设置为0的话会记录所有命令
slowlog-log-slower-than 10000
# 日志记录栈长度没有限制,只是会消耗部分内存,可以使用 SLOWLOG RESET 回收所有内存
slowlog-max-len 128

################################ LATENCY MONITOR ##############################

# TODO:和慢查询日志有什么区别
# latency-comitor-threshold 监控的范围更广一些,不仅包括命令执行,也包括fork系统调动,key过期等操作的耗时
# log仅仅是记录纯命令的执行耗时,不包括与客户端的IO交互以及redis fork等耗时

# redis 延迟监控子系统用于在运行时采样不同的操作,以便收集与 redis 实例延迟相关的数据
# 通过 LATENCY 命令该信息可被用于使用打印图表
# 系统只记录执行时间大于等于配置的延迟毫秒数阈值的指令,设置为0延迟监控器会关闭
# 默认情况下,延迟监控被禁用,如果你没有延迟问题,通常不需要延迟监控,因为会对性能产生影响
# 影响虽然非常小,可以在大负载下测试这个配置项,可以使用
# CONFIG SET latency-monitor-threshold <milliseconds> 轻松启用延迟监控
latency-monitor-threshold 0

############################# EVENT NOTIFICATION ##############################

# redis能够向pub/sub客户端通知keyspace中发生的事件(http://redis.io/topics/notifications)
# 栗子:如果启用了keyspace事件通知,并且客户端对存储在数据库0中的密钥foo执行del操作,将发布两条消息
# PUBLISH __keyspace@0__:foo del
# PUBLISH __keyevent@0__:del foo
# 每个事件都有一个字符标识
# K Keyspace events, published with __keyspace@<db>__ prefix.
# E Keyevent events, published with __keyevent@<db>__ prefix.
# g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...
# $ String commands
# l List commands
# s Set commands
# h Hash commands
# z Sorted set commands
# x Expired events (events generated every time a key expires)
# e Evicted events (events generated when a key is evicted for maxmemory)
# A Alias for g$lshzxe, so that the "AKE" string means all the events.
# notify-keyspace-events 将由零个或多个字符组成的字符串作为参数,空字符串标识禁用通知
# 例如:notify-keyspace-events Elg
# 例如要订阅过期的key要订阅 __keyevent@0__:expired 频道
# notify-keyspace-events Ex
# 默认被禁用,大多数用户不需要这个特性
notify-keyspace-events ""

############################### ADVANCED CONFIG ###############################

# 当hash中的value较少并且最大数量不超过给定阈值时用内存高效的hash结构对数据进行编码,使用下面指令配置阈值
hash-max-ziplist-entries 512
hash-max-ziplist-value 64

# list也可以用特殊的编码方式,可以节省大量空间
# list节点可以配置为固定的字节占用数或者设置每个节点中元素的数量
# 对于固定大小有下面一些配置:
# -5: max size: 64 Kb <-- 不建议用于正常的工作中
# -4: max size: 32 Kb <-- 不建议
# -3: max size: 16 Kb <-- 不太推荐
# -2: max size: 8 Kb <-- 推荐
# -1: max size: 4 Kb <-- 推荐
# 正数意思是存储在每个节点中的元素数量,设置合理的值可以有效减少内存碎片
# 通常选择-2或者-1
list-max-ziplist-size -2

# list可以被压缩
# 压缩深度是从list的*each*边到*exclude*边的节点的quicklist ziplist的数量
# list的头部和尾部始终是未压缩的,用于快速的push/pop操作,设置:
# 0: 禁用list压缩
# 1: 在至少一个节点进入列表中时压缩,从头部或尾部开始
# [head]->node->node->...->node->[tail]
# [head], [tail] 将不会被压缩,中间的节点会被压缩
# 2: [head]->[next]->node->node->...->node->[prev]->[tail]
# 不压缩 head or head->next or tail->prev or tail 但是压缩所有的中间节点
# 3: [head]->[next]->[next]->node->node->...->node->[prev]->[prev]->[tail]
# ......一直延续,设置为几前后就各有几个节点不压缩
list-compress-depth 0

# 如果集合包含的所有成员都可以被解释为十进制整数,而这些整数又处于平台的有符号整数范围之内,
# 并且集合成员的数量满足配置文件中的限制条件,那么Redis就会以有序整数数组的方式存储集合。
# 这种存储方式又被称为整数集合(intset),下面设置整数的大小限制
set-max-intset-entries 512

# 类似于hash和list,zset也有特殊的编码以节省大量的空间,只有当zset中元素数量小于128个并且
# 每个元素占用字节数小于64时才会使用此编码
zset-max-ziplist-entries 128
zset-max-ziplist-value 64

# value大小小于等于hll-sparse-max-bytes使用稀疏数据结构(sparse),
# 大于hll-sparse-max-bytes使用稠密的数据结构(dense)。
# 一个比16000大的value是几乎没用的,建议的value大概为3000。
# 如果对CPU要求不高,对空间要求较高的,建议设置到10000左右。
hll-sparse-max-bytes 3000

# streams宏节点每项的最大值,stream数据结构是大节点的基数数,其编码内部的多个项目
# 使用此配置可以配置单个节点的字节数以及在附加新的stream项时切换到新的节点之前可能包含的最大项目数
# 将下面两项任意设置为0,就会忽略该限制
stream-node-max-bytes 4096
stream-node-max-entries 100

# Redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用。
# 当你的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,
# 把这项配置为no。如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存。
activerehashing yes

# 对客户端输出缓冲进行限制可以强迫那些不从服务器读取数据的客户端断开连接,
# 用来强制关闭传输缓慢的客户端。
# 对于normal client,第一个0表示取消hard limit,
# 第二个0和第三个0表示取消soft limit,normal client默认取消限制,因为如果没有寻问,他们是不会接收数据的。
client-output-buffer-limit normal 0 0 0

# 对于slave client和MONITER client,如果client-output-buffer一旦超过256mb,
# 又或者超过64mb持续60秒,那么服务器就会立即断开客户端连接。
client-output-buffer-limit slave 256mb 64mb 60

# 对于pubsub client,如果client-output-buffer一旦超过32mb,
# 又或者超过8mb持续60秒,那么服务器就会立即断开客户端连接。
client-output-buffer-limit pubsub 32mb 8mb 60

# 客户端查询缓冲区新命令的累计数量,默认被设置为固定数量,以避免协议同步破坏导致查询缓冲区中未被绑定使用的内存
# 如果有很多mulit/exec可以配置此项
client-query-buffer-limit 1gb

# 在redis中,批量请求(即表示单个字符串的元素)通常限制为512M
proto-max-bulk-len 512mb

# redis中调用内部函数来执行许多后台任务,比如关闭超时的客户端、清除无用的过期key等
# 并不是所有任务都以相同的频率进行,redis会根据设置的hz值来检查要执行的任务
# 默认情况下hz设置为10,当redis处于空闲状态时,提高该值将提高CPU利用率
# 当很多key同时到期时,redis会更快的响应
# 可以设置的范围在1-500之间,但是超过100的值通常不是一个好主意
# 仅仅在需要非常低的延迟环境中需要将其提高到100
hz 10

# hz值与连接的客户端数量成正比是有用的,这有助于避免后台任务调用处理太多的客户端
# 由于默认的值设置为10,比较保守,因此redis提供并启用默认的自适应的hz,当许多客户端连接时会临时提高
# 当启用动态hz时,实际配置的hz值将被当做基线,一旦连接了更多的客户端,将会根据实际情况改为配置值的倍数
# 这样空闲实例将使用很少的CPU时间,而忙碌的实例响应会更快
dynamic-hz yes

# 在aof重写的时候,如果打开了aof-rewrite-incremental-fsync开关
# 系统会每32MB执行一次fsync。这对于把文件写入磁盘是有帮助的,可以避免过大的延迟峰值。
aof-rewrite-incremental-fsync yes

# 在redis保存RDB文件时,如果打开了rdb-save-incremental-fsync开关
# 系统会每32MB执行一次fsync。这对于把文件写入磁盘是有帮助的,可以避免过大的延迟峰值。
rdb-save-incremental-fsync yes

# redis可以调整LFU淘汰策略,但是最好不要随便修改,只在调查如何改进性能以及LFU如何随时间变化后更改
# 这可以通过 OBJECT FREQ 命令进行检查
# Redis LFU实现中有两个可调参数:计数器对数因子和计数器衰减时间。 在更改它们之前,了解这两个参数的含义非常重要
# LFU计数器每个键只有8位,它的最大值是255,因此Redis使用具有对数行为的概率增量
# 给定旧计数器的值,当访问key时,计数器以下面方式递增:
# 1、 提取0-1之间的随机数
# 2、 概率P计算为1 /(old_value * lfu_log_factor + 1)
# 3、 只有 R < P 时计数器递增
# 默认的lfu-log-factor为10.这是一个表格,说明频率计数器如何随着具有不同对数因子的不同访问次数而变化:
# +--------+------------+------------+------------+------------+------------+
# | factor | 100 hits | 1000 hits | 100K hits | 1M hits | 10M hits |
# +--------+------------+------------+------------+------------+------------+
# | 0 | 104 | 255 | 255 | 255 | 255 |
# +--------+------------+------------+------------+------------+------------+
# | 1 | 18 | 49 | 255 | 255 | 255 |
# +--------+------------+------------+------------+------------+------------+
# | 10 | 10 | 18 | 142 | 255 | 255 |
# +--------+------------+------------+------------+------------+------------+
# | 100 | 8 | 11 | 49 | 143 | 255 |
# +--------+------------+------------+------------+------------+------------+
# 上面表格是通过运行下面命令获得的
# redis-benchmark -n 1000000 incr foo
# redis-cli object freq foo
# 注2:计数器初始值为5,以便为新对象提供累积命中的机会
# 计数器衰减时间是必须经过的时间,以分钟为单位,以便将密钥计数器除以2(或者如果它具有小于<= 10的值则递减)
# lfu-decay-time设置为0每次扫描都会使用计数器衰减时间
lfu-log-factor 10
lfu-decay-time 1

########################### ACTIVE DEFRAGMENTATION #######################

# 这个特性是实验性质的,虽然已经在生产环境进行了压力测试,并且多个功工程师用一段时间进行了人工测试
# 什么是主动的碎片整理?
# 活动碎片整理允许redis服务压缩内存中小数据分配和数据释放之间的空间,从而允许内存回收
# 碎片化是在分配器和工作负载中发生的一个很自然的过程,通常需要重新启动服务器来减少碎片
# 或者至少清除所有数据并重新创建服务,由于redis4中实现的新特性,可以在服务运行时以热
# 运行的方式进行碎片清理,即服务不中断并且进行碎片整理
# 基本上当碎片超过一定的level时,redis将利用某些特定的Jemalloc功能在相邻的区域中创建key的新副本
# 同时释放旧的数据副本,对于所有键,以递增方式重复此过程,将会使碎片减少到一个正常值
# 理解一些更重要的事情:
# 1、这个特性默认是禁用的,并且只有在编译redis源码中提供的Jemalloc副本时才有效,这是linux版本的默认设置
# 2、如果不存在碎片问题则不需要启用此功能
# 3、一旦出现碎片,你可以使用"CONFIG SET activedefrag yes"启用此功能
# 配置下面的参数可对碎片整理过程中的行为进行微调,如果你不确定他们的意思,最好保留默认值
# 启用碎片整理
activedefrag yes

# 当碎片大小超过多少时开始碎片整理
active-defrag-ignore-bytes 100mb

# 当碎片量超过整体数据的百分比为多少时开始整理
active-defrag-threshold-lower 10

# 进行碎片整理时,尽多大的可能去整理碎片,注意这个配置和上面的配置看似对应,其实仔细理解并不是
# active-defrag-threshold-lower配置的目的是为了标识碎片占整体量
# 而这个配置是为了告诉redis整理多少百分比的碎片,也就是碎片总量的多少
active-defrag-threshold-upper 100

# 整理碎片时消耗的CPU最小百分比
active-defrag-cycle-min 5

# 整理碎片时消耗的CPU最大百分比
active-defrag-cycle-max 75

# 整理时清理的set/hash/zset/list字段的最大数目
active-defrag-max-scan-fields 1000
参考