Redis 5.0.5配置文件 解读尝试

1、设置单位

当你需要为某个配置项指定内存大小的时候,可以指定类似于1k 5GB 4M等等这样的值来进行设置。
必须要带上单位,其转换方式如下(单位不区分大小写)
 1k => 1000 bytes
 1kb => 1024 bytes
 1m => 1000000 bytes
 1mb => 1024*1024 bytes
 1g => 1000000000 bytes
 1gb => 1024*1024*1024 bytes
内存配置大小写是一样的.比如 1gb 1Gb 1GB 1gB

Redis 5.0.5配置文件 解读尝试_第1张图片

 

#############################引入#############################

1、文件引入

#这里设置引入其他的一个或多个配置文件。当所有的Redis服务端都是用一个公共的配置模板文件,也需要自定义一些项来配置每个服务端时,该设置项很有用。
可以将公共配置抽取出来,采用引入的方式,存在参数覆盖,注意include放置的位置,覆盖效果不同。
后面的引入文件会覆盖前面引入文件的相同配置项。
#include /path/to/local.conf
#include /path/to/other.conf

Redis 5.0.5配置文件 解读尝试_第2张图片

 

############################模块##############################

1、模块加载

#启动时加载模块,如果服务不能加载指定模块,将会忽略指定的模块。
#loadmodule /path/to/my_module.so
#loadmodule /path/to/other_module.so

 

###########################网络 START#########################

1、指定Redis只接受指定Ip的请求

默认情况下,如果未设置bind配置项,Redis将会监听来自服务器上所有可用网络接口的连接。
可以设置只监听一个或多个指定的接口,使用bind配置项,后面跟上一个或多个IP地址。
举例:
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
警告:如果运行Redis的计算器直接暴露在互联网上,绑定所有接口会暴露给互联网上每个人的是危险的。因此默认情况下我们取消注释下面bind指令,这将强制Redis只监听IPv4接口地址(意味着Redis能且只能接受来自同一台机器的客户端的连接请求。)
如果不进行设置,那么Redis将处理所有接收到的请求。
注意,此默认值默认外网是不可访问的。

Redis 5.0.5配置文件 解读尝试_第3张图片

 

2、是否启用保护模式

保护模式是一层安全保护,为了避免运行的Redis实例在internet上被随意访问和利用。
当保护模式开启时,并且:
1》服务端未使用bind设置接受请求的IP地址列表。
2》没有设计密码验证。
那么服务端只接收本地访问,拒绝外部访问。

默认情况下保护模式是开启的,你如果确认其他主机的客户端可以连接一个没有配置权限验证的或者配置bind指定ip地址列表的Redis服务端,需要禁用保护模式。

Redis 5.0.5配置文件 解读尝试_第4张图片

 

3、设置接收连接端口

指定接收连接请求的端口号,默认为6379
如果端口号设置为0,那么Redis将不再监听TCP请求。

 

4、设置TCP连接中已完成队列(完成三次握手之后)的长度

在高并发的环境中,为避免慢客户端的连接问题,需要设置一个高速后台日志。
此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度,当然此值必须不大于linux系统定义的/proc/sys/net/core/somaxconn值,默认是511,而linux的默认参数值是128.当系统并发量大并且客户端速度缓慢的时候,可以将这两个参数一起参考设置。该内核参数默认值一般是128,对于负载很大的服务程序来说大大的不够。一般会将它修改为2048或者更大。

在/etc/sysctl.conf中添加:net.core.somaxconn=2048,然后在终端中执行sysctl -p。
tcp-backlog 511

Redis 5.0.5配置文件 解读尝试_第5张图片

 

5、unix socket

# 配置unix socket来让Redis支持监听本地连接,默认为空
# unixsocket /tmp/redis.sock
#配置unix socket使用文件的权限
# unixsocketperm 700

Redis 5.0.5配置文件 解读尝试_第6张图片

 

6、设置客户端空闲连接超时时间

该设置单位为秒,当客户端在这段时间内没有发出任何指令,那么关闭该链接。
默认值为:0,表示禁用此设置。

 

7、tcp keepalive参数

Redis 5.0.5配置文件 解读尝试_第7张图片

 

###########################通用 START#########################

1、设置Redis后台运行

daemonize 默认情况下值为no,该情况下redis不是在后台运行的,如果需要后台运行,把该项的值更改为yes。

 

2、配置Redis守护进程

可以通过upstart和systemd管理Redis守护进程

选项:

supervised no -没有监督互动

supervised upstart -通过将Redis置于SIGSTOP模式来启动信号

supervised systemd -signal systemd将READY = 1写入$NOTIFY_SOCKET

supervised auto -检测upstart或systemd方法基于UPSTART_JOB或NOTIFY_SOCKET环境变量

默认 supervised no

Redis 5.0.5配置文件 解读尝试_第8张图片

 

3、Redis pid文件

当redis在后台运行的时候,redis默认会把pid文件放在/var/run/redis.pid,你可以配置到其他地址。

当运行多个redis服务时,需要指定不同的pid文件和端口

profile /var/run/redis.pid

Redis 5.0.5配置文件 解读尝试_第9张图片

 

4、指定日志记录级别

Redis总共支持四个级别:

debug、verbose、notice、warning,5.0版本默认为notice

debug:记录很多信息,用于开发和测试

verbose:有用的信息,不像debug会记录那么多

notice:普通的verbose,常用语生产环境

warning:只有非常重要或严重的信息会记录到日志

设置值:

loglevel notice

 

5、配置log文件地址

默认值为stdout,标准输出,若后台模式会输出到/dev/null

设置值:

logfile /usr/local/redis/log

 

