1 基础配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#带配置文件的启动方式
cd /usr/local/redis
./bin/redis-server redis.node1.6379.conf

#将指定配置文件包含进当前配置文件
include /usr/local/redis/redis-pub.conf

#在redis配置文件中
# 1k = 1000 bytes
# 1kb = 1024 bytes
# 1m = 1000000 bytes
# 1mb = 1024*1024 bytes
# 1g = 1000000000 bytes
# 1gb = 1024*1024*1024 bytes
# 并且这些单位字符不分大小写, 1MB 1mb 1mB 1Mb都是一样。

2 网络配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#绑定ip
bind 0.0.0.0
#绑定端口
port 6379
#是否保护模式
#no,外部可以直接访问
#yes则按照绑定ip、端口,如果设置了密码,还需匹配密码
protected-mode yes
#客户端连接,空闲多少秒关闭,0不关闭
timeout 0
#定时向client连接发送tcp ack探测是否存活
tcp-keepalive 300
#TCP完成3次握手的连接, 连接队列总数
#但最终由linux内核决定最终的队列总数
#/proc/sys/net/ipv4/tcp_max_syn_backlog 半连接未完成3次握手的 连接队列总数
#/proc/sys/net/core/somaxconn 已建立连接的 连接队列总数
#此值须与somaxconn保持一致,建议设为2048,同时适当提高tcp_max_syn_backlog 半连接数量
tcp-backlog 511

3 通用配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#守护进程方式启动,后台运行,并将进程pid号写入指定文件
daemonize yes
#管理守护进程的方式,默认no,一般无需改动
#可选linux的upstart/systemd
supervised no
#守护进程方式启动时,pid号写入的文件
pidfile /usr/local/redis/redis.noed1.6379.pid

#日志等级,按日志量debug > verbose > notice(生产) > warning
#debug,输出打量调试信息
#verbose,冗长的,但是比debug输出信息少
#notice,生产模式
#warning,只输出警告信息
loglevel notice
#日志文件路径
logfile "/usr/local/redis/logs/redis.node1.6379.log"
#数据库数量,默认16
databases 16
#启动时,是否输出logo信息
always-show-logo yes

4 快照配置(RDB 持久化)

RDB 持久化,即按频率规则配置,定期将数据快照写入磁盘,格式为 rdb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#默认持久化配置
save 900 1 #900秒内,操作了1个key则持久化
save 300 10 #300秒内,操作了10个key则持久化
save 60 10000 #60秒内,操作了1w个key则持久化

#持久化出现错我是否继续工作,默认yes
stop-writes-on-bgsave-error yes
#是否压缩rdd文件,会消耗一定CPU资源,默认yes, 可根据实际情况关闭
rdbcompression yes
#是否校验rdb文件的数据,会消耗一定CPU资源,默认yes,可根据实际情况关闭
rdbchecksum yes
#rdb文件名称
dbfilename dump.rdb
#主从模式,是否同步删除rdb文件,默认no,也不推荐开启
rdb-del-sync-files no
#磁盘数据文件保存目录,默认redis运行时根目录
dir /usr/local/redis/data/

5 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
#是否开启AOF持久化,默认关闭
appendonly no

#aof持久化文件的名称,路径跟随dir参数
appendfilename "appendonly.aof"

#aof频率,默认everysec,每秒写一次磁盘(fsync)
#always 每一个指令都写一次磁盘,耗费资源,效率低
#no 完全由linux的fsync决定,大部分linux是30秒一次fsync
appendfsync everysec

#aof文件正在后台rewrite期间是否调用fsync写磁盘
#默认no,表示调用
no-appendfsync-on-rewrite no

#aof文件增长百分比,即当前aof文件比上次重写的文件,增长大小的比例
#默认100% 倍数增长
auto-aof-rewrite-percentage 100
#aof文件重写条件,至少达到此参数大小,作用于首次重写文件,默认64mb
auto-aof-rewrite-min-size 64mb
#redis恢复数据时,忽略最后一条有错误的指令,默认yes
#配置no的话,如果aof文件最后一条指令有问题,直接恢复失败
aof-load-truncated yes

#AOF重写的时候,将把rdb快照和aof记录的指令一起写入,默认yes
#这种混合持久化,可以大大提高数据多的实例,重启加载数据的速度
aof-use-rdb-preamble yes

6 安全配置

1
2
#访问密码,默认未开启此配置,无需匹配密码
requirepass 1234556

7 客户端配置

1
2
# 同一时间最大的客户端连接数,默认不开启
maxclients 10000

8 内存管理配置

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
#设置最大内存,推荐物理内存的3/4,默认未开启配置,不限制内存上限
maxmemory 1gb

