REDISLV的配置文件解析redis-config.md
使用配置文件的方法
1 | ./redis-server $(path)/redis.conf |
常用修改参数
1 | bind 127.0.0.1 |
INCLUDE
使用include可以引用其他配置文件
使用用方法:include $(path)/xxx.conf
可以同时使用多个include
注:redis是按照顺序解析配置文件参数的,同样的参数后面的设置会覆盖前面的设置
如果不希望include被覆盖,
就将include放置在配置文件最后,
否则就放在前面的位置
NETWORK
bind
说明
使用bind参数开启网络监听绑定
只有通过被bind的地址才可以访问数据库
可以同时bind多个ip(根据代码内宏定义,最多16个ip)
bind所绑定的ip地址都是本机ip地址,具体是指这台主机有多个网卡,这些网卡对应的ip地址,而不是远程访问的ip地址
1 |
如果没有bind参数,则接受所有主机的访问
例子
1 | bind 192.168.1.100 10.0.0.1 |
protected-mode
说明
额外一层防护,防止用户忘记限制ip,同时忘记密码
就将数据库暴露在公网上
例子
1 | protected-mode yes |
校验触发条件
- 开启protected-mode
- 没用bind任何ip
- 没有启用密码校验
- 客户端不是通过unix-socket连接过来的
- 不是来自本机客户端的连接操作
同时满足上述条件,则会返回连接失败提示,并告知失败原因
对应代码acceptCommonHandler
中
1 | if (server.protected_mode && |
port
说明
监听端口
设置为0则不开启网络端口监听
例子
1 | prot 6379 |
tcp-backlog
说明
只有当每秒钟有很多个客户端进行连接数据库时才需要扩大这个值
- backlog本身
tcp-backlog是对应函数listen(backlog)
中的参数的一个值
backlog本身是一个队列长度
当同时请求连接的数量超过这个值时,
会连接失败.
注:这个值不是最大连接数,是等待处理连接的数量.
当多个连接间隔时间比较长的情况下连接服务器,是不会超出连接等待队列的
- backlog的值
redis的配置文件本身可以设置一个值
系统/proc/sys/net/core/somaxconn
文件中也有一个这个值
实际上这个值是这两个位置的最小值
如果需要扩大这个值,需要同时扩大这两个地方
例子
1 | tcp-backlog 511 |
unixsocket
说明
该功能默认关闭
模式使用普通网络通信端口进行通信
该功能是使用unixsocket进行与客户端之间的通信
unixsocket本身的说明
unixsocket是unix根据一般的网络IPC通信发展出来的本地文件通信方式.
是通过一个文件进行本地进程之间的通信.
传统IPC通信是不稳定,不可靠,有乱序.
而unixsocket通信是稳定可靠,无乱序,不需要校验的.
例子
1 | unixsocket /tmp/redis.sock # 指定进行通信的文件 |
timeout
说明
客户端连接超时配置
单位:秒
客户端与服务器上次交互时间到现在超过这个时间则会被断开连接
参数:0,无时间限制
例子
1 | timeout 0 |
tcp-keepalive
说明
tcp保持连接的心跳跑检测时间设置
tcp网络本身提供了心跳包的检测参数配置
可以用于检测客户端是否掉线
tcp-keepalive参数单位:秒
SO_KEEPALIVE说明
SO_KEEPALIVE
,这个是表明启用TCP心跳包TCP_KEEPIDLE
,连续多长时间(秒)后没有通信,则发送心跳包TCP_KEEPINTVL
,发送心跳包的间隔时间TCP_KEEPCNT
,心跳包发送的次数,连续多少次发送没有返回,则说明断开连接,只要有一次返回,则不会发送后续的心跳包
注:这个心跳包本身可能有些地方检测不了,当远端突然掉线,拔网线,关机等操作行为导致无法连接时,
心跳包机制会以为是发送失败不断重新发送单条协议,而不是判断已经掉线了.TCP的自动重传机制优先度要
高于KEEPALIVE机制,导致我们只知道我们自己发送失败,而不是对方已经掉线.
1 | /* Set TCP keep alive option to detect dead peers. The interval option |
例子
1 | tcp-keepalive 300 |
GENERAL
daemonize
说明
标明redis进程为前台进程还是后台守护进程
- 前台进程,当远程连接关闭后,进程也会随之关闭
- 后台进程,当远程连接关闭后,进程不会随之关闭,同时会在
/var/run/redis.pid
文件中记录当前进程的pid
例子
1 | daemonize yes |
supervised
说明
提供不同方式的redis启动和管理的配置
no
,没有启动控制系统,手动启动关闭upstart
,以upstart方式启动redissystemd
,以systemctl
方式启动redisauto
,自动判断是以上那种方式
例子
1 | supervised no |
pidfile
说明
- 前台运行时,不指定这个文件,则不会生成pid文件
- 后台运行时,指定这个文件则在这个文件生成,否则会在默认文件
/var/run/redis.pid
中生成
进程结束后会删除这个文件
另外,即时创建pid文件失败也不会影响redis的正常运行
例子
1 | pidfile /var/run/redis-6379.pid |
loglevel
说明
日志等级
- debug,最多日志输出
- verbose,比debug少
- notice,比verbose少,一般用于实际生产中
- warning,只看最重要的信息
例子
1 | loglevel notice |
logfile
说明
日志文件(完整地址:路径+文件名)
为空表示使用标准输出
(文件内容是追加,不是重写,所以不会删除以前的日志内容)
- 前台运行,控制台可以直接看到
- 后台运行,直接输出到
/dev/null
中,不会有日志存在
例子
1 | logfile "redis.log" |
syslog-enabled
说明
是否使用系统日志记录
默认是关闭
和上面配置的logfile不冲突,同时开启会记录双份日志
日志记录位置:/var/log/messages
例子
1 | syslog-enabled yes |
syslog-ident
说明
系统日志的标识名称
在/var/log/messages
日志文件中的每行日志都有这个文字作为日志来源的标识
例子
1 | syslog-ident redis |
syslog-facility
说明
表明日志的来源信息
1 | /* facility codes */ |
例子
1 | syslog-facility local0 |
databases
说明
数据库的数量
默认数量是16,
分别对应数据库编号:0-15,
初始数据库使用的时候0
可以通过使用命令select ${dbnum}
来切换当前使用的数据库
例子
1 | databases 16 |
SNAPSHOTTING
save
说明
- 条件
- <=指定时间
- >=指定次数
- 结果
- 保存数据到硬盘
另外:该参数不会互相覆盖,本质是一个数组,校验的时候会遍历每条数据的条件进行save ""
会重置它所在行之前的所有save命令,是一个清空的功能
例子
1 | save 900 1 |
stop-writes-on-bgsave-error
说明
当后台保存数据到硬盘失败时,
是否停止对redis的写命令的执行.
默认为开启.
当最近一次对数据持久化写硬盘失败后,
会在内存中标记写硬盘失败.
当该选项开启时,写硬盘失败的话,
会同时停止redis对所有写命令的执行,
以这种方式来提示用户硬盘写入有问题.
当出现问题后,再次后台保存数据成功时,
redis会自动恢复对写命令的执行.
例子
1 | stop-writes-on-bgsave-error yes |
rdbcompression
说明
在进行rdb的dump时,是否对内容进行lzf压缩
默认开启,
如果为了节省cpu,可以关闭,但是可能会占用更多硬盘
例子
1 | rdbcompression yes |
rdbchecksum
说明
rdb保存在版本5之后会在结尾追加8字节的checksum
这个校验和可以增加数据的完整性安全,
但是会额外增加大概10%的性能消耗
默认开启
例子
1 | rdbchecksum yes |
dbfilename
说明
rdb保存时对应的文件名
例子
1 | dbfilename dump.rdb |
dir
说明
rdb,aof,logfile文件保存时所在的文件夹
这里必须是文件夹,而不是一个文件
注:leveldb数据保存是在这个文件夹基础上的一个路径
例子
1 | dir ./ |
REPLICATION
主从备份
一个主数据库可以对应多个从数据库
从数据库的数据是从主数据库异步同步过来的
- 同步是异步的,但是可以设置主数据库的最少从数据库连接数.
当当前连接的从数据库数量少于最少配置数量时,可以停止
主数据库对写命令的执行 - 当从数据库在相对短的时间内与主数据库断开连接口,再次连接
时,可以对局部的数据进行重新同步.这个相对短的时间取决于
主数据库设置的backlog的大小 - 主从备份是自动的,无需手动操作,网络断线后会自动重连
slaveof
说明
指明自己是那个redis的从数据库
例子
1 | slaveof 127.0.0.1 6688 |
masterauth
说明
如果master启动了密码认证
从服务器连接的时候就需要提供密码
这里是设置连接主服务器时用的密码的设置
例子
1 | masterauth <master-password> |
slave-serve-stale-data
说明
当从数据库数据不是最新的时候是否提供数据读写服务
可能发生的原因
- 从数据库与主数据库断开连接
- 从数据库正在从主数据库备份数据过程中
处理方式
- 当该参数设置为真,会使用旧数据提供读写服务
- 当该参数设置为假,除了命令
info
和slaveof
之外的所有命令都会得到SYNC with master in progress
的错误信息
例子
1 | slave-serve-stale-data yes |
slave-read-only
说明
从数据库是否可写
有的时候可能有从数据库可以给非主数据库连接改写的情况(正常不用)
从数据库即使设置成只读,
也不会屏蔽掉一些管理命令,
比如config
,debug
之类的,
如果为了安全考虑,可以使用rename-command
来隐藏这些命令
例子
1 | slave-read-only yes |
repl-diskless-sync
说明
当全新的从数据库连接或者重连的从数据库已经超过backlog提供的恢复信息后
从数据库需要一个完整的数据同步来达到和主数据库一直的状态
有两种方式
- 基于硬盘数据的
主数据库新建进程来创建RDB文件,
主数据库进程将这个RDB文件增量传输给需要的从数据库 - 无硬盘的
主数据库新建进程
新进程直接创建RDB文件并并直接通过socket发送给相应的从数据库
在硬盘慢带宽大的情况下效果更好
例子
1 | repl-diskless-sync no |
repl-diskless-sync-delay
说明
复制同步的延迟
当无硬盘备份启动时
一旦传输开始,到传输完成为止,
期间都不能为新增的从数据库提供同步服务
这个延迟是为了等待更多的从数据库
进行平行同步用的
单位(秒)
设置为0则是禁用延迟,立刻同步
例子
1 | repl-diskless-sync-delay 5 |
repl-ping-slave-period
说明
主数据库定时ping从数据库,
用于检测从数据库是否掉线失去连接.
单位:秒
默认10秒
例子
1 | repl-ping-slave-period 10 |
repl-timeout
说明
这是一个公用的超时时间设置
- 从数据库长时间没有收到主数据库的数据信息
- 连接过程中
- 连接成功后
- 数据库传输过程中
- 主数据库长时间没有收到从数据库的数据信息
- 没有收到ACK信息
例子
1 | repl-timeout 60 |
repl-disable-tcp-nodelay
说明
是否禁用TCP的nodelay选项
禁用后会降低slave的延迟,但是会增加通信量
这个配置很绕
- no是没有延迟高带宽负载
- yes是有延迟低带宽负载
例子
1 | repl-disable-tcp-nodelay no |
repl-backlog-size
说明
主从备份的backlog的日志大小
当从数据库与主数据库断开一段时间内
只要间隔操作还在backlog的记录时间内
都可以通过主数据库的backlog来进行数据恢复
而不是一次完整的同步
backlog只有在任意从数据库初次连接时才会分配内存
例子
1 | repl-backlog-size 1mb |
repl-backlog-ttl
说明
当没有任何从数据库连接时
主数据库释放backlog内存空间的延时时间
单位:秒
从最后一个从数据库断开连接后开始计时
例子
1 | repl-backlog-ttl 3600 |
slave-priority
说明
当有哨兵存在时有效
哨兵会根据这个值来决定当主数据库失效无法连接时,
选取那个从数据库提升为主数据库.
哨兵会选取这个值最小的为主数据库.
当这个值为0时,表示该数据库不会被选为主数据库.
注:哨兵为redis-sentinel
这个程序,启动哨兵只需要修改sentinel.conf
文件中的主数据库的ip和端口就可以了,哨兵在连接主数据库失败时会自动
选举主数据库.
注:客户端需要连接哨兵才能知道是那个数据库被提升为主数据库了.
例子
1 | slave-priority 100 |
min-slaves-to-write & min-slaves-max-lag
说明
redis可以根据从数据库的数量和从数据库的连接延迟来
组织写命令的执行.
这是保证数据安全的一种机制
min-slaves-to-write
,最小从数据库数量,当从数据库数量<这个值时,主数据库禁用写命令min-slaves-max-lag
,从数据库最大延迟时间,当单个从数据库的延迟时间<这个值时,从数据库数量+1,单位:秒
只有同时设置这两个参数,功能才会生效,任意一个没有设置或为0
功能不生效
例子
1 | min-slaves-to-write 3 |
SECURITY
requirepass
说明
密码设置,默认注释
因为一般都是本机运行
因为redis很快,每秒钟可以尝试150k次密码校验
所以除非密码异常复杂,否则很容易被试出来.
没有任何加密,就是明码字符串,
和客户端传来的字符串做比较
例子
1 | requirepass foobared |
rename-command
说明
重命名命令
因为有一些命令非常危险
重命名命令为一些很难想想的内容可以保证安全,同时又不影响内部管理员的使用
重命名命令为空字符串会完全禁用这个命令
注:如果使用aof记录数据或者存在从数据库,使用重命名命令可能会导致问题,因为它们的命令可能还是以前正常的命令
例子
1 | rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 |
LIMITS
maxclients
说明
redis可以同时连接的最大客户端数量
因为redis内部也会有模拟客户端连接
所以实际上可以同时连接的最大客户端数量为
这个值-32的结果.
当连接数超过这个值时,后面的连接会受到max number of clients reached
默认值为10000
例子
1 | maxclients 10000 |
maxmemory
说明
redis存储数据(不包括主从备份使用的通信用缓冲区大小)内存使用的大小限制
单位:字节
当maxmemory为0时
- 32位机器,maxmemory自动设置为3GB
- 64位机器,maxmemory为0(不做限制)
例子
1 | maxmemory <bytes> |
maxmemory-policy
说明
当内存到达上限时,
redis的内存策略
- volatile-lru,根据LRU规则删除有时效的数据
- allkeys-lru,根据LRU规则删除所有的数据
- volatile-random,随机删除有时效的数据
- allkeys-random,随机删除所有的数据
- volatile-ttl,根据键的失效时间排序,按最快失效的键依次删除(不是精确排序)
- noeviction,不删除,只返回错误
redis模式采用的是volatile-lru规则
该配置配合maxmemory来使用,当maxmemory非0时(x32会自动设置为3GB,要注意),
会按照这条规则处理超出内存的数据
例子
1 | maxmemory-policy volatile-lru |
maxmemory-samples
说明
LRU算法和TTL算法都不是精确算法
而是估算算法(可以提高效率)
这个参数是算法的样本个数
取这个个数的值的样本进行比较得出的键就是算法的结果
提高这个值会降低效率,但是会提高算法精度
例子
1 | maxmemory-samples 3 |
APPEND ONLY MODE
appendonly
说明
是否开启AOF功能
AOF是相对于RDB的另外一种REDIS自带的数据持久化功能
RDB在发生突发情况(断电,REDIS崩溃)后,会丢失自上次保存后的所有数据
AOF只会丢失突发情况前1秒钟的内容,是一种持续持久化方式
AOF可以和RDB同时开启,当同时开启时,REDIS会使用AOF的存储文件,
因为AOF相对更可靠一些.
例子
1 | appendonly no |
appendfilename
说明
AOF保存的文件名
例子
1 | appendfilename "appendonly.aof" |
appendfsync
说明
文件写入磁盘实际是有延迟的,
这个参数的作用是何时通知系统将日志写入磁盘
- no,不通知,按操作系统内部逻辑写磁盘
- everysec,每秒通知系统写磁盘
- always,每次变更都通知系统写磁盘
例子
1 | appendfsync everysec |
no-appendfsync-on-rewrite
说明
当有子进程正在写AOF或者RDB文件时,
同时还要追加写AOF日志会使Redis在fsync()阻塞
比较长的时间,解决方法是当有子进程
在写文件时,日志追加写文件为等同于不通知调用fsync()接口,
这样就不会阻塞很长时间了.
但是有可能在发生灾难情况后丢失比较长时间的日志.
默认为关闭,当性能有问题时,可以打开.
例子
1 | no-appendfsync-on-rewrite no |
auto-aof-rewrite-percentage & auto-aof-rewrite-min-size
说明
AOF有自动重写功能
当AOF文件尺寸超过基础尺寸的该设置的百分比时
会对AOF文件进行重写合并处理
最小尺寸表示最小进行合并的值,
当AOF文件不到这个尺寸是,即时满足百分比条件
也不会进行重写(太小了,重写没有意义)
当AOF重写百分比设置为0是,是关闭该功能,
关闭后将不会自动重写AOF文件
基础尺寸是本次启动时的尺寸,和最后一次重写后的尺寸
例子
1 | auto-aof-rewrite-percentage 100 |
aof-load-truncated
说明
当AOF文件因为系统原因导致不完整时
(宕机,断电等原因)是否读取不完整的
AOF文件.
注:当AOF文件从中间断掉了,还是会退出
启动,该选项只会在尝试读取指定数量的
字节数据失败时生效
TODO:PAN 这里不是理解的很清楚,后面需要在查看下
例子
1 | aof-load-truncated yes |
LUA SCRIPTING
lua-time-limit
说明
脚本执行超时的警告时间设置
lua脚本执行的毫秒数超出这个值,
则会在日志中记录超时警告.
这个值设置为0则关闭警告,无限时间等待脚本执行完成.
这个时候执行脚本的客户端除了等待
脚本执行完毕后,只有两条命令可以执行
script kill
,在脚本没有调用写命令时可以调用,可以停止脚本的执行shutdown nosave
,当脚本已经调用了写命令操作后,只能通过关闭redis来终止脚本执行
例子
1 | lua-time-limit 5000 |
SLOW LOG
slowlog-log-slower-than
说明
慢日志触发的时间
单位:微秒
1000000微秒=1秒
当命令的执行时间(不包含I/O操作)(实际就是命令对应的的proc
函数的执行时间)超过这个设置的时间后
会被记录到慢日志当中
用于查询执行缓慢的命令
设置为0则每条命令都记录
设置为负数则关闭该功能
时间统计
1 | start = ustime(); |
例子
1 | slowlog-log-slower-than 10000 |
slowlog-max-len
说明
慢日志的最大条目数
这个没有限制具体的大小限制
但是要注意,这个记录会占用内存
如有需要,可以使用命令slowlog reset
来重置慢日志记录
例子
1 | slowlog-max-len 128 |
LATENCY MONITOR
latency-monitor-threshold
说明
延迟监控
纳入延迟监控的命令的运行时间.
redis是单线程的,处理命令只能逐个处理
帮助用户检查排除可能导致延迟的问题.
单位:毫秒
当延迟值>=设置值时,会增加记录
使用latency
命令可以查看记录的详细信息
默认关闭
因为会影响性能
例子
1 | latency-monitor-threshold 0 |
Event notification
notify-keyspace-events
说明
pub/sub功能的监听内容设置
参数说明:
1 | # K Keyspace events, published with __keyspace@<db>__ prefix. |
两种事件类型:K/E,
如果要使用该功能,必须至少监听其中一种
然后在配合具体的监听对象来启用监听事件
开启监听后
客户端添加订阅redis的监听,并提供相应的回调处理
当监听事件发生后,
客户端对应的回调函数会收到redis的调用.
默认为””关闭,
因为大部分情况下都用不到
也会消耗性能
例子
监听所有的键过期事件
1 | notify-keyspace-events Ex |
ADVANCED CONFIG
hash-max-ziplist-entries & hash-max-ziplist-value
说明
哈希表在元素数<=配置值,
并且每个元素的长度<=配置值时,
Redis启用特殊编码,对数据进行封装
而不是直接使用哈希表.
这对内存大小和查询性能都有优化
例子
1 | hash-max-ziplist-entries 512 |
list-max-ziplist-entries & list-max-ziplist-value
例子
列表元素数<=配置值,
并且列表元素长度<=配置值,
会使用压缩数据优化.
例子
1 | list-max-ziplist-entries 512 |
set-max-intset-entries
说明
由int64_t
组成的set在
元素个数<=配置值时,
会使用压缩数据优化.
例子
1 | set-max-intset-entries 512 |
zset-max-ziplist-entries & zset-max-ziplist-value
说明
当有序set的元素个数<=配置值,
并且元素的长度都<=配置值,
会使用压缩数据优化.
例子
1 | zset-max-ziplist-entries 128 |
hll-sparse-max-bytes
说明
MARK:hll的功能其实完全不知道
稀疏结构的最大字节数
默认值3000
当不关心cpu而在意内存占用的话
可以设置为10000
可用值范围一般为0-15000
当设置为16000时还不如使用密集结构
例子
1 | hll-sparse-max-bytes 3000 |
activerehashing
说明
这是对redis最上层的哈希表的rehash的处理方式
是否主动rehash
主动rehash会节省内存,但是会占用cpu(1/100)的时间
默认的dict是被动rehash,当dict被操作时,才会进行
rehash,不会占用额外cpu时间,但是当没有访问表时,
会导致rehash停止,从而会占用更多的内存
默认是开启主动rehash,节省内存
例子
1 | activerehashing yes |
client-output-buffer-limit
说明
当客户端读取数据速度比不上服务器推送的速度时
服务端的推送数据缓冲会积压
当积压大于这个配置值时,
服务端会主动断开与客户端的连接
(一般的客户端不会有这个问题,
因为是请求-返回的模式,
异步客户端可能会出现这种问题)
客户端的类型
1 | # normal -> normal clients including MONITOR clients |
操作语法
1 | client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds> |
值设置为0则表示不限制
例子
1 | client-output-buffer-limit normal 0 0 0 |
hz
说明
就是决定函数serverCron
函数内部分功能的调用频率的
默认为10次/秒
取值范围为1-500
正常使用10即可,
对过期键等判断要求严格的可以上调至100
但会在空闲时占用更多的cpu.
例子
1 | hz 10 |
aof-rewrite-incremental-fsync
说明
当重写AOF文件时,开启该功能会按照每
32MB数据写一次磁盘.
就是开启增量写文件的功能.
可以防止一次性写很大的数据使延迟很大
例子
1 | aof-rewrite-incremental-fsync yes |
LEVELDB
leveldb
说明
是否使用leveldb持久化数据
例子
1 | leveldb yes |
leveldb-path
说明
leveldb数据的存放目录
这个目录是在上面的dir
配置的基础上拼装出来的,
并不是从根目录开始计算
例子
1 | leveldb-path ./var |