6、设置使用的数据库

默认值为16(0~15),默认使用数据库为0,数据库范围在0-(database - 1)之间。

设置值:

database n

Redis 5.0.5配置文件 解读尝试_第10张图片

 

7、是否总是显示logo

always-show-logo yes

Redis 5.0.5配置文件 解读尝试_第11张图片

 

###########################快照 START#########################

1、设置数据保存磁盘条件

保存数据到磁盘,格式如下:

save

指出在多长时间内,有多少次更新操作,就将数据同步到数据文件rdb。

相当于触发条件抓取快照,这个可以多个条件配合。

比如默认配置文件中的设置,就设置了三个条件:

save 900 1 #900秒内至少有1个key被改变

save 300 10 #300秒内至少有10个key被改变

save 60 10000 #60秒内至少有10000个key被改变

Redis 5.0.5配置文件 解读尝试_第12张图片

 

2、stop-write-on-bgsave-error

Redis 5.0.5配置文件 解读尝试_第13张图片

 

3、设置存储本地数据时(持久化到rdb文件)是否压缩数据,默认为yes

 

4、本地持久化数据文件名,默认为dump.rdb

 

5、设置工作目录

设置数据库镜像备份的文件放置的路径。

这里的路径跟文件名要分开配置是因为Redis在进行备份时,先会将当前数据库的状态写入到一个临时文件中,等备份完成时,再把该临时文件替换为上面所指定的文件,而这里的临时文件和上面所配置的备份文件都会放在这个指定的路径当中。

AOF文件也会存在这个目录下面

注意这里必须指定一个目录而不是文件

Redis 5.0.5配置文件 解读尝试_第14张图片

 

###########################复制 START#########################

1、设置主从复制

#主-副本复制。使用replicaof配置使Redis实例从成为另一个Redis服务器的备份。

#关于Redis复制,有几件事需要尽快了解。

#

# +------------------+ +---------------+

# | 主 | ---> | 副本 |

# | (接收写入) | | (精确复制) |

# +------------------+ +---------------+

#

# 1) Redis复制是异步的,但是您可以配置当master一个连接的slave也没有时停止接收写指令。

# 2)当Slave与master的响应连接断开很小的时间时,slave 可以进行部分同步。这需要用户根据实际情况把backlog的大小设置为一个合理的值(参考该文件的下一个模块)。

3)主从复制是自动进行的,并不需要用户的主动介入。网络分区副本自动尝试连接到主机后与他们进行重新同步。

主从复制,设置该数据库为其他数据库的从数据库。

设置当本机为slave服务时,设置master服务的Ip地址及端口号,在Redis启动时,它会自动从master进行数据同步。

设置值:

replicaof   

Redis 5.0.5配置文件 解读尝试_第15张图片

 

 

2、当master服务设置了密码保护时,slave服务连接master的密码

当master服务设置了密码保护时(用requirepass指定的密码)

slav服务连接master的密码

设置值:

masterauth 

 

3、当slave和master丢失连接或正在进行同步过程中,是否响应客户端请求:

1)、如果slave-serve-stable-data设置为yes(默认值),从库会继续相应客户端的请求,可能是正常数据,也可能是还没获得值的空数据。

2)、如果slave-serve-stable-data设置为no,除去INFO和SLAOF命令之外的任何请求都会返回一个错误:“SYNC with master in progress”

Redis 5.0.5配置文件 解读尝试_第16张图片

 

4、设置从库是否只读

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

Redis 5.0.5配置文件 解读尝试_第17张图片

 

5、设置是否使用Socket方式复制数据

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

Redis 5.0.5配置文件 解读尝试_第18张图片

 

 

6、diskless复制的延迟时间

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

Redis 5.0.5配置文件 解读尝试_第19张图片

 

7、设置从库向主库发送ping请求的时间间隔

命令:repl-ping-slave-period n,默认是10秒

 

8、设置主库批量数据传输时间或者ping回复时间间隔

repl-timeout ,默认值是60秒

一定要确保repl-timeout大于repl-ping-slave-period,否则会不断检测到超时。

Redis 5.0.5配置文件 解读尝试_第20张图片

 

9、是否禁止复制TCP连接的TCP_NODELAY参数

默认为no,即使用tcp nodely。如果master设置了yes,Redis会使用少量TCP报文和少量带宽发送数据给slave。

但是这也可能带来slave端出现延迟。如果使用Linux内核的默认设置,大概40毫秒。

如果设置为no,那么slave端的延迟救护减少但是同步带宽就要增加。

默认我们推荐更小的延迟。

但是在数据量传输很大或主从服务器距离很远的场景下,建议选择yes。

Redis 5.0.5配置文件 解读尝试_第21张图片

 

10、设置复制缓冲区大小

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

命令:

repl-backlog-size  5mb

Redis 5.0.5配置文件 解读尝试_第22张图片

 

11、设置无slave时,master释放复制缓冲区内存的时间

master没有slave一段时间会释放复制缓冲区的内存,单位:秒

从库不会释放复制缓冲区内存,除非从库升级为主库且和从库保持部分同步。

设置值为0时:表示从不释放复制缓冲区内存

命令:

repl-backlog-ttl 3600

Redis 5.0.5配置文件 解读尝试_第23张图片

 

12、设置主库不可用时,从库竞争主库的优先级(整型数值)

当master不可用时,Sentinel会根据slave的优先级选举一个从库升级为master。优先级数值最低的从库当选master。

比如说:现有三个slave在竞选master,优先级数值分别为:10、100、25,Sentinel会选择那个优先级值为10的作为master。

当优先级值设置为0时,该从库用于不会被选中。

