个人学习记录,大部分翻译自redis.config,有错误的地方欢迎指正
########################## NETWORK 网络 ##########################
默认情况下,如果未指定“bind”配置指令,redis将侦听服务器上所有可用网络接口的连接。可以使用“bind”配置指
令只监听一个或多个选定接口,后跟一个或多个IP地址。
如果运行redis的计算机直接暴露在internet上,绑定到所有接口是危险的,并且会将实例暴露给internet上的每个
人。因此,默认情况下,我们取消对bind指令的注释,该指令将强制redis只侦听ipv4环回接口地址(这意味着
redis只能接受运行在同一台计算机上的客户端的连接。)
#bind 127.0.0.1 //只有本地可连接
#bind 0.0.0.0 //绑定ip,或不配置bind,所有主机可连接
端口,默认6379;如果指定了端口0,则Redis将不会在TCP套接字上侦听。
port 6379
开启保护模式,默认启动,当保护模式打开且如果:
- 服务器没有显式使用“bind”指令绑定到一组地址。
- 没有配置密码。
服务器只接受来自连接IPv4和IPv6环回地址127.0.0.1和 ::1 的客户端以及来自Unix域套接字的连接。
默认情况下,已启用保护模式。只有当您确定希望来自其他主机的客户端连接到redis时,才应该禁用它,即使没
有配置身份验证,也没有使用“bind”显式列出特定的接口集。
protected-mode yes
tcp listen() 积压。
在每秒高请求的环境中,您需要高的积压工作,以避免客户端连接速度慢的问题。
请注意,Linux内核将自动将其
截断为/proc/sys/net/core/somaxconn的值,该内核参数默认值一般是128
,对于负载很大的服务程序来说大大
的不够。一般会将它修改为2048或者更大。因此请确保同时提高somaxconn和tcp_max_syn_backlog的值,以获
得所需的效果。
tcp-backlog 511
客户端空闲N秒后关闭连接(0表示禁用)
timeout 0
TCP保持活动状态。
如果不为零,则使用so_keepalive在没有通信的情况下向客户端发送tcp ack。这有两个原因:
- 检测死亡的同伴。
- 从中间网络设备的角度进行连接。
在Linux上,指定的值(
以秒为单位
)是用于发送ACK的周期。请注意,要关闭连接,需要两倍的时间。在其他内
核上,周期取决于内核配置。此选项的合理值为300秒,这是从redis 3.2.1开始的新redis默认值。
tcp-keepalive 300 //0表示禁用
########################### GENERAL 通用 ###########################
默认情况下,redis不作为守护进程运行。如果需要,请使用“是”。注意,redis将在守护时在/var/run/redis.pid文
件中写入一个pid。
daemonize yes //以后台守护进程方式运行
如果指定了一个PID文件,Redis会在启动时指定它,并在退出时删除它。
当服务器运行非守护进程时,如果配置中未指定任何PID文件,则不会创建任何PID文件。
服务器被守护时,即使未指定,也会使用PID文件,默认为“/var/run/redis.pid”。
最大的努力创建一个pid文件:如果redis不能创建它,没有什么不好的事情发生,服务器将启动并正常运行。
pidfile /var/run/redis_6379.pid //进程id存放位置
日志等级(debug,verbose,notice,warning)
- debug:大量信息,对开发/测试有用
- verbose:许多信息很少有用,但不像调试级别那样混乱
- notice:适度冗长,可能是生产中需要的
- warning:仅记录非常重要/关键的消息
loglevel notice
日志文件名
logfile ""
要启用系统日志记录,只需将“syslog enabled”设置为yes,并根据需要更新其他syslog参数。
# syslog-enabled no
指定系统日志标识。
# syslog-ident redis
指定syslog工具。必须是用户或介于local0-local7之间。
# syslog-facility local0
设置数据库数量,默认16个,默认选中第0个,用select+数据库id切换
databases 16
默认情况下,只有在开始登录到标准输出并且标准输出是tty时,redis才会显示ascii艺术徽标。基本上,这意味着
通常徽标只在交互会话中显示。但是可以强制4.0之前的行为并始终显示,通过将以下选项设置为yes,以在启动日
志中显示ASCII艺术徽标。
always-show-logo yes //在日志中始终显示redis标志
######################## SNAPSHOTTING 快照 ###########################
将数据库保存在磁盘上,格式:
save
如果给定的秒数和针对数据库的给定写操作数同时发生,则将保存数据库。
在下面的示例中,行为将是保存:
- 900秒(15分钟)后,如果至少更换了一个钥匙
- 300秒(5分钟)后,如果至少10个键发生变化
- 60秒后,如果至少10000个密钥更改
注意:您可以通过注释掉所有“save ”行来完全禁用保存。
还可以通过添加带有单个空字符串参数的save指令来删除所有先前配置的保存点,如下例所示:
- save ”
# rdb触发方式,15分钟一个写操作,5分钟10个写操作,1分钟1万个写操作,可以通过注释来禁用,
# 或者通过添加带有单个空字符串参数的save指令
save 900 1
save 300 10
save 60 10000
如果启用了rdb快照并且最近一次后台保存失败了,默认情况下redis会停止接收写入,如果后台保存进程将再次开
始工作,Redis将会自动允许再次写入。如果不在乎数据不一致或者有其他的手段发现和控制,就设置为no
stop-writes-on-bgsave-error yes
对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想
消耗CPU来进行压缩的话,可以设置为关闭此功能
rdbcompression yes
在存储快照后,还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希
望获取到最大的性能提升,可以关闭此功能
rdbchecksum yes
rdb文件名
dbfilename dump.rdb
工作目录,保存的rdb和aof文件在这个目录下
dir ./
####################### REPLICATION 主从复制 ##########################
主从复制。使用slaveof将Redis实例复制为另一个Redis服务器的副本。尽快了解有关Redis复制的几件事。
-
redis复制是异步的,但是如果父节点似乎没有连接到至少给定数量的子节点,则可以将其配置为停止接受写操作。
-
如果复制链路在相对较短的时间内丢失,redis子节点可以执行与父节点的部分重新同步。您可能需要根据需要使用合理的值(repl-backlog-size的值)来配置复制积压大小(请参阅本文件的下一节)。
-
复制是自动的,不需要用户干预。网络分区副本会自动尝试重新连接到主机并与它们重新同步。
replicaof | slaveof <master ip> <master port>
如果父节点受密码保护(使用下面的“requirepass”配置指令),则可以在启动复制同步过程之前通知子节点进行
身份验证,否则父节点将拒绝子节点请求。
masterauth <master-password>
当slave与master断开时连接时,或者复制还在进行时:
-
如果slave-serve-stale-data设置为’yes’(默认值),则slave将仍然回复客户端请求,可能是过期数据,或者
如果这是第一次同步,#data set可能只是空的。
-
如果slave-serve-stale-data设置为’no’,则slave将回复对所有类型的命令都出现错误“SYNC with master in progress” 。
replica-serve-stale-data yes
设置slave只读,默认yes
replica-read-only yes
警告:无盘复制目前正在试验中
RDB文件从节点传输到子节点。传输可能以两种不同的方式发生:
- 磁盘备份:redis父节点创建一个新进程,将rdb文件写入磁盘。稍后,父进程将文件以增量方式传输到子节点。
- 无盘:redis master创建一个新的进程,直接将rdb文件写入子节点套接字,而根本不接触磁盘。
默认不启用无盘同步
repl-diskless-sync no
子节点以预定义的间隔向服务器发送ping。可以使用repl_ping_replica_period选项更改此间隔。默认值为10秒。
即:SLAVE周期性的ping MASTER间隔,可直接理解成SLAVE -> MASTER间的心跳间隔(注意箭头方向)
repl-ping-replica-period 10
同步后在副本套接字上禁用TCP节点?
如果选择“是”,redis将使用较少的tcp数据包和较少的带宽向副本发送数据。但这可能会增加数据在副本端出现的延迟,对于使用默认配置的linux内核,延迟可达40毫秒。
如果选择“否”,数据出现在副本端的延迟将减少,但复制将使用更多带宽。
默认情况下,我们会针对低延迟进行优化,但在流量非常大的情况下,或者当父节点和子节点之间的跳数很多时,
将其设置为“是”可能是一个好主意。
repl-disable-tcp-nodelay no //对延时有要求就关掉
设置复制积压大小。backlog是一个缓冲区,当子节点断开连接一段时间后,它会累积子节点数据,因此当子节点
想要重新连接时,通常不需要完全重新同步,但是部分重新同步就足够了,只需传递子节点在断开连接时丢失的数
据部分。复制backlog越大,子节点断开连接的时间就越长,以后就可以执行部分重新同步。只有当至少连接了一
个子节点时,才会分配backlog。
repl-backlog-size 1mb
父节点在一段时间内不再连接子节点后,将释放积压。以下选项配置了所需的秒数,从最后一个子节点断开连接开始,释放积压缓冲区。
请注意,子节点永远不会释放待办事项列表,以供超时使用,因为它们可能在以后升级为父节点,并且应该能够正
确地与子节点“部分重新同步”从属逻辑:因此它们应该始终累积待办事项列表。值为0意味着永远不会释放
backlog。
repl-backlog-ttl 3600
如果父节点不再正常工作,Sentinel使用它来选择要升级为master的从属设备,具有低优先级的从站被认为更适合
升级。
例如,如果有三个优先级为10,100,25的slave,那么Sentinel将选择优先级为10的那个,即最低的。
0表示不参于选举
replica-priority 100
如果连接的子节点少于n个,且延迟小于或等于m秒,则父节点可以停止接受写入。n个子节点需要处于“在线”状态。
以秒为单位的延迟(必须小于等于指定值)是根据子节点接收的最后一次ping(通常每秒发送一次)计算得出
的。此选项不保证n个子节点将接受写操作,但会将丢失写操作的曝光时间限制在指定的秒数(如果没有足够的子
节点可用)。
例如,需要至少3个延迟时间小于等于10秒的子节点,请使用:
# min-replicas-to-write 3 要写入的最少子节点数3
# min-replicas-max-lag 10 最小子节点最大延迟10
将其中一个设置为0将禁用该功能。默认情况下,要写入的最小节点数设置为0(功能已禁用),并且最小节点最
大延迟设置为10。
redis主机能够以不同的方式列出子节点的地址和端口。
子节点通常报告的所列IP和地址按以下方式获取:
-
IP:通过检查子节点用于连接父节点的套接字的对等地址,自动检测该地址。
-
端口:该端口在复制握手期间由子节点通信,通常是子节点用于侦听连接的端口。
然而,当使用端口转发或网络地址转换(nat)时,子节点实际上可以通过不同的ip和端口对访问。子节点可以使
用以下两个选项,以便向其主机报告一组特定的IP和端口,以便信息和角色都将报告这些值。该配置就是向其主机
报告一组特定的IP和端口,以便“role”命令的输出信息和角色都将报告这些值。
# replica-announce-ip 5.5.5.5
# replica-announce-port 1234
########################## SECURITY 安全 ############################
设置密码,连接时要使用 AUTH 认证
requirepass foobared
########################## CLIENTS 客户端 ############################
设置同时连接的客户端最大数量。默认此限制为10000个,达到限制后,Redis将关闭所有的新连接然后返回错误信
息’max number of clients reached’。但是,如果redis服务器无法将进程文件限制配置为允许指定的限制,则允
许的最大客户端数将设置为当前文件限制减去32(因为redis保留一些文件描述符供内部使用)。
maxclients 10000
################# MEMORY MANAGEMENT 内存管理 ####################
将内存使用限制设置为指定的字节数。
当达到内存限制时,redis将根据所选的逐出策略(请参阅maxmemory策略)尝试删除密钥。
如果redis无法根据逐出策略移除密钥,或者逐出策略设置为“noeviction”,redis将开始对写操作(如set、lpush
等)进行错误回复,并继续回复get等只读命令。
当将redis用作lru或lfu高速缓存或为实例设置硬盘限制(使用“noeviction”策略)时,此选项通常很有用。
警告:如果将子节点附加到启用了maxmemory的实例,从已用内存计数中减去子节点所需的输出缓冲区大小,
网络问题/重新同步就不会触发一个回收密钥的循环,反过来,子节点的输出缓冲区充满了被逐出的密钥,从而触
发更多的密钥,以此类推,直到数据库完全清空。
简而言之…如果附加了子节点,建议您设置maxmemory的下限,以便系统上有一些空闲内存用于副本输出缓冲区
(但如果策略为“noeviction”,则不需要此限制)。
# maxmemory <bytes>
内存管理,过期策略,以下几种(4.0之前):
- volatile-lru -> 在设置了过期时间的密钥中挑选最近最少使用的数据淘汰。
- allkeys-lru -> 从任何密钥中挑选最近最少使用的数据淘汰。
- volatile-random -> 从已设置过期时间的数据集中任意选择数据淘汰。
- allkeys-random -> 移除随机键,任意键。
- volatile-ttl -> 删除最接近到期时间的密钥(次要ttl)。
- noeviction -> 不要逐出任何内容,只返回写操作错误。
之后:
- volatile-lfu -> 在设置了过期时间的密钥中挑选最不常用的数据淘汰。
- allkeys-lfu -> 从任何密钥中挑选最不常用的数据淘汰。
LRU表示最近最少使用;LFU表示最不常用。
注意:使用上述任一策略,当没有合适的密钥可供逐出时,redis将在写入时返回错误操作。
默认值为:
# maxmemory-policy noeviction
LRU、LFU和最小TTL算法不是精确算法,而是近似算法(为了节省内存),因此可以调整速度或精度。
默认情况下,redis将检查五个键并选择最近使用较少的键,您可以使用以下配置指令更改样本大小。
默认值5产生足够好的结果。10接近非常真实的LRU,但花费更多的CPU。3更快,但不太准确。
# maxmemory-samples 5
从redis 5开始,默认情况下,子节点将忽略其maxmemory设置(除非在故障转移后升级为master或手动升为
父节点)。这意味着密钥的收回将由父节点处理,将del命令作为父节点的密钥收回发送到子节点。此行为确保父
节点和子节点保持一致,并且通常是您想要的,但是如果您的子节点是可写的,或者您希望子节点具有一个不同的
内存设置,并且您确定对子节点执行的所有写入都是等幂的,那么您可以更改此默认值(但一定要了解您正在做什么)。
请注意,由于默认情况下子节点不会退出,因此它可能会使用比通过maxmemory设置的内存更多的内存(子节点
上可能有某些缓冲区更大,或者数据结构有时会占用更多内存,因此)。因此,请确保监视子节点,并确保它们有
足够的内存,在父节点达到配置的maxmemory设置之前,不会出现真正的内存不足情况。
# replica-ignore-maxmemory yes
####################### LAZY FREEING 惰性删除 #########################
Redis有两个删除键的原语。一个叫做DEL,是一个阻塞是对对象的阻塞删除。这意味着服务器停止处理新命令,
以便以同步方式回收与对象关联的所有内存。如果删除的键与一个小对象相关联,则执行del命令所需的时间非常
短,与redis中的大多数其他o(1)或o(log_n)命令相当。但是,如果密钥与包含数百万个元素的聚合值关联,
则服务器可以阻塞很长时间(甚至几秒钟)以完成操作。
出于上述原因,redis还提供了unlink(non-blocking del)等非阻塞删除原语以及flushall和flushdb命令的异步选
项,以便在后台回收内存。那些命令在固定时间内执行。另一个线程尽可能快地在后台逐步将对象释放。
flushall和flushdb的del、unlink和async选项由用户控制。这取决于应用程序的设计,以了解何时使用一个或另一
个是一个好主意。然而,redis服务器有时不得不删除密钥或刷新整个数据库,这是其他操作的副作用。
具体来说,在以下情况下,redis独立于用户调用删除对象:
- 在逐出时,由于maxmemory和maxmemory策略配置,为了在不超过指定内存限制的情况下为新数据腾出空间。
- 由于过期:必须从内存中删除具有相关生存时间的密钥(请参阅expire命令)。
- 由于命令的副作用,它将数据存储在可能已经存在的密钥上。例如,当旧的密钥内容被另一个密钥内容替换时,rename命令可能会删除它。同样的SUNIONSTORE或带有STORE选项的SORT可能会删除现有密钥。set命令本身删除指定键的任何旧内容,以便用指定字符串替换它。
- 在复制过程中,当子节点与其父节点执行完全重新同步时,将删除整个数据库的内容,以便加载刚刚传输的RDB文件。
在上述所有情况下,默认情况是以阻塞的方式删除对象,就像调用del一样。但是,您可以具体配置每个案例以非
阻塞方式释放内存,使用以下配置指令调用:
lazyfree-lazy-eviction no //内存满逐出选项
lazyfree-lazy-expire no //过期key删除选项
lazyfree-lazy-server-del no //内部删除选项,比如rename srckey destkey时,如果destkey存在需要先删除destkey
replica-lazy-flush no //slave接收完RDB文件后清空数据选项
以上4个选项默认为同步删除,可以通过config set [parameter] yes打开后台删除功能。
################# APPEND ONLY MODE 仅附加模式 #####################
默认情况下,Redis异步将数据集转储到磁盘上。此模式是在许多应用程序中都足够好,但是Redis进程或停电可
能会导致几分钟的写入丢失(取决于配置的保存点)。仅附加文件是一种替代的持久性模式,可提供更好的耐久
性。例如使用默认数据fsync策略(请参阅配置文件中的后面部分),Redis可能仅丢失一秒钟的写操作。戏剧性事
件,例如服务器断电,或者一次写入(如果有的话)Redis进程本身发生了错误,但是操作系统是仍能正常运行。
可以同时启用AOF和RDB持久性,而不会出现问题。如果启动时启用了AOF,则Redis将加载AOF,即文件具有更好的持久化保证。
appendonly no //是否打开aof
aof文件名,同样是保存在工作目录下,默认appendonly.aof
appendfilenme "appendonly.aof"
aof追加方式:
- no:不主动调用fsync(同步函数),让操作系统调用
- always:同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
- everysec:出厂默认推荐,异步操作,每秒记录 如果一秒内宕机,有数据丢失
appendfsync everysec
当aof fsync策略设置为always或everysec,并且后台保存进程(后台保存或aof日志后台重写)正在对磁盘执行
大量I/O时,在某些Linux配置中,redis可能会在fsync()调用上阻塞太长时间。请注意,目前还没有对此进行修
复,因为即使在不同的线程中执行fsync,也会阻止同步write(2)调用。
为了缓解这个问题,可以使用以下选项,防止在BGSAVE或BGREWRITEAOF正在进行时在主进程中调fsync()。这
意味着,当另一个子节点正在保存时,redis的持久性与“appendfsync no”相同。实际上,这意味着在最坏的情况
下(使用默认的linux设置),可能会丢失长达30秒的日志。
如果您有延迟问题,请将其设置为“是”。否则,从耐久性的角度来看,这是最安全的选择。
//重写时是否可以运用Appendfsync,用默认no即可,保证数据安全性。
no-appendfsync-on-rewrite no
自动重写aof文件。
redis能够在aof日志大小增长指定百分比时隐式地调用bgrewriteaof来自动重写日志文件。
这就是它的工作原理:redis会记住最近一次重写之后aof文件的大小(如果自重新启动之后没有发生重写,则使用
启动时aof的大小)。将此基础大小与当前大小进行比较。如果当前大小大于指定的百分比,则会触发重写。此
外,还需要为要重写的aof文件指定最小大小,这对于避免重写aof文件很有用,即使达到了百分比增长,但仍然很
小。指定0的百分比以禁用自动AOF重写功能。
//指定当AOF日志大小增长到指定的百分比时重写且aof文件大于要重写的最小大小触发重写
//100指比上次重写后增大了一倍
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
在redis启动过程中,当aof数据被加载回内存时,可能会发现aof文件在最后被截断。
当redis运行的系统崩溃时,可能会发生这种情况,尤其是在没有data=ordered选项的情况下挂载ext4文件系统时
(但是当redis本身崩溃或中止但操作系统仍然正常工作时,这种情况不会发生)。当发生这种情况时,Redis要么
退出并显示一个错误,要么加载尽可能多的数据(默认为现在),如果发现AOF文件在结尾被截断,则启动。以下选项控制此行为。
如果aof-load-truncated设置为yes,则加载截断的aof文件,redis服务器开始发出日志来通知用户事件。否则,
如果将该选项设置为“否”,服务器将因错误而中止并拒绝启动。当选项设置为no时,用户需要在重新启动服务器之
前使用“redis check aof”实用程序修复aof文件。请注意,如果发现AOF文件在中间被损坏,服务器仍将退出一个
错误。此选项仅适用于redis试图从aof文件读取更多数据但找不到足够字节的情况。
//如果设置为yes,则加载截断的AOF文件,Redis服务器开始发出日志以通知用户该事件。
//如果该选项设置为no,则服务器将停止并显示错误,并拒绝启动,在重启之前,用户需要使用redis-check-aof修复aof文件
aof-load-truncated yes
4.x开始的rdb和aof混合持久化选项
aof-use-rdb-preamble yes
###################### LUA SCRIPTING LUA脚本 #########################
Lua脚本的最大执行时间(以毫秒为单位)。
如果达到最大执行时间,ReDIS将记录脚本在最大允许时间之后仍在执行,并将开始对带有错误的查询进行答复。
当长时间运行的脚本超过最大执行时间时,只有SCRIPT KILL和SHUTDOWN NOSAVE命令可用。第一个脚本可用
于停止尚未调用write命令的脚本。第二次是在脚本已发出write命令但用户不希望等待脚本自然终止的情况下关闭
服务器的唯一方法。将其设置为0或负值以无警告地无限执行。
lua-time-limit 5000
##################### REDIS CLUSTER Redis集群 #######################
普通的redis实例不能是redis集群的一部分;只有作为集群节点启动的节点才可以。
为了将redis实例作为群集节点启动,请启用群集支持,
cluster-enabled yes //启用集群
每个群集节点都有一个群集配置文件。此文件不打算手动编辑。
它由redis节点创建和更新。每个redis集群节点都需要不同的集群配置文件。确保在同一系统中运行的实例没有重
叠的群集配置文件名。
//集群节点的配置文件,由节点创建更新,该文件列出了集群中其他节点,状态,持久变量等内容。
cluster-config-file nodes-6379.conf
群集节点超时必须是节点无法访问的毫秒数,将其视为处于故障状态,其他大多数内部时间限制是节点超时的倍数。此参数控制Redis群集中的其他重要事项。
例如:如果父节点断开超过超时时间(单位毫秒),从节点会进行故障转移,
//在指定时间内,每个节点无法访问大多数父节点,将停止接收查询
cluster-node-timeout 15000
如果数据看起来太旧,发生故障的父节点的子节点将避免启动故障转移。
对于副本来说,没有一种简单的方法可以精确测量其“data age(数据期限)”,因此执行以下两项检查:
- 如果有多个子节点能够进行故障转移,则它们会交换消息,以尽量利用具有最佳复制偏移量的子节点(处理了更多来自父节点的数据)。子节点将尝试按偏移量获取其列组,并在故障转移开始时应用与其列组成比例的延迟。
- 每个子节点计算最后一次与其父节点交互的时间。这可以是最后收到的ping或命令(如果父节点仍处于“已连接”状态),也可以是自与父节点断开连接以来经过的时间(如果复制链接当前已关闭)。如果上一次交互太旧,则子节点根本不会尝试故障转移。
第2点可以由用户控制,具体来说,如果自上次与父节点交互以来,经过的时间大于:
(节点超时*副本有效性因子)+ repl-ping-replica-period
例如,如果node-timeout为30秒,并且副本有效性因子为10,并假设默认的repl-ping-replica-period为10秒,如
果子节点无法与父节点进行通讯超过310秒,则子节点不会尝试进行故障转移。
较大的副本有效性因子可能允许数据过旧的子节点对父节点进行故障转移,而太小的值可能会阻止群集选择副本。
为了获得最大可用性,可以设置副本有效性因子的值为0,这意味着,无论子节点最后一次与父节点交互是什么时
候,它们都将始终尝试故障转移主副本。(但是他们总是试图应用一个与其偏移等级成比例的延迟)
零是唯一能够保证当所有分区恢复时群集始终能够继续的值。
//如果设置为零,则从站将始终尝试对主站进行故障切换,无论主站与从站之间的链路保持断开连接的时间长短。
//如果该值为正,则计算 (cluster-node-timeout * 此选项提供的因子) + repl-ping-replica-period, 如果父节点断开超过这个时间,则从节点不会进行故障转移,
//例如,如果节点超时设置为5秒,并且有效性因子设置为10,并假设默认的repl-ping-replica-period为10秒, 则从主设备断开超过60秒的从设备将不会尝试故障转移其主设备。
//请注意,如果没有从站能够对其进行故障转移,则任何不同于零的值都可能导致Redis群集在主站发生故障后不可 用。在这种情况下,只有当原始主服务器重新加入群集时,群集才会返回。
cluster-replica-validity-factor 10
集群子节点能够迁移到孤立的父节点,也就是裸奔的父节点。这提高了群集抗灾的能力,否则,孤立父节点如果没
有子节点,则在发生故障时无法进行故障转移。
只有当旧父节点仍有至少给定数量的其他工作子节点时,子节点才会迁移到孤立父节点。这个数字就是“migration
barrier”。为1意味着只有当父节点至少有一个其他工作子节点时,子节点才会迁移,以此类推。它通常反映集群
中每个父节点所需的副本数量。
默认值为1(子节点仅在其父节点至少保留一个子节点时迁移)。要禁用迁移,只需将其设置为非常大的值即可。
可以设置值0,但该值仅用于调试和生产中的危险。
# cluster-migration-barrier 1
默认情况下,如果redis集群节点检测到至少有一个未覆盖的哈希槽(没有可用的节点为其提供服务),那么它们
将停止接受查询。这样,如果集群部分关闭(例如不再覆盖一系列散列槽),那么所有集群最终都将不可用。一旦
所有插槽都被覆盖,它就会自动返回可用。但是,有时您希望正在工作的集群的子集继续接受对仍然覆盖的部分密
钥空间的查询。为此,只需将cluster require full coverage选项设置为no。
# cluster-require-full-coverage yes
当设置为“是”时,此选项可防止副节点在主服务器故障期间尝试故障转移。但是,如果强制执行手动故障转移,主
服务器仍然可以执行手动故障转移。这在不同的情况下非常有用,特别是在多个数据中心操作的情况下,我们希望
一方永远不会被提升,如果不是在完全直流故障的情况下。
# cluster-replica-no-failover no
#################### CLUSTER DOCKER/NAT support ####################
未接触docker,所以暂时不做了解
# cluster-announce-ip 10.1.1.5
# cluster-announce-port 6379
# cluster-announce-bus-port 6380
########################## SLOW LOG 慢日志 ##########################
慢速日志是系统用来记录超过指定执行时间的查询,执行时间不包括I / O操作,与客户端交互,发送回复等。而只
是实际执行命令所需的时间(这是命令执行阶段,线程被阻塞,不能同时服务于其他请求)。
您可以使用两个参数配置慢日志:一个参数告诉redis要超过多少执行时间(微秒),以便记录命令;另一个参数
是慢日志的长度。记录新命令时,将从已记录命令的队列中删除最旧的命令。
执行超时时间,单位是微秒,因此1000000等于1秒。负数将禁用慢日志,零值则强制记录每个命令。
slowlog-log-slower-than 10000
这个长度没有限制。只是要注意它会消耗内存。您可以使用SLOWLOG RESET回收慢日志使用的内存。
slowlog-max-len 128
##################### LATENCY MONITOR 延迟监视 #######################
redis延迟监视子系统在运行时对不同的操作进行采样,以便收集与redis实例的可能延迟源相关的数据。通过
LATENCY命令,用户可以使用此信息打印图表和获取报告。
系统只记录在等于或大于通过latency-monitor-threshold配置指令指定的毫秒数的时间内执行的操作。当其值设
置为零时,延迟监视器将关闭。默认情况下,延迟监视是禁用的,因为如果没有延迟问题,则通常不需要它,而且
收集数据会对性能产生影响,虽然影响很小,但可以在大负载下测量。如果需要,可以在运行时使用命令“config
set latency-monitor-threshold ”轻松启用延迟监视。
latency-monitor-threshold 0
#################### EVENT NOTIFICATION 事件通知 ######################
Redis可以将key空间中发生的事件通知给发布/订阅客户端。
例如,如果启用了keyspace事件通知,并且客户端对存储在数据库0中的键“foo”执行del操作,则将通过pub/sub
发布两条消息:
PUBLISH __keyspace@0__:foo del
PUBLISH __keyevent@0__:del foo
可以在一组类中选择redis将通知的事件。每个类都由一个字符标识:
# K Keyspace events, published with __keyspace@<db>__ prefix.
键空间事件,以 __keyspace@<db>__ 前缀发布。
# E Keyevent events, published with __keyevent@<db>__ prefix.
Keyevent事件,以 __keyevent@<db>__ 前缀发布。
# g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...
通用命令(非类型专用),例如DEL,EXPIRE,RENAME,...
# $ String commands
字符串命令
# l List commands
List命令
# s Set commands
set命令
# h Hash commands
hash命令
# z Sorted set commands
排序集(zset)命令
# x Expired events (events generated every time a key expires)
过期事件(每次密钥过期时生成的事件)
# e Evicted events (events generated when a key is evicted for maxmemory)
驱逐事件(驱逐密钥以获取最大内存时生成的事件)
# A Alias for g$lshzxe, so that the "AKE" string means all the events.
别名为g$lshzxe,因此“AKE”字符串表示所有事件。
“notify-keyspace-events”将零个或多个字符组成的字符串作为参数。空字符串表示通知被禁用。
示例:获取订阅频道的过期密钥流名称 __ keyevent@0__:expired 使用:
notify-keyspace-events Ex
默认情况下,所有通知都被禁用,因为大多数用户不需要此功能,而且此功能有一些开销。
请注意,如果未指定 K 或 E 中的至少一个,则不会传递任何事件。
notify-keyspace-events ""
################### ADVANCED CONFIG 高级配置 #####################
当哈希有少量的条目,并且最大的条目不超过给定的阈值时,使用内存高效的数据结构对其进行编码。可以使用以
下指令配置这些阈值。
//hash的元素个数不超过512个,且最大元素大小不超过64字节,使用ziplist结构存储数据
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
列表也以一种特殊的方式进行编码,以节省大量空间。每个内部列表节点允许的条目数可以指定为一个固定的最大
或最大数量的元素。
对于固定的最大大小,使用-5至-1,意思是:
-
-5:最大大小:64 KB<–不建议用于正常工作负载
-
-4:最大大小:32 KB<–不推荐
-
-3:最大大小:16 KB<–可能不推荐
-
-2:最大大小:8 KB<–良好
-
-1:最大大小:4 KB<–良好
正数意味着存储到每个列表节点的元素数。
最高性能的选项通常是-2(8kb大小)或-1(4kb大小),但是如果您的用例是唯一的,则根据需要调整设置。
list-max-ziplist-size -2
列表也可以压缩。具体看配置文件说明,0:禁用所有列表压缩
list-compress-depth 0
集合只有一种特殊的编码方式:当集合只由64位有符号整数范围内碰巧是基数10的整数的字符串组成时。以下配
置设置set集大小的限制,以便使用此特殊的内存保存编码。
//set的元素个数不超过512个,使用intset结构存储数据
set-max-intset-entries 512
zset里的元素个数不超过128个,每个元素大小不超过64字节,就使用ziplist结构存储数据,同hash
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
从Redis 2.2开始,对许多数据类型进行了优化,以使用较少的空间来达到特定大小。当哈希,列表,仅由整数组
成的集合和有序集合小于元素的给定数目且最大元素大小时,它们以一种非常节省内存的方式进行编码,使用的
内
存减少多达10倍
。如果特殊编码的值超出了配置的最大大小,Redis将自动将其转换为普通编码。对于较小的值,
此操作非常快,但是如果更改设置以便对更大的聚合类型使用经过特殊编码的值,建议您运行一些基准测试以检查
转换时间。
流节点最大大小/最大数量。
流数据结构是对内部多个项进行编码的大节点的基树。使用此配置可以配置单个节点的大小(字节)。以及在追加
新流项时切换到新节点之前可能包含的最大项目数。如果以下任何设置设置为零,则忽略该限制,例如,通过将
max bytes设置为0,将max-entries设置为所需值,可以只设置max-entries限制。
//redis5.0引入的新数据类型,
stream-node-max-bytes 4096
stream-node-max-entries 100
默认值yes,用来控制是否自动重建hash。active rehashing每100毫秒使用1毫秒cpu时间排序,以重组Redis的
hash表。redis使用的哈希表实现(参见dict.c)执行一个延迟的重建hash:在哈希表中运行的操作越多,也就是
重建hash,将执行的重建hash“步骤”越多,因此如果服务器空闲,重建hash就永远不会完成,哈希表将使用更多
的内存。
默认情况下,每秒使用此毫秒10次,也就是1秒10次,以便主动重新刷新主词典,尽可能释放内存。
如果不确定:使用“activerehashing no”如果您有硬延迟要求,并且在您的环境中,redis可以以2毫秒的延迟不时
地回复查询不是一件好事。如果您没有这么高的要求,但希望在可能的情况下尽快释放内存,请使
用“activerehashing yes”。
activerehashing yes
客户机输出缓冲区限制可用于强制断开由于某些原因没有足够快地从服务器读取数据的客户机的连接(一个常见的
原因是pub/sub客户端不能像发布者生成消息那样快速地使用消息)。
对于三种不同类型的客户机,可以设置不同的限制:
normal -> normal clients including MONITOR clients
replica -> replica clients
pubsub -> clients subscribed to at least one pubsub channel or pattern
普通->普通客户端,包括监视器客户端
副本->副本客户端
pubsub->客户端订阅了至少一个pubsub频道或模式
每个客户机输出缓冲区限制指令的语法如下:
client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>
client-output-buffer-limit <类型> <硬限制> <软限制> <软限制连续秒数>
一旦达到硬限制,或达到软限制并保持达到指定秒数(连续)时,客户端将立即断开连接。
例如,如果硬限制是32兆字节,软限制是16兆字节/10秒,那么如果输出缓冲区的大小达到32兆字节,客户机将立
即断开连接,或是如果客户机达到16兆字节并持续克服限制10秒。
默认情况下,普通客户机不受限制,因为它们不会在没有请求(以推送方式)的情况下接收数据,而是在请求之后
才接收数据,因此只有异步客户机可能会创建这样一个场景:请求数据的速度比读取数据的速度快。
相反,pubsub和replica客户机有一个默认限制,因为订阅服务器和副本以推送方式接收数据。
硬限制或软限制都可以通过将其设置为0来禁用。
//普通客户端0,禁用
client-output-buffer-limit normal 0 0 0
//从机,硬限制256mb,软限制连续1分钟达到64mb,客户端断开
client-output-buffer-limit replica 256mb 64mb 60
//客户端订阅,硬限制32mb,软限制连续1分钟达到32mb,客户端断开
client-output-buffer-limit pubsub 32mb 8mb 60
客户端查询缓冲区累积新命令。它们在默认情况下被限制在一个固定的数量,以避免协议取消同步(例如由于客户端的错误)将导致查询缓冲区中的未绑定内存使用。
# client-query-buffer-limit 1gb
在redis协议中,批量请求(即表示单个字符串的元素)通常被限制为512mb。不过,您可以在这里更改此限制。
//批量请求大小限制
# proto-max-bulk-len 512mb
redis调用一个内部函数来执行许多后台任务,比如在超时时关闭客户端的连接,清除从未请求过的过期密钥,等
等。并非所有任务都以相同的频率执行,但redis会根据指定的“hz”值检查要执行的任务。
默认情况下,“hz”设置为10。当redis空闲时,提高这个值将使用更多的cpu,但同时,当有多个密钥同时过期时,
redis的响应速度会更高,超时的处理可能会更精确。
范围在1到500之间,但是值超过100通常不是一个好主意。大多数用户应该使用默认值10,并且仅在需要非常低
延迟的环境中才将此值提高到100。
//CPU空闲时在定期serverCron任务中,逐出部分过期Key;hz定义了serverCron任务的执行周期,默认为10,即 CPU空闲时每秒执行10次;
hz 10
通常,有一个与连接的客户机数量成比例的hz值是有用的。例如,为了避免每次后台任务调用都要处理太多客户
端,从而避免延迟峰值,这是很有用的。由于默认的默认hz值被保守地设置为10,redis提供并默认启用一个自适
应hz值,当有许多连接的客户机时,该值将临时升高。
当启用dynamic-hz时,实际配置的HZ将用作基准,但实际配置的HZ值的倍数将是在连接更多客户端后根据需要使
用的。这样,一个空闲的实例将使用很少的CPU时间,而繁忙的实例将更具响应性。
dynamic-hz yes
当一个子对象重写aof文件时,如果启用了以下选项,则每生成32 MB的数据就会对该文件进行fsync。这对于更增
量地将文件提交到磁盘并避免较大的延迟峰值非常有用。
aof-rewrite-incremental-fsync yes
当redis保存rdb文件时,如果启用了以下选项,每生成32 MB的数据,将对该文件进行fsync。这对于更增量地将
文件提交到磁盘并避免较大的延迟峰值非常有用。
rdb-save-incremental-fsync yes
可以调整redis lfu逐出(请参阅maxmemory设置)。在开始的时候使用默认值是个好主意,可以通过OBJECT FREQ 命令进行检查。
Least Frequently Used——简称LFU,意为最不经常使用,是redis4.0新增的一类内存逐出策略。
在redis中每个对象都有24 bits空间来记录LRU/LFU信息:
typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
* LFU data (least significant 8 bits frequency
* and most significant 16 bits access time). */
int refcount;
void *ptr;
} robj;
当这24 bits用作LFU时,其被分为两部分:
- 高16位用来记录访问时间(单位为分钟)
- 低8位用来记录访问频率,简称counter
16 bits 8 bits
+------------------+--------+
+ Last access time | LOG_C |
+------------------+--------+
8 bits最大值也就是255。counter而是用基于概率的对数计数器来实现,算法如下:
uint8_t LFULogIncr(uint8_t counter) {
if (counter == 255) return 255;
double r = (double)rand()/RAND_MAX;
double baseval = counter - LFU_INIT_VAL;
if (baseval < 0) baseval = 0;
double p = 1.0/(baseval*server.lfu_log_factor+1);
if (r < p) counter++;
return counter;
}
对应的概率分布计算公式为:
1/((counter-LFU_INIT_VAL)*server.lfu_log_factor+1)
其中新生可以的初始counter值为:LFU_INIT_VAL=5,我们看下概率分布图会有一个更直观的认识,以默认
server.lfu_log_factor=10为例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PUF7qe5u-1600848536988)(F:\A接口文档及模板数据\笔记\images\lfu.png)]
从上图可以看到,
counter越大,其增加的概率越小,即counter越大,分母越大,所得出的p值越小,对应的大于
==r的概率越小;==8 bits也就足够记录很高的访问频率,下表是不同概率因子server.lfu_log_factor与访问频率counter
的对应关系:
# +--------+------------+------------+------------+------------+------------+
# | factor | 100 hits | 1000 hits | 100K hits | 1M hits | 10M hits |
# +--------+------------+------------+------------+------------+------------+
# | 0 | 104 | 255 | 255 | 255 | 255 |
# +--------+------------+------------+------------+------------+------------+
# | 1 | 18 | 49 | 255 | 255 | 255 |
# +--------+------------+------------+------------+------------+------------+
# | 10 | 10 | 18 | 142 | 255 | 255 |
# +--------+------------+------------+------------+------------+------------+
# | 100 | 8 | 11 | 49 | 143 | 255 |
# +--------+------------+------------+------------+------------+------------+
也就是说,默认server.lfu_log_factor为10的情况下,8 bits的counter可以表示1百万的访问频率。
# 该配置项解释来源:https://yq.aliyun.com/articles/278922
# lfu-log-factor 10
具体是当前时间转化成分钟数后取低16 bits,然后计算与
ldt
的差值
now-ldt
。当
ldt > now
时,默认为过了一
个周期(16 bits,最大65535),取值
65535-ldt+now
。
然后用差值与配置
lfu_decay_time
相除,
LFUTimeElapsed(ldt) / server.lfu_decay_time
,已过去n个
lfu_decay_time
,则将
counter
减少n,
counter - num_periods
。
# lfu-decay-time 1 //单位分钟
############# ACTIVE DEFRAGMENTATION 活动碎片处理###############
此功能是实验性的,以后有空再看
###########################没懂的配置############################
hll-sparse-max-bytes