#内存达到上限后的策略,默认noeviction策略
#volatile-lru 使用LRU算法,在设置了过期时间的key中选择,淘汰最后使用时间最远的
#allkeys-lru 使用LRU算法,在所有key中选择,淘汰最后使用时间最远的,推荐
#volatile-lfu 使用LFU算法,在设置了过期时间的key中选择,淘汰最不常使用的
#allkeys-lfu 使用LFU算法,在所有key中选择,淘汰最不常使用的,推荐
#volatile-random 在
#allkeys-random 在所有key中进行随机淘汰
#volatile-ttl 淘汰过期时间最近的key
#noeviction 不淘汰任何key,对继续写入请求响应错误
# 如OOM command not allowed when used memory
maxmemory-policy allkeys-lru

#LRU/LFU/TTL淘汰策略算法,不是精准算法,是近似算法
#设置样本数量,提高准确度。默认5折中,3最快,10最精确
#如果是LRU,样本数量会增加一定的CPU资源占用
maxmemory-samples 5

#从节点,忽略内存上限。
#由于从节点不会主动写数据 删数据 自动淘汰,这些操作是通过主节点实现然后将命令发送给从节点
#如果从节点不忽略内存上限,会有数据一致性的问题。
replica-ignore-maxmemory yes

#在一个过期key扫描周期内,过期的key,仍然保留在内存的比例
#默认1即一个过期key的淘汰周期里,保留10%
#值越小,代表保留的key越少,需要删除的key更多,因此消耗CPU资源增加
#参数hz默认10,1秒10次异步线程扫描过期key,即每100ms扫描一次过期key
active-expire-effort 1

9 惰性释放配置

​ 惰性释放(懒删除),即先摘除 key 的索引,实际删除操作使用异步线程去执行。在惰性删除机制之前,如一个元素非常多的集合,直接删除会很低效,导致其它连接发起的指令阻塞。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#针对内存达到上限后,触发淘汰策略时, 进行懒删除
# 默认no,建议no,毕竟已经达到内存上限
# 如果大key较多的库,也可以yes,尽快减轻阻塞
azyfree-lazy-eviction no

#针对设置自动过期的key,进行懒删除,默认no
#建议开启
lazyfree-lazy-expire yes

#针对隐式del指令,进行懒删除
#如rename 改名, mv 移库,都是隐式删除原key
#建议开启
lazyfree-lazy-server-del yes

#此配置针对 从节点的flush的操作,是否进行懒删除
#比如 从节点全量同步主节点数据时,会先flush清空数据
#如果是迁移或预扩节点准备数据,可以开启,但生产使用后建议关闭
replica-lazy-flush no

#使del指令和unlink一样,异步线程做实际删除
lazyfree-lazy-user-del no

10 多线程配置

6.0 后,Redis 开始引入多线程配置,但不是真正多线程读写内存数据,执行指令扔是单线程顺序执行。多线程部分只是优化网络 I/O,

1
2
3
4
5
# 是否开启多线程模式,默认no,
io-threads-do-reads no

#线程数,官方建议4核时,2-3个线程;8核时6个线程
io-threads 4

11 主从复制

​ 实践中一般不单独使用主从复制,需要配合哨兵模式,便于故障后自动选新 master 节点。

​ 实践中的高可用方式,一般是 主从+哨兵,或者 Cluster集群模式,以及三方中间件代理,类似数据分片中间件,如 codis。

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
####################### 主从复制 START ###########################

#slave节点配置此参数,启动时便与master建立主从关系
#也可以在实例运行后,在slave节点使用slaveof命令建立关系
replicaof masterIp masterPort
#5.0之前slaveof ip port

#如果使用此配置启动的节点作为slave从节点,此参数填master节点的密码
masterauth masterPwd
#从节点与主节点断连,或从节点正在拷贝数据时,是否提供查询服务
#默认yes 提供服务
replica-serve-stale-data yes
#从节点是否只读,默认yes,推荐yes
replica-read-only yes

#主从同步,新节点需要完整数据,
#此参数决定数据快照rdb传输的方式
#默认no,不使用无磁盘,即master先写盘rdb文件,再将文件传送到从节点
#yes表示使用无盘,master创建一个新进程,直接把rdb ,socket到从节点
repl-diskless-sync no
#无盘同步数据的延时参数,默认5
#即master 延迟多少秒后开始传送数据流
repl-diskless-sync-delay 5

#新节点同步数据,是否无盘加载数据
#disabled 不要使用无磁盘加载,先将rdb文件存储到磁盘,推荐
#on-empty-db 只有在完全安全的情况下才使用无磁盘加载
#swapdb 直接从Scoket套接字加载数据
repl-diskless-load disabled