默认的优先级数值为100。

Redis 5.0.5配置文件 解读尝试_第24张图片

 

13、设置master禁止写入的方式

Redis提供了可以让master停止写入的方式,如果配置了min-slaves-to-write。当跟master有连接的健康的(redis认为延迟少于min-slaves-max-lag秒)的slave个数少于N,master就进制写入。

min-slaves-to-write设置master能够接收写入命令时健康的slave的最小个数。

这N个slave必须是在线的状态。

min-replicas-max-lag时间的设置需小于由master最后一次接收到slave 的ping请求(通常每秒一次)计算出来的值。

这个配置虽然不能保证N个slave都接收到master的写操作,但是能够避免没有足够健康的slave的时候,master不能写入来避免数据丢失。

举例:设置master接收写入指令至少要三个健康的slave且slave延迟时间小于10秒

min-replicas-to-write 3
min-replicas-max-lag 10

设置其中一个值为0来禁止该特性。

默认的min-replicas-to-write值为0(禁用) min-replicas-max-lag 值为10。

 

Redis 5.0.5配置文件 解读尝试_第25张图片

 

###########################安全START#########################

1、设置认证密码

requirepass配置可以让用户在进行其他的指令前需使用auth命令来认证密码。这可以让用户在不受信任的网络中连接Redis服务端。

对于那些只在自己服务器上运行redis的使用者来说也可以注释该命令,不设置密码。

警告:因为Redis速度很快,所以一台比较好的服务器下,一个外部的用户可以在一秒钟进行150K次的密码尝试,这意味着你需要设置非常非常非常强大的密码来防止暴力破解。

Redis 5.0.5配置文件 解读尝试_第26张图片

 

2、命令重命名

命令重命名,在一个共享环境下我们可以重新命名相对危险的命令。比如把OCNFIG重命名为一个不容易猜测的字符。

举例:

rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52

如果想删除一个命令,可以直接把它重命名为一个空字符串“”即可,如下:

rename-command CONFIG ""

需要注意的是,写入AOF文件或传送给slave的命令重命名也许会引起一些问题。

Redis 5.0.5配置文件 解读尝试_第27张图片

 

#########################客户端START#########################

1、设置同一时间最大客户端连接数

这是同一时间最大客户端连接数量,默认值为10000。实际可接受的最大客户端连接数为设置值减去32,这32是Redis为内部文件描述符保留的。

当客户端连接数达到限制时,Redis会关闭新的连接并向客户端返回max number of clients reached的错误信息。

Redis 5.0.5配置文件 解读尝试_第28张图片

 

########################内存管理START#########################

1、配置Redis的最大内存容量。

当内存满了,Redis就会根据删除(maxmemory-policy)策略尝试去删除一些键。

如果Redis没有找到合适的key来删除或者key删除策略配置的为noeviction(不删除任何key,只返回一个写错误),Redis将开始对接收到写指令(类似SET、PUSH及其他)返回一个错误,但正常响应读命令(类似GET)。

该配置项通常在将Redis当作LRU(Least recently used,最近最少使用)或者LFU(Least frequently used,最近不经常使用)缓存使用时,或者将Redis当作一个硬盘使用且key删除策略为noeviction时很有用。

注意slave的输出缓冲区是不计算在maxmemory内的。索引为了防止主机内存使用完,建议设置maxmemory需要更小一些。

Redis 5.0.5配置文件 解读尝试_第29张图片

 

2、设置内存容量达到上限后key的删除策略

如果内存容量达到最大的内存上限,Redis如何选择要删除哪些key,有以下五种策略可以选择:

volatile-lru -> 根据LRU(Least recently used,最近最少使用)算法删除设置过期时间的key

allkeys-lru -> 根据LRU算法删除任何key

volatile-random -> 随机移除设置过过期时间的key

allkeys-random -> 随机移除任何key

volatile-ttl -> 移除即将过期的key(minor TTL)

noeviction -> 不移除任何key,对于写操作只返回一个写错误

LRU意思是指最近最少使用的

LFU意思是指最近不经常使用的

LRU、LFU以及volatile-ttl使用的都是近似的随机算法。

注意:对所有策略来说,如果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 decrb getset mset msetnx exec sort

默认设置为:不删除任何key,对于写操作直接返回一个错误。

maxmemory-policy noevictio

Redis 5.0.5配置文件 解读尝试_第30张图片

 

 

3、设置Redis LRU、LFU、最小TTL算法检测样本数量

LRU 和 minimal TTL 算法都不是精准的算法,但是相对精确的算法(为了节省内存),用户可以设置检测样本数量来控制速度或者精确度。默认情况下,Redis会从5个检查样本中选择一个最近最少使用的key。用户可以修改默认的检测样本数量配置。

默认的5个样本数量检测结果已经足够精确,10个样本的检查就非常接近真实LRU算法结果但却需要消耗更多的CPU资源,3个数量快但是结果不是很精确。

默认的检测样本数量:5

maxmemory-samples 5

Redis 5.0.5配置文件 解读尝试_第31张图片

 

 

4、设置从库是否忽略最大内存配置项

从Redis5开始,Redis备份库会忽略其配置文件中设置的最大内存配置项(除非该Redis备份机在master失效提升为主库或手动被提升为主库)。这就意味着在不改变该项默认设置的情况(除非你有自己的特殊需要)下,只有主库会进行key的删除策略,且当key的删除策略发送时由主库发送删除命令给备份库。

这个配置是为了保证我们所想要的主从一致的效果。但是,当从库是可写状态或者用户需要从库有不同的最大内存配置时,且用户保证从库、主库操作幂等时,用户可以修改这个默认配置(但一定明白非得这样做的理由)。

