Redis 配置文件详解
- 单位:配置文件对
unit单位大小写不敏感

- 可以包含多个配置文件

#### NETWORK(网络)####
-
绑定的IP,默认只接受本机的访问请求,生产环境要写应用服务器的地址

-
如果开启了protected-mode,那么在没有设定bind ip且没有设密码的情况下,Redis只允许接受本机的响应

-
端口号默认6379

-
设置 tcp 的 backlog
- backlog 其实是一个连接队列,backlog
队列总和=未完成三次握手队列 + 已经完成三次握手队列 - 在高并发环境下需要一个高 backlog 值来避免慢客户端连接问题
- 注意 Linux 内核会将这个值减小到
/proc/sys/net/core/somaxconn的值(128),所以需要确认增大/proc/sys/net/core/somaxconn和/proc/sys/net/ipv4/tcp_max_syn_backlog(128)两个值来达到想要的效果

- backlog 其实是一个连接队列,backlog
-
一个空闲的客户端维持多少秒会关闭,0表示关闭该功能,即永不关闭

-
对访问客户端的一种心跳检测,每隔 n 秒检测一次
- 单位为秒,如果设置为 0,则不会进行 Keepalive 检测,建议设置成 60
- 使用keepalive有两个好处:
- 检测挂掉的对端
- 降低中间设备出问题而导致网络看似连接却已经与对端端口的问题

#### GENERAL(通用)####
-
以守护进程方式运行,默认是 no

-
存放pid文件的位置,每个实例会产生一个不同的pid文件

-
指定日志记录级别,Redis总共支持四个级别:
debug(很多信息,方便开发、测试)、verbose(许多有用的信息,但是没有debug级别信息多)、notice(默认,适当的日志级别,适合生产环境)、warning(只有非常重要的信息)

-
指定了记录日志的文件。空字符串的话,日志会打印到标准输出设备,后台运行的 redis 标准输出是
/dev/null

-
Syslog 相关配置

-
设定库的数量默认 16,默认数据库为 0,可以使用
SELECT <dbid>命令在连接上指定数据库 id

#### SNAPSHOTTING(快照)####
-
持久化,在规定的时间内,执行了多少次操作,则会持久化到文件.rdb.aof
- redis是内存数据库,没有持久化,那么断电后数据就会丢失

-
当
RDB持久化出现错误后,是否依然进行继续进行工作- 可以通过 info 中的
rdb_last_bgsave_status了解RDB持久化是否有错误

- 可以通过 info 中的
-
使用压缩
RDB文件,RDB文件压缩使用 LZF 压缩算法

-
保存
RDB文件时,进行错误的检查校验- 从 rdb 格式的第五个版本开始,在 rdb 文件的末尾会带上
CRC64的校验和。这跟有利于文件的容错性,但是在保存 rdb 文件的时候,会有大概 10% 的性能损耗,所以如果追求高性能,可以关闭该配置

- 从 rdb 格式的第五个版本开始,在 rdb 文件的末尾会带上
-
RDB文件的名称

-
数据目录,数据库的写入会在这个目录
- rdb、aof文件也会写在这个目录

#### REPLICATION(主从复制)####
-
复制选项,slave复制对应的master

-
如果 master 设置了 requirepass ,那么 slave 要连上 master ,需要有 master 的密码
- masterauth 就是用来配置master的密码,这样可以在连上 master 后进行认证

-
当从库同主机失去连接或者复制正在进行,从机库有两种运行方式:
- 如果
replica-serve-stale-data设置为yes(默认设置),从库会继续响应客户端的请求 - 如果
replica-serve-stale-data设置为no,除去INFO和SLAVOF命令之外的任何请求都会返回一个错误SYNC with master in progress

- 如果
-
作为从服务器,默认情况下是只读的(yes),可以修改成NO,用于写(不建议)