#从节点向master节点进行心跳检测的周期,默认10s
repl-ping-replica-period 10
# 从节点向master节点检查心跳,超时时间,默认60秒
repl-timeout 60

#同步是否禁用TCP_NODELAY
#默认no 不禁用,即开启TCP_NODELAY,禁用TCP Nagle算法
#同步传输的TCP连接会按TCP_NODELAY拆成小包,降低延迟
repl-disable-tcp-nodelay no

#从节点端口后这段期间的变更的数据缓冲,默认1mb
#断开的从节点重新连接,只需同步部分数据即可
repl-backlog-size 1mb
#主从断开多少秒后,清理这期间的数据缓冲
# 默认3600秒,设0表示永不清理
repl-backlog-ttl 3600

#哨兵选举新master时,这个值越小越容易被选中
#0 表示永不被选中
replica-priority 100
#5.0之前 slave-priority

#组合参数,3和10为例表示:
#若master节点统计出连续3个从节点的连接,延迟都超过10秒
#则master节点不再接受写请求
#建议 设为0
min-replicas-to-write 3
min-replicas-max-lag 10

#真实ip,比如Docker NAT环境
replica-announce-ip 127.0.0.1
#真实端口
replica-announce-port 6379

####################### 主从复制 END ###########################

12 哨兵配置

​ 哨兵是配合主从复制使用的,动态管理各个节点主从关系。

部署参考: RedisSentinel笔记

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
#哨兵启动方式:
cd /usr/local/redis
./bin/redis-sentinel sentinel-node1.conf

#作为守护进程运行
daemonize yes

#守护进程运行时,pid号写入的文件
pidfile /usr/local/redis/cluster/sentinel/node01.pid

#日志文件路径
logfile "/usr/local/redis/cluster/sentinel/log/node01.log"

#工作目录
dir "/usr/local/redis/cluster"

# 绑定ip
bind 0.0.0.0
# 绑定端口
port 4001

#定义监听的集群,指向master节点ip和端口,
# 2代表,2个哨兵节点都确认master主观下线,则标记为正式的客观下线,触发故障转移
sentinel monitor masterName masterIp masterPort 2

#哨兵判定master失效的时间,单位秒
#超过这个时间仍检查不到心跳则判断master故障
sentinel down-after-milliseconds 60000

#故障转移时,新的slave节点,从新的master同步数据的超时时间
#单位毫秒,超时不影响slave节点和master的关系
sentinel failover-timeout masterName 180000

#故障转移时,多少个slave可以同时从新的master节点同步数据
#数字越小,故障转移时间越长
#数字越大,意味着更多的slave节点不可用
#可以将从节点参数replica-serve-stale-data yes开启
# 复制时可读,但不能保证数据一致性( 该参数5.0之前使用slave-serve-stale-data)
sentinel parallel-syncs masterName 3

#主节点密码
sentinel auth-pass sineMaster 123123456

13 Cluster 集群

一般情况,除非主从+哨兵无法满足需求,才考虑 Redis Cluster 集群模式(数据分片)

部署参考: RedisCluster笔记

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
#开启集群模式的节点实例都启动后,使用redis-cli命令建立集群关系
#./redis-cli --cluster create ip1:port ip2:port ip3:port --cluster-replicas 1 -a 密码

####################### 集群 START #########################
#开启集群, 默认单例
cluster-enabled yes

#集群节点自从持久化的配置文件, 非编辑的配置
cluster-config-file /usr/local/redis/cluster/nodes1-6379.conf

#集群节点的失联时间,单位毫秒,默认15秒
#超过时间,则标记节点故障
#如果是master节点超时,则触发master选举
cluster-node-timeout 15000

#从节点,配合cluster-node-timeout参数
#表示从节点与故障主节点断开时长, 如果 此参数为5,表示超过 5次 * 15000毫秒之后
#这个从节点的数据将不参与故障恢复
#一般为了高可用,设为0,始终可以参与故障恢复
cluster-replica-validity-factor 5
#6.0前cluster-slave-validity-factor

#master节点,必须有多少个slave从节点
cluster-migration-barrier 1

#redis集群需要把16384个分片槽点放到不同达到节点
#默认yes 分片槽点都正常才能对外提供服务
#建议设为no,保证没有分片问题的节点能够提供服务
cluster-require-full-coverage yes

#当集群节点被标记为失败,或者无法满足master要求的从节点数量时
#该节点不提供服务,避免数据不一致。默认不提供服务 no
cluster-allow-reads-when-down no
####################### 集群 END #########################