注意:默认情况下,从库不会主动删除key,会比设置了最大内存上限的库使用更多的内存(比如说:从库上的内存缓冲区、某些数据结构以及其他)。所以用户需要去监听从库的内存使用情况,保证从库有足够的内存来使用,避免出现从库在主库达到最大内存上限前出现内存不足的情况。

Redis 5.0.5配置文件 解读尝试_第32张图片

 

 

########################懒删除START#########################

1、懒删除

Redis提供了两种基础的删除key的方法。第一种称为DEL,是个阻塞的对象删除方法。这意味着Redis服务线程会停止执行新的命令来去同步去整个内存中查找匹配的对象。如果要删除的key对应的是一个非常小的对象,那么相对于其他Redis中时间复杂度为O(1)或者是O(log_n)的指令来说执行这个删除耗时非常的小。但是如果要删除的key对应的是一个集合类对象,其中包含了百万级的子元素,那么Redis服务执行删除的操作可能会被阻塞很长的时间(即使单位是以秒来计算)。

针对上述问题,Redis为了能够实现以后台运行的方式来回收内存,也提供了像UNLINK(非阻塞删除DEL)、异步的清除所有缓冲区/清空库这样的的基础的非阻塞方式的删除方法。这些指令通常是在固定的时间去执行,Redis服务会后台会有一个线程尽可能快的释放内存中的对象。

DEL,UNLINK, 异步清空缓冲区和库的操作指令是用户控制的。执行其中的哪写指令需要根据应用程序的设计。但是Redis服务会依据其他的配置有时会主动的去删除一些key或者清空整个库。特别是在用户配置如下的配置时,Redis会主动的去删除对象。

1》、内存回收:在配置内存上限和达到内存上限后内存回收策略时,为了能够有空间分配给新的数据,会根据内存回收策略进行内存回收,从而不超过指定的内存限制。

2》、key过期:当key设置了过期时间时(参考expire指令),如果到了过期时间,该key就会从内存中删除。

3》、当一个指令要去设置键值对,但这个键在库中已存在时:比如说指令RENAME oldkey newkey时,如果newkey已经存在,那么Redis会用newKey替换oldKey的同时删除掉库中已存在的newKey对应的键值对。类似的还有SUNIONSTORE指令或者是SORT with STORE(排序并存储)指令都会删除已经存在的key。SET指令只是删除key对应 的旧内容,然后用新的字符串替换。

4》、在数据备份时:slave会删除整个库中数据然后加载执行刚刚从master传出的RDB文件。

内存满逐出 lazyfree-lazy-eviction no 过期key删除 lazyfree-lazy-expire no 内部删除,比如rename oldkey newkey时,如果newkey存在需要删除newkey lazyfree-lazy-server-del no 接收完RDB文件后清空数据选项 replica-lazy-flush no

Redis 5.0.5配置文件 解读尝试_第33张图片

 

####################持久化方式AOF START########################

1、配置Redis数据持久化方式

Redis默认情况下使用rdb方式持久化数据。这种持久化方式对于很多应用来说已经足够用了。但是这种持久化方式下,如果Redis中途宕机或者断电会造成有几分钟数据的丢失(具体丢失数据的时长得看快照保存触发时间间隔)。

Append Only File是另外一种持久化方式,提供了更加高效的数据备份及灾难恢复。使用默认持久化方式的实例可能会在异常断电或者Redis正在写操作时进程异常错误这类突发事件时会丢失最后一次快照保存到故障发生时的写数据,但操作系统此时仍在正常运行。

Redis可以同时开启AOF和RBD两种持久化方式且不会有任何问题。

如果Redis启动时AOF是开启状态,那么Redis会首先去加载执行AOF文件,这个文件提供了更好的持久化保证。(如果同时存在aof和rbd文件,Redis服务启动时会优先加载aof文件的数据到内存,先忽略rdb文件)

Redis 5.0.5配置文件 解读尝试_第34张图片

 

2、设置持久化aof文件名

设置持久化aof文件名,默认为appendonly.aof

 

3、设置数据同步aof文件策略

fsync方法会告诉操作系统把数据写到磁盘上,而不是等着更多的数据进入输出缓冲区。有些系统会立刻把数据写入磁盘,有些系统则是会尽快的去尝试把数据写入磁盘。

Redis支持三种不同的持久化策略:

no:不进行数据同步,由操作系统去操作把数据同步到磁盘,速度很快。

always:每次有写操作都执行fsync同步,以保证数据同步到磁盘,这种模式速度慢,但是最安全。

everysec:表示对写操作进行积累,每秒钟执行一次fsync同步,折中方案。

默认是"everysec"模式,通常来说能在速度和安全之间取得比较好的平衡。

使用哪种模式取决于应用程序的设计,如果使用no不这个策略,为了更好的性能,让操作系统在需要时自动刷新输出缓冲区(如果你能考虑并接受使用默认持久化方式-快照可能丢失数据的风险),或者相反,使用"always"这种速度非常慢但是比“everysec”更安全的同步模式。

如果不确定,就是用模式“everysec”。

# appendfsync always
appendfsync everysec
# appendfsync no

Redis 5.0.5配置文件 解读尝试_第35张图片

 

 

4、设置如果AOF的同步策略设置成 “always” 或者 “everysec”

如果AOF策略设置为always或者everysec时,后台处理进程(后台保存或者AOF日志重写)会执行大量的I/O操作。某些Linux的配置下会使Redis因为fsync()被阻塞很长时间。需要注意的是,目前这个情况还没有任何的解决办法,即使fsync在另外一个线程进行处理也会阻塞我们同步写操作的调用。