-
是否使用 socket 方式复制数据
- 目前 redis 复制提供两种方式,disk 和 socket
- 如果新的 slave 连上来或者重连的 slave 无法部分同步,就会执行全量同步,master 会生成 rdb 文件
- disk 方式是 master 创建一个新的进程把 rdb 文件保存到磁盘,再把磁盘上的 rdb 文件传递给 slave
- socket 是 master 创建一个新的进程,直接把 rdb 文件以 socket 的方式发给 slave
- disk 方式的时候,当一个 rdb 保存的过程中,多个 slave 都能共享这个 rdb 文件
- socket 的方式就的一个个 slave 顺序复制。在磁盘速度缓慢,网速快的情况下推荐用 socket 方式

-
diskless复制的延迟时间,防止设置为0
- 一旦复制开始,节点不会再接收新slave的复制请求直到下一个rdb传输
- 所以最好等待一段时间,等更多的slave连上来

-
slave根据指定的时间间隔向服务器发送ping请求
- 时间间隔可以通过
repl_ping_slave_period来设置,默认 10 秒

- 时间间隔可以通过
-
复制连接超时时间
- master 和 slave 都有超时时间的设置。master 检测到 slave 上次发送的时间超过
repl-timeout,即认为 slave 离线,清除该 slave 信息。 - slave 检测到上次和 master 交互的时间超过
repl-timeout,则认为 master 离线。 - 需要注意的是
repl-timeout需要设置一个比repl-ping-slave-period更大的值,不然会经常检测到超时。

- master 和 slave 都有超时时间的设置。master 检测到 slave 上次发送的时间超过
-
是否禁止复制tcp链接的tcp
- nodelay 参数,可传递 yes 或者 no(默认是no,即使用tcp nodelay)
- 如果 master 设置了 yes 来禁止
tcp nodelay设置,在把数据复制给 slave 的时候,会减少包的数量和更小的网络带宽。但是这也可能带来数据的延迟。 - 默认我们推荐更小的延迟,但是在数据量传输很大的场景下,建议选择 yes

-
复制缓冲区大小
- 这是一个环形复制缓冲区,用来保存最新复制的命令
- 这样在 slave 离线的时候,不需要完全复制 master 的数据
- 如果可以执行部分同步,只需要把缓冲区的部分数据复制给 slave,就能恢复正常复制状态
- 缓冲区的大小越大,slave 离线的时间可以更长,复制缓冲区只有在有 slave 连接的时候才分配内存
- 没有 slave 的一段时间,内存会被释放出来,默认 1m

-
master 没有 slave 一段时间会释放复制缓冲区的内存
repl-backlog-ttl用来设置该时间长度,单位为秒

-
当master不可用,Sentinel会根据slave的优先级选举一个master
- 最低的优先级的slave,当选master。而配置成0,永远不会被选举

-
redis 提供了可以让 master 停止写入的方式
- 如果配置了
min-slaves-to-write,健康的 slave 的个数小于 N,mater 就禁止写入 - master 最少得有多少个健康的 slave 存活才能执行写命令
- 这个配置虽然不能保证 N 个 slave 都一定能接收到 master 的写操作,但是能避免没有足够健康的 slave 的时候,master 不能写入来避免数据丢失
- 设置为 0 是关闭该功能

- 如果配置了
-
延迟小于
min-slaves-max-lag秒的 slave 才认为是健康的 slave

-
设置1或另一个设置为0禁用这个特性

#### SECURITY(安全)####
-
requirepass配置可以让用户使用 AUTH 命令来认证密码,才能使用其他命令- 这让 redis 可以使用在不受信任的网络中。为了保持向后的兼容性,可以注释该命令,因为大部分用户也不需要认证
- 使用
requirepass的时候需要注意,因为 redis 太快了,每秒可以认证 15w 次密码,简单的密码很容易被攻破,所以最好使用一个更复杂的密码 - 注意只有密码没有用户名

-
把危险的命令给修改成其他名称
- 比如
CONFIG命令可以重命名为一个很难被猜到的命令,这样用户不能使用,而内部工具还能接着使用

- 比如
-
设置成一个空的值,可以禁止一个命令

#### CLIENTS(进程限制相关)####
-
设置能连上redis的最大客户端连接数量。默认是10000个客户端连接
- 由于redis不区分连接是客户端连接还是内部打开文件或者和slave连接等,所以maxclients最小建议设置到32
- 如果超过了maxclients,redis会给新的连接发送’max number of clients reached’,并关闭连接

