当前位置: 首页 > 科技观察

好好吃饭不怕迟到,我们来看看Redis配置文件的最底层,Ku

时间:2023-03-14 17:44:37 科技观察

忙碌是一种幸福,让我们无暇体验痛苦;没有时间空虚。这几句话可以简单概括一下我最近的工作和生活。很多小伙伴都来私信“提醒更新”了,今天就到啦!为了表达阿Q的歉意,送你一本《亿万流量的Java高并发与网络编程》。规则见文末。在之前的文章中,我们已经讲解了Redis的概念和基本命令。今天我们就来看看它的配置文件。Redis配置文件在我们的开发和实际应用中起着非常重要的作用。我们可以在安装目录下找到redis.conf配置文件,通过vim命令查看。为了防止配置文件被更改,使用前一定要备份!本文Redis版本为5.0.7UNITS1k=>1000bytes1kb=>1024bytes1m=>1000000bytes1mb=>1024*1024bytes1g=>1000000000bytes1gb=>1024*1024*1024bytes单位不区分大小写,只有bytesINCLUDES类似于structs2配置文件,并且可以通过includes包含。redis.conf可以作为主门,包括其他的。include/path/to/local.confinclude/path/to/other.confMODULESloadmodule/path/to/my_module.soloadmodule/path/to/other_module.soRedis可以通过loadmodule选项在启动时加载模块。如果服务器无法加载模块,服务器将停止。可以通过多个加载模块选项加载多个模块。NETWORK“bind127.0.0.1”:默认情况下,如果没有指定“bind”配置指令,Redis将监听服务器上所有可用网络接口上的连接。可以使用“bind”配置指令后接一个或多个IP地址来仅侦听一个或多个选定的接口。"例如:"bind192.168.1.10010.0.0.1当设置了多个bind地址时,Redis会在内部维护多个Socket,每个Socket用于一个网络接口。“protected-modeyes”:该选项默认启用。当Redis服务器没有使用bind选项显式指定要监听的网络接口,也没有设置密码时,Redis服务器将只接受来自127.0.0.1和::1以及Unix域Sockets的客户端的连接。"port6379":用于设置Redis监听的TCP端口,默认为6379,设置为0表示不监听该TCP端口"timeout0":空闲时间达到一定秒数后关闭连接,"0"表示不关闭"tcp-keepalive300":单位是秒。如果为0,则不进行keepalive检测。建议设置为60。"tcp-backlog511":设置tcp的backlog。backlog实际上是一个连接队列。backlog队列之和=未完成的三路握手队列+完成的三路握手队列在高并发环境下,需要有高的backlog值,以避免客户端连接慢的问题。【注意】:Linux内核会将这个值减小到/proc/sys/net/core/somaxconn的值,所以需要确认增加somaxconn和tcp_max_syn_backlog这两个值才能达到想要的效果。GENERALdaemonizeRedis采用单进程多线程模式,daemonize用于指定redis是否作为守护线程启动。默认情况下,Redis不作为守护进程运行。如果需要,请使用“是”。#daemonizeno//当前界面会进入redis的命令行界面,exit强制退出或关闭连接工具(putty、xshell等)都会导致redis进程退出。daemonizeyes//代表开启daemon进程模式。在这种模式下,redis会在后台运行,并将进程pid号写入redis.conf选项pidfile设置的文件中。这时候redis会一直运行,除非手动杀掉进程。supervisedno当你通过upstart或systemd运行Redis时,Redis可以与你的监督树交互。可用选项有:no无交互(默认)upstart通过向Redis发送SIGSTOP信号通知upstartsystemd通过写入$NOTIFY_SOCKET输入READY=1通知systemdauto选项是upstart或systemdpidfilepidfile/var/run/redis_6379.pid//processpidfileloglevelnotice指定服务器日志级别:从上到下递减debug:很多信息,对开发/测试很有用productionwarning:Onlylogveryimportant/criticalmessageslogfilelogfile""日志的名称,如果为空,redis会向控制台发送标准输出,如果配置为作为守护进程运行,logfile是设置为stdout,日志会发送到/dev/nulldatabasedatabases16系统默认16库,默认使用0库syslogsyslog-enabledno:是否将日志输出到syslog,系统日志默认关闭syslog-identredis:指定syslog中的日志标志facility以redis开头syslog-facilitylocal0:指定syslogfacility,值可以是USER或LOCAL0-LOCAL7,默认使用local0Security(安全)requirepass12345!@#设置redis连接密码,如果配置了连接密码,客户端连接redis时需要通过Auth命令提供密码,默认关闭。如果设置了密码,会ping不通,提示“NoAuthAuthenticationrequired”,添加auth+password即可通过。“在执行任何命令之前需要身份验证+密码。”Redis一般是做缓存的,不做安全的,系统会认为Linux是在安全的环境中。CLIENTSmaxclients10000:最大连接数设置redis同时可以连接多少个客户端。默认为10000个客户端。当不能设置进程文件句柄限制时,redis会设置为当前文件句柄限制值-32,因为redis会为自己内部的处理逻辑预留一些句柄。如果达到此限制,redis将拒绝新的连接请求,并向这些连接请求者发送“已达到最大客户端数”作为响应。MEMORYMANAGEMENT设置redis可以使用的内存量。一旦达到内存使用上限,redis会尝试移除内部数据,移除规则可以通过maxmemory-policy指定。如果redis不能按照移除规则移除内存中的数据,或者“不允许移除”,那么对于那些需要申请内存的指令,如SET,LPUSH等,redis会返回错误信息。但是对于命令不申请内存,还是会正常响应,比如GET等。如果你的redis是主redis(说明你的redis有slaveredis),那么在设置内存使用上限的时候,需要在系统中预留一些内存空间给同步队列缓存,只有设置了“不”remove”的情况下,这个因素不需要考虑。最大缓存#maxmemorymaxmemory128MB设置maxmemory和对应的回收策略算法。最好设置为物理内存的“3/4”,或者更小的比例,因为redis在复制数据等服务的时候也需要缓存。以防缓存数据过大导致redis崩溃,导致系统错误不可用。牺牲一部分缓存数据来保持整个系统的可用性。redis新的内存机制会将key存放在内存中,value存放在swap区。该配置需要与“maxmemory-policy”结合使用。当redis中的内存数据达到maxmemory时,就会触发“清除策略”。当“内存不足”时,任何写操作(如set、lpush等)都会触发“清空策略”的执行。在实际环境中,建议redis所有物理机的硬件配置保持一致(内存一致性),同时保证master/replica中的“maxmemorypolicy”配置一致。如果在内存满的情况下收到set命令,redis会先尝试移除已经设置过期信息的key,不管key的过期时间是否到了。删除时,按照过期时间删除,最早过期的key先删除。如果有过期信息的key全部删除,内存不够,会返回错误。这样redis就不会再接收写请求,只接收get请求。maxmemory的设置更适合使用redis作为类似于memcached的缓存。最大缓存策略“maxmemory-policy”:volatile-lru:使用LRU(最近最少使用)算法移除key,只针对设置过期时间的keyallkeys-lru:使用LRU算法移除key(所有key)volatile-lfu:UsetheLFU(leastfrequentlyused)approximationalgorithmforexpiredkeysallkeys-lfu:对所有keys使用LFU近似算法volatile-random:从过期集合中移除随机keys,只针对设置了过期时间的keysallkeys-random:移除randomkeysvolatile-ttl:移除TTL值最小的key,也就是那些最近要过期的keynoeviction:不移除。对于写操作,只返回错误信息(默认)(去公司观察维度,不要选这个)LRU算法、LFU算法或TTL算法都不是很精确的算法,而是近似算法。》使用策略规则:》如果数据呈现幂律分布,即有的数据访问频率高,有的数据访问频率低,则使用allkeys-lru。如果数据是均等分布的,即所有的数据访问频率都一样,就用allkeys-random。SampleSize设置样本量,上面提到的算法不是精确算法,而是估计值,所以可以设置样本量。maxmemory-samples5的默认值是5,也就是说Redis随机挑出5个key,然后选择最符合条件的key。5更适合LRU。10已经非常接近真正的LRU,但是会消耗更多的CPU。3会更快但不那么精确。副本忽略最大内存replica-ignore-maxmemoryyes从Redis5开始,默认情况下,副本节点将忽略maxmemory设置(除非发生故障转移后该节点被提升为主节点)。这意味着只有master会执行过期删除策略,master删除key后会向replica发送DEL命令。这种行为保证了master和replicas之间的一致性,这通常是你想要的,但是如果你的replica节点是可写的,或者你希望replica节点有不同的内存配置,并且你保证所有对replica的写操作是幂等的,然后你可以修改这个默认行为(确保你明白你在做什么)。【注意】默认情况下,副本节点不会执行过期策略,它可能会使用比maxmemory设置的值更多的内存。因此,需要监控replicas节点所在机器,确保master节点达到配置的maxmemory大小时,replicas节点不超过物理内存大小。今天先说这个。至于配置文件中的主从复制和持久化,我们后面再解释。本文转载自微信公众号“阿Q说码”,可通过以下二维码关注。转载本文请联系阿Q获取代码公众号。