为了解决这个问题,我们可以使用下面的选项在BGSAVE或者BGREWRITEAOF时阻止fsync()。

这就意味着,如果有子线程在进行保存操作,如果设置为yes,就相当于将appendfsync 设置为no,就意味着没有执行磁盘操作,只是写入了缓冲区,也就是说在最差的情况下回丢掉30秒钟的日志数据(在Linux系统的默认设置下)。

如果遇到延迟问题就把该项设置为 yes。但是把该项设置为no时数据持久化保存最安全的方式。

Redis 5.0.5配置文件 解读尝试_第36张图片

(文件在ext4中分两部分存储,一部分是文件的metadata,另一部分是data。

metadata和data的操作日志journal也是分开管理的。你可以让ext4记录metadata的journal,而不记录data的journal。

这取决于mount ext4时的data参数

因此,这三种mode的区别是:

1. data=journal

在将data写入文件系统前,必须等待metadata和data的journal已经落盘了。性能最差,并且不支持文件操作的delalloc,O_DIRECT flag (参考 man open)。

2. data=ordered

这个模式不记录data的journal,只记录metadata的journal日志,但是在写metadata的journal前,必须先确保data已经落盘。

3. data=writeback

不记录data journal,仅记录metadata journal。并且不保证data比metadata先落盘。)

 

 

5、设置重写AOF文件的条件

AOF文件自动重写。

当AOF文件增长达到指定的百分比时,REdis能够通过BGREWRITEAOF自动重写AOF日志文件。

工作原理:Redis会记录最后一次重写AOF文件时的大(如果直到重启时还没有重写发生,那么就使用重启时AOF文件的大小。)

把记录的AOF文件大小和当前的AOF文件大小作比较,如果当前AOF文件大小增长比例超过指定的比例,就会触发重写操作。同样,我们需要指定开始AOF重写的最小大小,这样就能避免AOF文件增长比例虽然达到指定的比例但AOF文件很小的情况下进行重写的问题。

指定比例为0:表示禁用AOF文件重写特性。

#AOF文件达到如下增长比例时重写:
auto-aof-rewrite-percentage 100
#AOF文件未达到如下大小时不重写:
auto-aof-rewrite-min-size 64mb

 

Redis 5.0.5配置文件 解读尝试_第37张图片

 

 

6、AOF文件得数据Redis加载内存异常时,是否截取掉

Redis在启动并AOF文件数据加载进内存时,有可能发现该AOF文件数据信息不完整。

这种情况可能发生在Redis运行所在的系统奔溃了,特别是当ext4文件系统设置的非data=ordered模式时(但是,Redis本身奔溃或异常终止而操作系统仍正常运行的情况应该不会发生。)

Redis启动加载AOF文件并发现AOF文件末尾数据信息不完整时,要么是报错退出,要么是尽可能的把数据加载进内存(该项为现在默认配置)。下面的选项可以控制Redis的行为:

如果aof-load-truncated设置的值是yes,那么如果一个因异常被截断的AOF文件被Redis启动时加载进内存,Redis会把这个信息发送给用户。如果设置的为no,Redis会中止并报错,决绝启动。用户需要使用“redis-check-aof”工具来修复文件再启动。

注意,如果发现AOF文件在中间被截断,那么Redis服务仍会退出并报出错误。该项配置仅在Redis尝试从AOF文件中去读更多数据但找不到足够的数据字节时生效。

 

Redis 5.0.5配置文件 解读尝试_第38张图片

 

 

7、重写aof文件是否使用RDB做前导

重写AOF文件时,Redis可以使用RDB文件作为前导来加快重写和回复。如果设置为使用开启此设置,那么重写的AOF文件将由两个不同部分组成:

[RDB文件][AOF结尾]

当Redis加载AOF文件时识别到AOF文件是以“REDIS”字符串开头的,就会先去加载文件前缀对应的RDB文件,然后在继续加载AOF中尾部命令。

Redis 5.0.5配置文件 解读尝试_第39张图片

 

####################LUA脚本 START########################

1、设置Redis执行LUA 脚本的最大执行时间

最大的Lua脚本执行时间,单位:毫秒

设置值为0或者负值表示不限制脚本执行时间且无任何提示信息。

Redis 5.0.5配置文件 解读尝试_第40张图片

 

 

 

####################Redis集群 START########################

1、设置是否作为集群节点启动Redis

正常启动的Redis实例是不能成为集群的一个节点的,除非Redis实例被设置为作为集群节点来启动。为了可以使Redis实例作为集群的一个节点来启动,取消下面配置项的注释即可。

Redis 5.0.5配置文件 解读尝试_第41张图片

 

2、配置Redis自动生成的集群配置文件名称

每个Redis集群节点都需要一个集群信息配置文件。这个文件并不需要人为的去编辑修改。它是由Redis集群节点自动生成的。每个Redis集群节点实例都需要有一个不同的集群信息配置文件。要确保同一系统中运行的各Redis实例该集群信息配置文件不重名。

Redis 5.0.5配置文件 解读尝试_第42张图片

 

 

3、设置集群节点超时毫秒数

集群节点超时时间是指一个节点不可访问状态的持续多少毫秒数才会被认为是节点连接失败。

大多数其他内部时间限制都设置为节点超时时间的倍数。

Redis 5.0.5配置文件 解读尝试_第43张图片

 

 

4、设置slave数据过旧时提升为master条件

如果slave数据太旧,那么在该slave所属的master节点不可用时,该slave不会参加master节点的竞争(即该slave会避免成为备用的master节点)。