-
redis 配置的最大内存容量。当内存满了,需要配合
maxmemory-policy策略进行处理- 注意 slave 的输出缓冲区是不计算在
maxmemory内的 - 所以为了防止主机内存使用完,建议设置的
maxmemory需要更小一些

- 注意 slave 的输出缓冲区是不计算在
-
内存容量超过
maxmemory后的处理策略- volatile-lru:利用 LRU 算法移除设置过过期时间的 key
- volatile-random:随机移除设置过过期时间的 key
- volatile-ttl:移除即将过期的 key,根据最近过期时间来删除(辅以 TTL )
- allkeys-lru:利用LRU算法移除任何 key
- allkeys-random:随机移除任何 key
- noeviction:不移除任何 key,只是返回一个写错误
- 上面的这些驱逐策略,如果 redis 没有合适的 key 驱逐,对于写命令,还是会返回错误
- redis 将不再接收写请求,只接收 get 请求
- 写命令包括:
setsetnxsetexappendincrdecrrpushlpushrpushxlpushxlinsertlsetrpoplpushsaddsintersinterstoresunionsunionstoresdiffsdiffstorezaddzincrbyzunionstorezinterstorehsethsetnxhmsethincrbyincrbydecrbygetsetmsetmsetnxexecsort

-
lru 检测的样本数
- 使用 lru 或者 ttl 淘汰算法,从需要淘汰的列表中随机选择 sample 个 key,选出闲置时间最长的 key 移除

#### APPEND ONLY MODE(持久化方式)####
-
默认 redis 使用的是 rdb 方式持久化,这种方式在许多应用中已经足够用了
- 但是 redis 如果中途宕机,会导致可能有几分钟的数据丢失,根据 save 来策略进行持久化,
Append Only File是另一种持久化方式,可以提供更好的持久化特性 - Redis 会把每次写入的数据在接收后都写入
appendonly.aof文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件

- 但是 redis 如果中途宕机,会导致可能有几分钟的数据丢失,根据 save 来策略进行持久化,
-
aof 文件名

-
aof 持久化策略的配置
- no 表示不执行 fsync,由操作系统保证数据同步到磁盘,速度最快
- always 表示每次写入都执行 fsync,以保证数据同步到磁盘
- everysec 表示每秒执行一次 fsync,可能会导致丢失这 1s 数据

-
在 aof 重写或者写入 rdb 文件的时候,会执行大量 IO
- 此时对于 everysec 和 always 的 aof 模式来说,执行 fsync 会造成阻塞过长时间,
no-appendfsync-on-rewrite字段设置为默认设置为 no,是最安全的方式,不会丢失数据,但是要忍受阻塞的问题 - 如果对延迟要求很高的应用,这个字段可以设置为 yes,,设置为 ye s表示 rewrite 期间对新写操作不 fsync,暂时存在内存中,不会造成阻塞的问题(因为没有磁盘竞争),等 rewrite 完成后再写入,这个时候 redis 会丢失数据
- Linux 的默认 fsync 策略是 30 秒。可能丢失 30 秒数据
- 因此,如果应用系统无法忍受延迟,而可以容忍少量的数据丢失,则设置为 yes
- 如果应用系统无法忍受数据丢失,则设置为 no

- 此时对于 everysec 和 always 的 aof 模式来说,执行 fsync 会造成阻塞过长时间,
-
aof 自动重写配置
- 当目前 aof 文件大小超过上一次重写的 aof 文件大小的百分之多少进行重写
- 即当 aof 文件增长到一定大小的时候Redis能够调用 bgrewriteaof 对日志文件进行重写
- 当前 AOF 文件大小是上次日志重写得到 AOF 文件大小的二倍(设置为 100 )时,自动启动新的日志重写过程

-
设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写

-
aof 文件可能在尾部是不完整的,当 redis 启动的时候,aof 文件的数据被载入内存
- 重启可能发生在 redis 所在的主机操作系统宕机后,尤其在 ext4 文件系统没有加上
data=ordered选项( redis 宕机或者异常终止不会造成尾部不完整现象。)出现这种现象 - 可以选择让 redis 退出,或者导入尽可能多的数据
- 如果选择的是 yes,当截断的 aof 文件被导入的时候,会自动发布一个 log 给客户端然后 load
- 如果是 no,用户必须手动
redis-check-aof修复 AOF 文件才可以

