redis-配置详解

redis的配置文件/etc/redis/6379.conf有很多的配置选项,如下是对每个选项的配置说明。

基本的配置

# Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
daemonize yes
# 绑定的主机地址
bind 0.0.0.0
# 指定Redis监听端口,默认端口为6379
port 6379
# 当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
timeout 300
# 设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id
databases 16
# 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
loglevel notice
# 日志记录方式,默认为标准输出stdout。
logfile /var/log/redis_6379.log
# 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件
pidfile /var/run/redis_6379.pid
# 此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度, 当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxconn值,默认是511,而Linux的默认参数值是128。当系统并发量大并且客户端速度缓慢的时候,可以将这二个参数一起参考设定。
tcp-backlog 511
# 如果值非0,单位是秒,表示将周期性的使用SO_KEEPALIVE检测客户端是否还处于健康状态,避免服务器一直阻塞,官方给出的建议值是60S。
tcp-keepalive 60

supervised no

# 一个Lua脚本最长的执行时间,单位为毫秒,如果为0或负数表示无限执行时间,默认为5000
lua-time-limit 5000

slowlog-log-slower-than 10000
slowlog-max-len 128

latency-monitor-threshold 0
notify-keyspace-events ""
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
hz 10

主从配置

# 配置客户端连接认证密码
requirepass "passwd@123"
# 设置当本机为slave服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
slaveof 192.168.0.107 6379
# 如果master主机设置有连接密码,需要提供连接密码。
masterauth passwd@123
# 当slave服务器和master服务器失去连接后,或者当数据正在复制传输的时候,配置slave服务器是否继续接受客户端的请求。如果值为no,会返回给请求的客户端如下信息“SYNC with master in progress”
slave-serve-stale-data yes
# 是否允许slave服务器节点只提供读服务
slave-read-only yes

repl-diskless-sync no
repl-diskless-sync-delay 5
# 指定向slave同步数据时,是否禁用socket的NO_DELAY选项。若配置为“yes”,则禁用NO_DELAY,则TCP协议栈会合并小包统一发送,这样可以减少主从节点间的包数量并节省带宽,但会增加数据同步到slave的时间。若配置为“no”,表明启用NO_DELAY,则TCP协议栈不会延迟小包的发送时机,这样数据同步的延时会减少,但需要更大的带宽。 通常情况下,应该配置为no以降低同步延时,但在主从节点间网络负载已经很高的情况下,可以配置为yes。
repl-disable-tcp-nodelay no

# 指定slave的优先级。在不只1个slave存在的部署环境下,当master宕机时,Redis Sentinel会将priority值最小的slave提升为master。需要注意的是,若该配置项为0,则对应的slave永远不会自动提升为master。
slave-priority 100

repl-timeout 300

RDB持久化配置

# 指定本地数据库存放目录
dir /data/redis/6379
# 指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
# 指定存储至本地数据库时是否压缩数据,默认为yes
rdbcompression yes
# 读取和写入的时候是否支持CRC64校验,默认是开启的
rdbchecksum yes
# 持久化失败后,停止写入更新的操作,能够及时感知持久化存储失败。
# 如果后台存储(持久化)操作进程再次工作,Redis会自动允许更新操作。
stop-writes-on-bgsave-error yes
# 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
# 语法:save <seconds> <changes> 以下是默认值。
save 900 1
save 300 10
save 60 10000

AOF持久化配置

# 是否开启AOF持久化。开启appendonly模式之后,redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中。当redis重新启动时,会从该文件恢复出之前的状态,默认是不开启的。
appendonly yes
# 默认为文件名为:appendonly.aof。
appendfilename "appendonly.aof"
# 设置aof的同步频率,有三种选择always、everysec、no,默认是everysec表示每秒同步一次。
# appendfsync always 同步持久化 每次发生数据变更会被立即记录到磁盘性能较差但数据完整性比较好
# appendfsync everysec 异步操作,每秒记录 如果一秒内宕机,有数据丢失
# appendfsync no 从不同步
appendfsync everysec

AOF重写配置

开启AOF持久化会造成appendonly.aof文件过大,所以redis还支持了BGREWRITEAOF指令,对appendonly.aof进行重新整理。
AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似

no-appendfsync-on-rewrite no

bgrewriteaof机制,在一个子进程中进行aof的重写,从而不阻塞主进程对其余命令的处理,同时解决了aof文件过大问题。但是,同时在执行bgrewriteaof操作和主进程写aof文件的操作,两者都会操作磁盘,而bgrewriteaof往往会涉及大量磁盘操作,这样就会造成主进程在写aof文件的时候出现阻塞的情形。
no-appendfsync-on-rewrite参数设置为no,是最安全的方式,不会丢失数据,但是要忍受阻塞的问题。如果设置为yes,这就相当于将appendfsync设置为no,这说明并没有执行磁盘操作,只是写入了缓冲区,因此这样并不会造成阻塞(因为没有竞争磁盘),但是如果这个时候redis挂掉,就会丢失数据。在linux的操作系统的默认设置下,最多会丢失30s的数据。

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

指定Redis重写aof文件的条件,默认为100,表示与上次rewrite的aof文件大小相比,当前aof文件增长量是上次afo文件大小的2倍时,就会触发background rewrite。若配置为0,则会禁用自动rewrite
指定触发rewrite的aof文件大小。若aof文件小于该值,即使当前文件的增量比例达到auto-aof-rewrite-percentage的配置值,也不会触发自动rewrite。即这两个配置项同时满足时,才会触发

aof-rewrite-incremental-fsync yes

aof rewrite过程中,是否采取增量文件同步策略,默认为“yes”。 rewrite过程中,每32M数据进行一次文件同步,这样可以减少aof大文件写入对磁盘的操作次数

aof-load-truncated yes