目前并没有一个简单的方法去衡量一个slave存储的数据的“数据年龄”,但是可以通过下面两个措施来进行检查:

1)、如果有多个slave可以用来进行故障转移(即有多个slave可竞选master节点),那么这些slave之间会相互交换信息来找到拥有最佳复制偏移量(更多的数据来自于主库进程)的slave。

slave会根据复制偏移量来排名,并在开始进行故障转移时使用该延迟比例排名作为依据。

2)、每个slave都会计算最后一次与主库进行交互的时间。这个交互可以是最后一次接收到来自主库的的ping或指令(如果主从库仍处于已连接状态)到现在的时间,也可以是slave与主库连接从断开到现在的时长(如果复制连接已经断开)。如果最后一次交互距现在时间太长,slave将不会尝试进行故障转移(即slave不会被提升为master)。

第二个条件用户可以进行设置,即如果slave最后一次与主库进行交互局距现在的时长大于下面的情况时,则slave将不会被提升为master:

(node-timeout * replica-validity-factor) + repl-ping-replica-period

比如说:

node-timeout为30秒,slave-validity-factor为10,如果默认的repl-slave-period为10秒,主从库失联时间超过310秒时,slave就不会被提升为master。

较大的slave-validity-factorr值可能导致包含过旧数据的slave成为master,同时较小的值可能会导致集群中无slave可用于选举新的master。

为了达到最大限度的高可用性,可以设置为0,即slave不管和master失联多久都可以提升为master。

Redis 5.0.5配置文件 解读尝试_第44张图片

 

5、设定集群主节点的最小从节点数

集群slave节点可以被提升为孤立的(即没有从节点的master节点)master节点。这提高了集群容灾的能力。

只有在旧master节点有其他指定数量的工作状态下的slave节点时,集群slave节点才能被提升为master节点。这个值是集群提升master节点的边界值。如果边界值为1时意味着只有在旧master至少有一个工作状态的slve节点时,slave节点才能被迁移成为master节点。这个值通常也反映了我们的集群中每个master节点对应的slave节点的数量。

默认值是1(即集群slave节点只有在其旧master节点至少有一个工作状态的slave节点时才能提升为master节点)。设置一个比较大的值就能禁止故障转移。值设置为0对测试会很方便,但是用在生成环境却很危险。

Redis 5.0.5配置文件 解读尝试_第45张图片

 

 

6、设置集群可用状态对hash 槽健康程度的依赖度

默认情况下如果Redis集群发现至少1个不可用,集群将停止查询数据。

这回是的当集群部分不可用时(例如部分hash槽不可用),整个进群将变得不可用。如果所有slot回复,则集群自动回复。

如果需要集群部分可用的情况下仍提供查询服务,设置 cluster-require-full-coverage 值为no即可。

Redis 5.0.5配置文件 解读尝试_第46张图片

 

 

7、设置是否允许slave节点在master节点故障时进行故障转移

当选项设置为yes时,会阻止replicas尝试在其master处于故障期间进行故障转移。当然,master也可以进行手动故障转移,如果强制这样做的话。

该选项在不同的场景是有用的,特别是在有多个数据中心情况下,我们希望能除非在真个数据中心都挂掉,不然不允许一边被提升。

Redis 5.0.5配置文件 解读尝试_第47张图片

 

 

######################Docker集群配置 ########################

1、设置集群集群中使用的ip、端口等信息

在某些部署中,Redis群集节点地址发现失败,因为地址是NAT-Ted或端口被转发(典型情况是Docker和其他容器)。

为了能够让Redis集群在这样的环境下正常运行,必须的设置一个静态的每个节点都知道的公开地址。下面的选型就是用在这种场景下:

#cluster-announce-ip #cluster-announce-port #集群总线端口 #cluster-announce-bus-port

每个节点关于告知其自己地址、客户端端口号和集群消息总线端口。这些信息会放在之后发布的bus 包的头部以便其他节点能偶正确映射发布信息的集群节点的位置信息。

如果不设置上述选型,Redis会使用常规的集群自动检测方式来替代。

注意,重新映射时,总线端口可能不再是固定的客户端端口+10000,因此可以根据需要指定任何客户端端口和总线端口。如未设置总线端口,则会默认使用客户端端口+10000作为总线端口。

默认情况下,Redis会自动检测自己的IP和从配置中获取绑定的PORT,告诉客户端或其他节点。

而在Docker环境中,如果使用的不是host网络模式,在容器内部的Ip和PORT都是隔离的,那么客户端和其他节点无法通过公布的IP和PORT建立链接。

启用以下配置,Redis节点会将配置中的这些IP和PORT告知客户端或者其他节点。而这些IP和PORT都是通过Docker转发到容器内的临时的IP和PORT的。

Redis 5.0.5配置文件 解读尝试_第48张图片

 

 

######################### 慢查询日志###########################

1、设置界定慢查询时间值

Redis慢日志查询是一个记录超过指定执行时间的查询的系统。执行时间不包括I/O操作,例如与客户端通信、发送答复等等,而只是实际执行命令所需的时间(即指令执行过程中线程被阻塞同时不能处理其他请求的唯一阶段)。

你可以使用两个参数来配置慢查询日志:一个参数告诉Redis执行时间(一微秒为单位)超过该项值的的指令才能被记录;另一个参数是慢查询日志的长度。当一个新的指令被记录时,最老的指令将从记录的命令队列中删除。

下面的时间以微秒为单位(1000000微秒等于1秒)。

注意,负数值将禁用慢查询日志,值为0则会强制的记录每条执行的指令(记录所有指令)。

Redis 5.0.5配置文件 解读尝试_第49张图片

 