- 重启可能发生在 redis 所在的主机操作系统宕机后,尤其在 ext4 文件系统没有加上
#### LUA SCRIPTING(LUA脚本)####
-
如果达到最大时间限制(毫秒),redis 会记个 log,然后返回 error
- 当一个脚本超过了最大时限。只有
SCRIPT KILL和SHUTDOWN NOSAVE可以用 - 第一个可以杀没有调 write 命令的东西。要是已经调用了 write,只能用第二个命令杀

- 当一个脚本超过了最大时限。只有
#### REDIS CLUSTER(集群相关)####
-
集群开关,默认是不开启集群模式

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

-
节点互连超时的阀值。集群节点超时毫秒数

-
在进行故障转移的时候,全部 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 将不会尝试进行故障转移
- 比较 slave 断开连接的时间和

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

-
默认情况下,集群全部的slot有节点负责,集群状态才为ok,才能提供服务。设置为no,可以在slot没有全部分配的时候提供服务。不建议打开该配置

#### SLOW LOG(慢查询日志)####
-
slog log 是用来记录 redis 运行中执行比较慢的命令耗时
- 当命令的执行超过了指定时间,就记录在 slow log 中,slog log 保存在内存中,所以没有 IO 操作
- 执行时间比
slowlog-log-slower-than大的请求记录到 slowlog 里面,单位是微秒,所以 1000000 就是 1 秒 - 注意,负数时间会禁用慢查询日志,而 0 则会强制记录所有命令

-
慢查询日志长度。当一个新的命令被写进日志的时候,最老的那个记录会被删掉
- 这个长度没有限制,只要有足够的内存就行
- 你可以通过
SLOWLOG RESET来释放内存

#### LATENCY MONITOR(延迟监控)####
-
延迟监控功能是用来监控 redis 中执行比较缓慢的一些操作,用 LATENCY 打印 redis 实例在跑命令时的耗时图表
- 只记录大于等于下边设置的值的操作,0 的话,就是关闭监视。默认延迟监控功能是关闭的
- 如果你需要打开,也可以通过
CONFIG SET命令动态设置

#### EVENT NOTIFICATION(订阅通知)####
-
键空间通知使得客户端可以通过订阅频道或模式,来接收那些以某种方式改动了 Redis 数据集的事件
- 因为开启键空间通知功能需要消耗一些 CPU ,所以在默认配置下,该功能处于关闭状态
notify-keyspace-events的参数可以是以下字符的任意组合- 它指定了服务器该发送哪些类型的通知:
K键空间通知,所有通知以 __keyspace@__ 为前缀E键事件通知,所有通知以 __keyevent@__ 为前缀gDEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知$字符串命令的通知l列表命令的通知s集合命令的通知h哈希命令的通知z有序集合命令的通知x过期事件:每当有过期键被删除时发送e驱逐(evict)事件:每当有键因为maxmemory政策而被删除时发送A参数 g$lshzxe 的别名- 输入的参数中至少要有一个
K或者E,否则的话,不管其余的参数是什么,都不会有任何通知被分发

#### ADVANCED CONFIG(高级配置)####
-
数据量小于等于
hash-max-ziplist-entries的用 ziplist ,大于hash-max-ziplist-entries用 hash

-
value 大小小于等于
hash-max-ziplist-value的用 ziplist,大于hash-max-ziplist-value用 hash

-
数据量小于等于
set-max-intset-entries用 iniset,大于set-max-intset-entries用 set

-
value 大小小于等于
zset-max-ziplist-value用 ziplist,大于zset-max-ziplist-value用 zset

-
数据量小于等于
zset-max-ziplist-entries用 ziplist ,大于zset-max-ziplist-entries用 zset

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

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

-
redis 执行任务的频率为 1s 除以 hz
- 在 aof 重写的时候,如果打开了
aof-rewrite-incremental-fsync开关,系统会每 32MB 执行一次 fsync - 这对于把文件写入磁盘是有帮助的,可以避免过大的延迟峰值

- 在 aof 重写的时候,如果打开了