2、设置慢查询日志长度(条数)(FIFO队列)

慢查询日志长度没有限制,但是要注意它会消耗内存。

可以通过SLOWLOG RESET命令重置慢查询日志所用的内存。

只有当慢查询日志超过指定的长度后,记录新指令时才会删除最早的慢速指令。

 

 

######################### 延时监控系统 #########################

1、设置延时监控阀值(记录执行时间大于等于指定时间【毫秒】的操作)

Redis延时监视子系统对不同的操作进行采样,以便收集可能导致延时的数据根源。

通过LATENCY指令可以打印图表并获取报告。

系统仅记录大于等于 latency-monitor-threshold指定的毫秒数的时间执行的操作。当其值设置为零时,延时监控系统将被关闭。

默认情况下,延时监控系统是禁用状态的,因为如果不存在延迟问题,则通常不需要延迟监控,而且收集数据会对性能产生影响,虽然很小,但在高负载下测量。如果需要,可以使用指令 CONFIG SET latency-monirot-threshold 毫秒数在运行时轻松启用延时监控系统。

Redis 5.0.5配置文件 解读尝试_第50张图片

 

 

###########################事件通知###########################

1、设置事件通知类型

Redis能通知Pub/Sub客户端关于键空间发生的事件。默认,关闭。

一个开启了键空间事件通知Redis实例,当客户端对存储在数据库0中的"foo"键值对执行删除操作时,则会通过Pub/Sub发布两条消息:

# PUBLISH __keyspace@0__:foo del

# PUBLISH __keyevent@0__:del foo

可以选择让Redis在一组类之间通知的事件。每个类都由单个字符来标识:

##K 键空间通知,所有通知以 __keyspace@__ 为前缀

##E 键事件通知,所有通知以 __keyevent@__ 为前缀

##g DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知

##$ 字符串命令的通知

##l 列表命令的通知

##s 集合命令的通知

##h 哈希命令的通知

##z 有序集合命令的通知

##x 过期事件:每当有过期键被删除时发送

##e 驱逐(evict)事件:每当有键因为 maxmemory 政策而被删除时发送

##A 参数 g$lshzxe 的别名,即字符串“AKE”意味着所有事件。

指令"notify-keyspace-events"的值是由0个或多个字符组成的字符串。空字符串表示禁用事件通知功能。

示例:如果要开启列表和普通事件的通知功能,根据上面列举的通知项的标识符,配置值如下:

notify-keyspace-events Elg

默认情况下,所有通知都是被禁用的,因为大多数用户不需要这些功能而且启用通知也会有一些开销。注意:参数值中至少要有一个K或者E,否则的话,不会有任何的事件通知。

Redis 5.0.5配置文件 解读尝试_第51张图片

 

 

###########################高级配置###########################

1、Hash编码使用不同数据结构的条目及阀值

当哈希有少量条目且不超过给定的阀值时,使用内存高效的数据结构进行编码。可以使用一下指令配置条目数量和阀值:

hash-max-ziplist-entries 512:ziplist中允许存储存储的最大条目个数,默认为512

hash-max-ziplist-value 64:ziplist中允许value值最大字节数,默认为64。

注:哈希类型的数据在编码上可以使用ziplist和hashtable。ziplist的特点就是文件存储(以及内存存储)所需的空间比较小,在内容较小时,性能和hashtable几乎一样。因此Redis对Hash类型默认采取ziplist。如果hash中条目个数或者value长度达到阀值,将会被重构为hashtable。

Redis 5.0.5配置文件 解读尝试_第52张图片

 

2、list编码类型使用不同数据结构设置

list编码同样也使用了一种特殊方式来节省空间。

每个内部列表节点允许的条目数可以指定为固定的最大大小或最大元素数。

对于固定的最大大小,使用-5 到 -1区间的值,其指代别如下:

#-5: 每个quicklist节点上的ziplist大小不能超过64 Kb。(注:1kb => 1024 bytes)

#-4: 每个quicklist节点上的ziplist大小不能超过32 Kb。

#-3: 每个quicklist节点上的ziplist大小不能超过16 Kb。

#-2: 每个quicklist节点上的ziplist大小不能超过8 Kb。(-2是Redis给出的默认值)

#-1: 每个quicklist节点上的ziplist大小不能超过4 Kb。

当取正值的时候,表示按照设置的数值来限定每个quicklist节点上的ziplist长度(即取负值的时候,设置值用来限定每个quicklist节点上ziplist长度,

范围-1~ -5)。

性能最高的选项通常是-2(8 Kb大小)或-1(4 Kb大小),但如果你的用例是唯一的,请根据需要调整设置。

Redis 5.0.5配置文件 解读尝试_第53张图片

 

 

3、设置列表的压缩深度

列表也可以被压缩。

压缩深度指的是quicklist的ziplist两端被排除不被压缩的节点数。为了进行快速的存取操作,列表的头部和尾部节点始终是不进行压缩的。

#参数list-compress-depth的取值含义如下:

#0: 是个特殊值,表示都不压缩。这是Redis的默认值。

#1: 表示quicklist两端各有1个节点不压缩,中间的节点压缩。

#2: 表示quicklist两端各有2个节点不压缩,中间的节点压缩。

#3: 表示quicklist两端各有3个节点不压缩,中间的节点压缩。

#依此类推…

注:#这个参数表示一个quicklist两端不被压缩的节点个数。

这里的节点个数是指quicklist双向链表的节点个数,而不是指ziplist里面的数据项个数。 #实际上,一个quicklist节点上的ziplist,如果被压缩,就是整体被压缩的。

Redis 5.0.5配置文件 解读尝试_第54张图片

 

 

4、设置set使用inset编码方式的阀值

set有一种特殊的编码情况:当set数据全是十进制64位有符号整形术字组成的字符串时。

下面的配置项用来设置set使用这种编码来节省内存的最大长度。

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

Redis 5.0.5配置文件 解读尝试_第55张图片

 

 

5、有序集合设置编码方式

与hash和list类似,有序集合也可以用一种特别的编码方式来节省大量空间。这种编码只适合长度和元素都小于下面限制的有序集合。

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

Redis 5.0.5配置文件 解读尝试_第56张图片

 

6、设置使用稀疏数据结构的阀值

HyperLogLog稀疏表示字节限制。该限制包括16个字节的头。当HyperLogLog系数结构表示这些限制,它会被转换成密度表示。

设置值大于16000时是完全没有用户的,因为在该点密集表示更有效。

建议值是3000,这样设置的好处是编码更节省空间,减少内存的消耗。如果对CPU要求不高,对空间要求较高时,建议设置到10000左右。

注:value小于等于hll-sparse-max-bytes使用细数数据结构(sparse),大于hll-sparse-max-bytes使用密集数据结构。

Redis 5.0.5配置文件 解读尝试_第57张图片

 

 

 

7、设置Stream宏节点最大大小/项目数量

Stream宏节点最大大小/项目。流数据结构是基数编码内部多个项目的大节点树。使用此配置可以配置添加新 的流条目时,单个节点的字节数,以及切换到新节点之前可能包含的最大项目数。如果以下任何配置设置为0,就会忽略限制,因此可以设置一个例如将最大入口限制,把max-byte设置为0,max-entries设置为所需的值。

stream-node-max-bytes 4096 stream-node-max-entries 100

 

 

8、设置启用哈希刷新

启用哈希刷新,则Redis每100毫秒的CPU时间会拿出1毫秒的CPU时间用来帮助刷新主Redis的hash表(顶级键值映射表)【刷新hash表可降低内存的使用】。Redis的hash表使用(参照 dict.c)惰性哈希刷新:在一个正在进行哈希刷新的哈希表,你执行的操作越多,则哈希刷新会被执行越多次,所以如果服务处于空闲状态,哈希刷新就不会完成(可能是不执行),而且哈希表会使用更多的内存。

默认情况下,每秒内会对Hash表进行10次1毫秒的哈希刷新,尽可能的释放内存。

如果不确定:

当你的使用场景中,有非常严格的实时性要求,不能够接受Redis时不时的对请求有2毫秒延迟的话,就把该项设置为no。

如果没有太严格的实时性要求,希望能够尽可能快的释放内存,可以设置为yes。

Redis 5.0.5配置文件 解读尝试_第58张图片

 

9、客户端的输出缓冲区的限制

客户端的输出缓冲区限制,可用于强制断开那些因为某种原因从服务器读取数据速度不够快的客户端(通常原因是一个Pub/Sub客户端处理消息的速度跟不上消息发布端的发布速度)。

该项限制对于三种不同的客户端有不同设置项:

#对于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

Redis 5.0.5配置文件 解读尝试_第59张图片

 

 

10、客户端查询缓冲区累积新命令

#客户端查询缓冲区累积新命令。它们仅限于固定的默认情况下,

#多数情况下为了避免协议不同步导致客户端查询缓冲区中未绑定的内存使用量的错误

#但是,如果你有使用的话,你可以在这里配置它,比如我们有很多执行请求或类似的。

#client-query-buffer-limit 1gb

Redis 5.0.5配置文件 解读尝试_第60张图片

 

11、proto-max-bulk-len

#在Redis协议中,批量请求,即表示单个的元素strings,通常限制为512 MB。

#但是,您可以z更改此限制

#proto-max-bulk-len 512mb

 

12、hz

#默认情况下,“hz”的被设定为10。提高该值将在Redis空闲时使用更多的CPU时,但同时当有多个key

#同时到期会使Redis的反应更灵敏,以及超时可以更精确地处理

hz 10

Redis 5.0.5配置文件 解读尝试_第61张图片

 

13、dynamic-hz

#开启动态hz

redis执行任务的频率为1s除以hz

dynamic-hz yes

Redis 5.0.5配置文件 解读尝试_第62张图片

 

14、aof-rewrite-incremental-fsync

#当一个子进程重写AOF文件时,如果启用下面的选项,则文件每生成32M数据会被同步

aof-rewrite-incremental-fsync yes

Redis 5.0.5配置文件 解读尝试_第63张图片

 

15、rdb-save-incremental-fsync

#当redis保存RDB文件时,如果启用了以下选项,每生成32 MB数据,文件将被fsync-ed。

#这很有用,以便以递增方式将文件提交到磁盘并避免大延迟峰值。

rdb-save-incremental-fsync yes

Redis 5.0.5配置文件 解读尝试_第64张图片

 

16、Redis LFU

Redis 5.0.5配置文件 解读尝试_第65张图片

 

###########################碎片整理#######################

Redis 5.0.5配置文件 解读尝试_第66张图片

1、启用主动碎片整理

 

2、启动活动碎片整理的最小碎片浪费量

 

3、启动碎片整理的最小碎片百分比

 

4、使用最大消耗时的最大碎片百分比

 

5、在CPU百分比中进行碎片整理的最小消耗

 

6、磁盘碎片整理的最大消耗

 

7、将从主字典扫描处理的最大set/hash/zset/list字段数

 

尝试解读只是作者个人理解,如有不正确的地方,请不吝指教。

本文参考博客:

https://cloud.tencent.com/developer/article/1423727

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Redis,Redis,5.0.5配置文件)