Redis 4.0.11配置说明
本文主要目的是对Redis 4.0.11配置项进行理解、说明和记录。
1、外置配置文件导入(INCLUDES)
include /path/to/common.conf
配置作用:
该配置用于导入外部配置文件,如当你有一个通用的redis配置文件时,可使用该配置项导入,可导入多个外置配置文件。
注意事项:
- redis总是使用最后一个配置项作为其配置,所以如果你想将include中的配置覆盖原配置文件中配置,则需要将include放在配置文件最后;若想配置文件的配置覆盖include中的配置,则include放在配置文件头部。(如配置文件中有appendonly配置,include文件中也有appendonly配置,若需要include选项覆盖配置文件中选项,则将include配置放在文件末尾)
- config rewrite命令可重写配置文件中的配置(详见https://redis.io/commands/config-rewrite),但不会重写include中的配置。
2、启动加载模块(MODULES)
loadmodule /path/to/my_module.so
配置作用:
该选项用于redis-server启动时指定加载自定义模块。Redis自定义扩展模块功能是4.0以后新加入的一个重要功能,该功能允许使用者在redis本身数据结构的基础上做相关调整或自定义功能增加。
官方提供的相关扩展开发模板详见:https://github.com/RedisLabsModules/redex
相关博客可参考: http://xiaorui.cc/2016/12/08/redis-modules扩展模块的开发使用/
3、网络配置(NETWORK)
bind 127.0.0.1
配置作用:
指定redis-server绑定的主机地址。若此选项不设置,则会接受所有网络接口(网卡)的请求。
Redis配置中默认绑定127.0.0.1,即只接受本地回环地址的连接请求,无法通过远程连接。此选项可以绑定多个ip,多个ip用空格隔开。
如设置bind参数为 bind 168.0.100.1,其中绑定ip为本地局域网地址,这种方式使用redis-cli命令不允许连接,可指定地址连接:
redis-cli -h 168.0.100.1
protected-mode yes
配置作用:
redis保护模式是3.2版本之后加入的新特性,它是为了禁止公网访问redis,用于加强redis的安全。如不设置,默认启用,若启用该功能,只能通过回环地址(127.0.0.1)访问redis服务。启用该选项的两个前提是:
- 没有bind ip
- 没有设置访问密码
port 6379
配置作用:
设置redis服务监听的端口,默认为6379,若设置为0,则不监听任何TCP套接字。
tcp-backlog 511
配置作用:
Backlog是积压的意思,该配置用于指定最大TCP监听队列(全连接队列大小限制)。该配置主要作用场景是高QPS的场景,在每秒高请求的情况下,我们需要提高tcp-backlog来避免缓慢客户端连接的问题,该值默认为511。生产环境中建议将该值设置为32767,同时设置系统tcp-backlog大小。
注意问题:
1、Linux内核对于tcp-backlog也有限制,该值不可超过系统的/proc/sys/net/core/somaxconn的值(一般默认为128),若超过则以系统somaxconn为准,所以要增大该值需要将tcp-backlog与somaxconn值同时增大。
若要修改系统TCP监听队列最大值,可使用如下方法:
(1)直接修改/proc/sys/net/core/somaxconn,由于/proc下都是内存数据的映射,所以系统重启,该值将失效。
(2)在文件/etc/sysctl.conf中增加一行:net.core.somaxconn = 32767,然后执行stsctl -p生效。
2、注意全连接队列与半连接队列的区别,此处限制的为全连接队列大小。
参考链接:
https://www.cnblogs.com/Orgliny/p/5780796.html
https://www.cnblogs.com/jcli/p/3911505.html
unixsocket /tmp/redis.sock
配置作用:
用于指定redis-server监听的unix域套接字路径,上述若port配置置为0,这个时候redis-server不监听tcp套接字,可使用域套接字来提供服务,若只限制本机使用redis服务可用于提高性能。默认不启用。
unixsocketperm 700
配置作用:
配置unix域套接字使用权限
timeout 0
配置作用:
单位s,设置客户端空闲超时断开连接时间。即当客户端空闲时间超过timeout时,服务端会主动断开连接,若设置为0表示服务端不主动断开连接。
建议该值使用0,redis客户端使用长连接,进程退出时主动关闭连接;若不需要长连接也可以直接将该值设置为120
tcp-keepalive 300
配置作用:
单位为秒,若该值非0,redis-server则在与客户端缺乏通讯时每300s发送一次ACK心跳包检测客户端的健康状态,避免redis-server被阻塞。
设置tcp-alive的两个好处:1、检测挂掉的对端,及时适当tcp链接 2、降低设备出问题而导致的网络看似连接,却已经与对端断开的问题。
注意问题:
由于确认对端关闭需要double check客户端是否真的出问题,所以若客户端真的出问题,则关闭该连接需要两倍的keepalive时间,此处即600s。redis推荐该值为300(3.2.1版本之后)
4、通用配置(GENERAL)
daemonize no
配置作用:
该配置的作用是用来执行redis是否以守护进程的方式启动,若该值为yes, redis-server将后台运行,它会将pid写入pidfile指定的文件中。
若设置为no,启动将直接进入命令行界面。该配置默认配置为no。
supervised no
配置作用:
若通过upstart或者systemd启动redis,可设置此选项来监控redis运行,可选选项如下:
supervis no :不进行监控
supervised upstart :通过将Redis置于SIGSTOP模式来启动信号
supervised systemd :signal systemd将READY = 1写入$ NOTIFY_SOCKET
supervised auto :检测upstart或systemd方法基于 UPSTART_JOB或NOTIFY_SOCKET环境变量
pidfile /var/run/redis_6379.pid
配置作用:
用于指定以deamonize运行模式下pid的路径,它会将pid写入该文件中。
loglevel notice
配置作用:
指定redis-server运行时的日志级别
可选级别有:
debug : 记录大量日志信息,适用于开发、测试阶段
verbose :较多日志信息,但是没有debug级别信息多
notice : 适量日志信息,使用于生产环境
warning:仅有部分重要、关键信息才会被记录
logfile /path/redis.log
配置作用:
指定redis-server运行日志文件。若为空,将日志输出至标准输出,当启用daemonize,日志将被重定向到/dev/null
syslog-enabled no
配置作用:
用于设置是否将日志输出到系统日志。默认为no,建议设置为no
syslog-ident redis
配置作用:
用于设置系统日志的标识符,若syslog-enable为no,则该选项不起作用。
syslog-facility local0
配置作用:
指定syslog设备,必须是USER或LOCAL0-LOCAL7,若syslog-enable为no,则该选项不起作用。
databases 16
配置作用:
设置redis数据库的数目,客户端连接时时默认数据库为DB 0,但可以在每个连接上使用select选择要操作的DB。
always-show-logo
配置作用:
是否一直显示图标。Redis-4.0后加入快照配置(SNAPSHOTTING)
redis提供了主动和被动的两种方式来保存快照,当redis启动的时候可直接从rdb快照文件中恢复数据。
主动方式redis提供了两个命令save和bgsave来主动保存快照。两者的区别就是save为阻塞式,而bgsave命令会派生出一个子进程,然后由子进程创建rdb文件,因此bgsave不会阻塞redis服务器进程。
被动方式用户可通过配置快照相关配置,即save配置,当状态达到配置中指定的状态的时候,redis-server将自动触发bgsave生成数据快照。
bgsave的大致工作流程:
参考:https://juejin.im/post/5b70dfcf518825610f1f5c16
save <seconds> <changes>
例如:
save 900 1
save 300 10
save 60 10000
配置作用:
用于指定redis写磁盘的策略,可设置多个策略。当时间和变化数同时满足设置的值的时候,redis将写磁盘。如save 900 1表示900s内有1个以上变化的时候redis将写磁盘;save 300 10表示300s内有10个以上变化将写磁盘;save 60 10000表示当600s内有10000个以上的变化的时候redis将写磁盘,。
将save配置注释或者save “”的时候将不写磁盘。
当执行shutdown命令的时候,若有至少一个保存点在等待,将自动执行save命令存盘。对于一些信号处理,如直接killall redis-server,redis-server将捕捉该信号,调用shutdown命令,然后存盘,这个时候不会丢失数据;若执行kill -9 xxx,redis将捕捉不到,不会shutdown并存盘,此时将有可能导致数据丢失。(可做实验证明)
参考文档:https://redis.io/topics/signals
Redis快照的优点:
- RDB数据格式是一种经过压缩的二进制数据格式,可以方便的在网络中进行传输和保存。
- Redis保存快照的方式是fork出来一个子进程,该子进程进行保存快照,对服务器的性能不会造成太大的性影响
- 可以通过定期备份rdb保存数据状态,用于突发故障时的数据恢复。
- Rdb在恢复数据集比较大的数据时速度比aof快。
Redis快照的缺点:
- 当服务器发生崩溃的时候可能会丢失一段时间的数据,丢失数据的时间段根据存盘的配置决定。
- 从上面bgsave的工作流程可以看出来,redis服务器fork子进程的操作时阻塞的,当数据量过多或者fork过于频繁的时候将会影响服务器的读写性能。
stop-writes-on-bgsave-error yes
配置说明:
默认情况下,当RDB持久化出现错误时,redis将拒绝所有的写请求,这样可以保证redis数据的一致性,直到下一次RDB持久化成功,redis会自动恢复接受写请求。但是如果出现这种情况是需要redis可以继续对外提供服务,可使用该参数指定。
yes:RDB持久化出现错误不能继续对外提供服务,不关心数据不一致或者有其他策略控制这种不一致。
no:RDB持久化出现错误可以继续对外提供服务。
Rdbcompression yes
配置说明:
设置是否对存储到磁盘的快照进行压缩,yes:压缩,损耗CPU性能,节省磁盘存储空间;no:不压缩,快照占磁盘空间较大,节省CPU计算资源。依据实际情况选择,默认压缩。
rdbchecksum yes
配置说明:
从RDB版本5开始,RDB文件末尾会添加一个CRC64校验和,这样有利于提高RDB文件的容错性,但是当保存或加载RDB文件的时候会损耗10%左右的性能,如果追求高性能可以将该选项关闭,此时save时将在文件默认添加校验和0,表示不校验checksum。
dbfilename dump.rdb
配置说明:
设置快照文件名
dir ./
配置说明:
设置快照文件的文件夹(必须是文件夹),数据库将写入这个目录,rdb和aof都将写到这个文件夹下。
5、主从配置
slaveof <masterip> <masterport>
配置说明:
指定当前redis实例为另一个示例的slave。
masterauth <master-password>
配置说明:
若master设置了requirepass密码认证,则其对应的slave需要将该参数设置为master的密码才能链接master。该参数默认为空。
slave-serve-stale-data yes
配置说明:
当slave与master失去联系或者正在复制数据的过程中,当请求到达slave服务器,会有两种表现:
yes:slave仍然应答客户端请求,但是返回的数据可能是比较旧的数据。
no:执行info和slaveof之外的命令时,slave都将返回” SYNC with master in progress”的错误
slave-read-only yes
配置说明:
用于设置slave是否只读。若该参数设置no,则slave可写。但是注意从库写入的数据不会同步到master和其他slave,当主库修改了数据,从库的数据会因为自动同步被覆盖。
repl-diskless-sync no
配置说明:
RDB复制是否启用无磁盘(socket)复制方式。
当启动一个slave节点或者slave节点断线重连的时候,slave节点会发送一个psync命令给master。若slave是新启动的节点,将会触发全量复制,若为断线重连的节点,那么master将只会复制slave缺少部分的数据。
主从复制的简单过程:当触发一个全量复制任务的时候,master将会启动一个后台线程,开始生成一份RDB快照文件,同时还会将从客户端收到的所有写命令缓存在内存中。RDB文件生成完毕之后,master会将这个RDB文件发送给slave,slave会先写入本地磁盘,然后再从磁盘中将数据加载到内存中;然后master会将内存中缓存的写命令发送给slave,slave也会同步这些数据。
RDB文件从master向slave复制的方式有两种:
- 基于磁盘方式复制:此时master会fork出一个新的进程将RDB文件写入文件,然后父进程将该文件逐个发送给多个slave节点
- 基于socket方式复制:master直接将rdb数据通过socket发送给多个slave。
参考链接:
https://my.oschina.net/andylucc/blog/683631
https://blog.csdn.net/caokun12321/article/details/81225410
repl-diskless-sync-delay 5
配置说明:
当启用无磁盘(socket)复制方式的时候,一旦复制传送开始,新的slave请求需要等待这次传输完毕之后进行下一次RDB传输才能得到服务。所以为了能让后续的slave能够尽量赶上本次复制,redis提供了该参数设置复制开始的延迟,单位为s。
如该参数设置为5,则当有新的slave开始复制的时候,master将会等待5s,观察是否有新的slave需要复制,5s之后才进行数据复制。
注意:该配置只有当无磁盘复制启用的时候才会生效。
repl-ping-slave-period 10
配置说明:
配置slave周期性向master ping的时间间隔,即slaveàmaster的心跳间隔。
参考链接:
http://blog.chinaunix.net/uid-20682147-id-5816952.html
repl-timeout 10
配置说明:
主从复制连接超时时间。Master和slave都有超时时间的设置。Master检测到slave上次发送的时间超过repl-timeout,则认为slave离线,清除该slave信息。Slave检测到上次和master交互的时间超过repl-timeout,则任务master离线。
注意该时间一定要大于repl-ping-slave-period,否则可能会因为网络原因导致误判。
repl-disable-tcp-nodelay no
配置说明:
主从同步后是否禁用slave的TCP_NODELAY选项。该选项默认为no,当该选项设置为yes,redis将使用更少数量的TCP包和更少的宽带将数据同步到slave,但是它会带来更高的数据延迟,使用默认配置的linux内核最多可以达到40ms。默认情况下推荐将该参数设置为no,以得到更小的数据延迟,但是在数据传输量较大的场景下,建议选择为yes。
TCP_NODELAY:该选项是用来控制是否开启Nagle算法,该算法要求一个TCP连接上最多只能有一个未被确认的小分组,在该小分组确认来到之前,不能发送其他小分组。详细参考:https://www.jianshu.com/p/ccafdeda0b95
repl-backlog-size 1mb
配置说明:
复制积压缓冲区是一个固定长度的FIFO的环形队列,缓冲区大小由该参数指定,默认大小为1M,该缓冲区在master中只有一个,所有的slave共享此缓冲区,它的作用是用于备份最近主库发送给从库的数据。
在主从命令传播阶段,主节点除了将写命令发送给从节点外,还会发送一份到复制积压缓冲区,作为写命令的备份。除了存储最近的写命令,复制积压缓冲区中还存储了每个字节相应的复制偏移量,由于复制积压缓冲区固定大小先进先出的队列,所以它总是保存的是最近redis执行的命令。
参考链接:
https://juejin.im/post/5b67029c6fb9a04fa42fd592
repl-backlog-ttl 3600
配置说明:
当master没有slave连接的时候,一段时间会释放复制缓冲区的内存,该参数就是用来设置该时间,单位为s,0表示不释放。时间从最后一个slave断开的时间开始计算。
slave-priority 100
配置说明:
当master不可用的时候,Redis Sentinel会根据slave的优先级选举一个提升为master。slave-priority值越小,越优先当选为master。0表示永远不会被提升为master。默认优先级是100。
min-slaves-to-write 3
配置说明:
设置当master最少有N个健康的slave的时候,才允许被写入。0表示关闭该功能。此设置可以较大程度上保证数据不丢失。
min-slaves-max-lag 10
配置说明:
用于确定当前slave是否为健康。若slave与master的延时>设置的秒数,则认为该slave是不健康的,默认为10。延迟的秒数从master最后收到slave的ping开始计算。
6、安全配置
requirepass mypassword
配置说明:
指定redis认证链接密码,若不设置默认为不需要密码认证。对于部署在内网中的redis服务器,没必要设置密码,但是在不受信任的网络中,则需要设置密码防止外人恶意攻击。
设置密码后,使用客户端操作时,有多种方法指定密码访问redis-server,常见的有以下两种:
(1)redis-cli -p 6380 -a test_password(直接在shell指定密码)
(2)redis-cli -p 6380(连接后通过auth指定密码)
127.0.0.1:6380> auth test_password
rename-command CONFIG myconfig
配置说明:
对命令进行重命名。对于一些敏感或者危险的操作,我们可以对其进行重命名,禁止客户端使用,这样只能使用redis-cli内部工具进行连接使用新命令操作,达到安全的目的。
rename-command另外一个重要的作用是禁用指定命令,只需要将命令rename为空字符串即可。可设置多个。
7、客户端配置
maxclients 10000
配置说明:
设置redis服务器最大客户端连接数。默认为10000, 0表示不限制。由于redis预留了一些连接内部使用,所以建议该值最小设置为32。当客户端连接数超出该限制,redis-server将拒绝新的连接。
9、内存相关配置
maxmemory <bytes>
配置说明:
设置redis最大占用内存,设置为0表示不限制。当内存数据将要达到maxmemory设置的值的时候。Redis将根据配置的数据驱逐策略,对内存数据进行淘汰。若淘汰之后数据还是达到maxmemory的值,则redis-server将不对外提供写操作,只应答读请求。
maxmemory-policy <policy>
配置说明:
Redis内存数据淘汰机制,当redis使用内存将要达到maxmemory指定的限制时,redis将启用该策略淘汰数据。数据淘汰策略如下:
volatile-lru -> 从已设置过期时间的内存数据集中挑选最近最少使用的数据 淘汰;
volatile-lfu -> 从已设置过期时间的内存数据集中挑选最少使用的数据 淘汰;
volatile-ttl -> 从已设置过期时间的内存数据集中挑选即将过期的数据 淘汰;
volatile-random -> 从已设置过期时间的内存数据集中任意挑选数据 淘汰;
allkeys-lru -> 从内存数据集中挑选最近最少使用的数据 淘汰;
allkeys-lfu -> 从内存数据集中挑选最少使用的数据 淘汰;
allkeys-random -> 从数据集中任意挑选数据 淘汰;
noeviction -> 不淘汰任何数据,当内存满时直接报错。(默认)
maxmemory-samples 5
配置说明:
执行淘汰策略时选用样本数,由于LRU,LFU和TTL算法都是近似的算法,所以改变样本大小可以调整算法的精度。Redis默认样本为5个,即随机算则5个key进行检验并淘汰其中一个,因为5个key可以得到足够精确的结果,10个key接近真实的LRU,3个key速度快但是不精确,所以一般默认使用5个。
replica-ignore-maxmemory yes
配置说明:
从redis5开始,默认情况下副本将忽略其maxmemory设置(除非在故障转移或者手动将其提升为master)。这意味着在发生数据淘汰的时候是由主服务器处理,主服务器将del命令发送到从,然后进行删除,保证主从数据的一致。但是如果从服务器是可写的或者希望从服务器具有不同的内存设置,就可以改变该默认值。
10、惰性删除配置(非阻塞删除配置)
Redis-server删除数据时提供了两种删除数据的原语。分别是阻塞式删除和非阻塞删除。阻塞式删除当key比较小的时候,删除操作的效率会达到其他O(1)或O(log(n))的性能,但是当删除的key关联的数据过多的时候,删除将耗时较长,会导致阻塞,其他命令不能执行,这个时候就需要考虑非阻塞式删除。
数据删除包括两种,一种是主动删除,如用户删除某一个key,或者清空数据库的所有数据;另外一种是被动删除,如redis key过期、内存耗尽时的数据自动淘汰。
对于主动删除,redis提供了unlink命令来被动删除某一个key,即为del的异步命令;还提供了async选项,在flashall 或者flushdb的时候添加async选项可以达到意不删除的效果。
对于被动删除,我们可以通过配置来设置数据的异步删除。Redis提供的被动异步删除策略有以下几种,这几种配置默认关闭,若启用异步删除,将对应的值设置为yes
lazyfree-lazy-eviction no
针对redis内存使用达到maxmeory,并设置有淘汰策略时,在被动淘汰key时,是否采用lazy free机制;
lazyfree-lazy-expire no
针对设置有TTL的键,达到过期时间后,被redis清理删除时是否采用lazy free机制;此场景建议开启,因为TTL本身是自适应调整速度的。
lazyfree-lazy-server-del no
内部删除选项,针对有些指令在处理已存在的键时,会带有一个隐式的DEL键的操作。比如rename oldkey newkey时,如果newkey存在需要删除newkey,如果这些目标键是一个big key,那就会引入阻塞删除的性能问题。 此参数设置就是解决这类问题,建议可开启。
slave-lazy-flush no
针对slave进行全量数据同步,slave在加载master的RDB文件前,会运行flushall来清理自己的数据场景;
参数设置决定是否采用异步flush机制。异步flush清空从节点本地数据库,可减少全量同步耗时,从而减少主库因输出缓冲区爆涨引起的内存使用增长。
11、仅追加模式配置
Redis提供了两种数据持久化的方式,分别是RDB数据快照和AOF持久化两种模式。redis默认启用RDB数据快照,相关说明可以参考上面的配置,相比于数据快照,AOF可提供更好的持久性,从上面可以看出数据快照模式在server宕机的时候,会丢失几s内写入的数据(丢失数据的时yo由save配置决定),但是使用默认数据的fsync策略,redis在服务断电或者宕机的时候只会丢失1s的数据。
当RDB和AOF持久化策略同时启用的时候,redis-server在起来的时候将会优先从aof文件恢复数据,这样就导致一个问题,若redis-server第一次以AOF模式启动的时候,它将不能加载原rdb中的数据,导致启动后原数据为空。
参考:https://blog.51cto.com/11736068/1981965
appendonly no
配置说明:
是否启用AOF持久化。默认不启用。
appendfilename "appendonly.aof"
配置说明:
AOF文件名,aof文件存储路径为上面dir指定的路径,与rdb文件在相同路径。
appendfsync everysec
配置说明:
AOF下可以通过配置appendfsync参数设置redis-server调用fsync()函数将缓冲区的数据刷到磁盘上的策略。默认情况下,大多数操作系统将缓存区的数据写入磁盘的策略是当缓冲区满或者达到30s时,才会将缓冲区数据写入磁盘。
但是也可以通过调用fsync()函数强制将缓冲区的数据刷到磁盘上。Redis提供了以下选项,设置fsync调用策略。
no : 不调用fsync()函数,完全依赖操作系统的写磁盘策略。这种服务器性能最高,但是断电或者服务器宕机的时候就有可能丢失30s的数据,对于数据可靠性较高的系统不建议使用此配置。。
everysec: redis每秒调用一次fsync函数,将缓冲区数据写到磁盘。
always:redis没接收到一次写请求将都调用一次fsync函数,这样严重影响redis server的读写性能。
故一般建议该值使用默认值,即everysec
no-appendfsync-on-rewrite
配置说明:
在aof重写或者写入rdb文件的时候,会执行大量的IO,对于everysec和always的aof模式来说,执行fsync会造成阻塞过长时间。该参数可以控制当进行rewrite的时候是否调用fsync函数刷盘。
no : rewrite期间依然执行fsync函数刷盘,这样更能保证redis持久化特性,但是会影响服务器的读写性能。(默认为no)
Yes:rewrite期间不调用fsync刷盘,可以保证服务器对外提供高性能服务,但是在宕机的时候可能会丢失较长时间的数据。
若对系统的性能要求不是特别高,建议使用默认值no。
auto-aof-rewrite-percentage 100
AOF 持久化是通过保存被执行的写命令来记录数据库状态的,所以AOF文件的大小随着时间的流逝一定会越来越大;
为了解决AOF文件体积膨胀的问题,Redis提供了AOF重写功能:Redis服务器可以创建一个新的AOF文件来替代现有的AOF文件,新旧两个文件所保存的数据库状态是相同的,但是新的AOF文件不会包含任何浪费空间的冗余命令,通常体积会较旧AOF文件小很多。
配置说明:
aof自动重写配置。当目前aof文件大小超过上一次重写的aof文件大小的百分比之多少时调用BGREWRITEAOF重写。如该值为100时,当AOF日志文件是上一次重写大小的两倍的时候将触发重写操作。
auto-aof-rewrite-min-size 64mb
配置说明:
aof自动重写配置。设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写。
aof-load-truncated yes
配置说明:
当redis所在服务器宕机的时候,可能会导致aof文件被截断,这个时候aof文件将不完整,尤其是在ext4文件系统没有添加data=ordered选项的时候会出现。这个时候redis启动的时候有两种选择,1:直接报错,抛出一个错误等待用户修复,2、加载尽可能多的数据并正常启动服务。
yes: server将加载尽可能多的数据并正常启动
no : 服务器出现错误并拒绝启动,需要用户手动执行redis-check-aof命令才可以重新启动。
aof-use-rdb-preamble no
配置说明:
[RDB file][AOF tail]
该新特性是redis4.0之后新添加的。它是一个支持RDB-AOF混合在持久化格式。在启用该功能之后,AOF重写产生的文件将同时包含RDB格式的内容和AOF格式的内容,RDB文件中用于记录已有的数据,AOF格式文件中包含最近发生变化的数据。这样redis就兼有了RDB和AOF的优点。既能快速地生成重写文件,又能在出现问题时快速的载入数据。该功能默认关闭,为了避免数据格式更改出现以外。
12、LUA脚本配置
lua-time-limit 5000
配置说明:
以毫秒为单位执行lua脚本最大的执行时间。一般建议为5s,因为一般lua脚本的执行是毫秒级别的。当lua脚本命令超时之后,redis-server会做如下操作:
- 在日志中记录该脚本执行时间过长
- 调用write的lua脚本只能被SHUTDOWN NOSAVE命令处理,该命令会丢失最近一次持久化后的数据
- 没有调用写操作的lua脚本可以被SCRIPT KILL处理。
- 开始接受其他命令,对于普通命令均会返回busy的错误,仅仅会处理SHUTDOWN NOSAVE和SCRIPT KILL命令。
参考:https://my.oschina.net/floor/blog/1603116
13、集群配置
cluster-enabled yes
配置说明:
是否启用集群配置,默认不开启。
cluster-config-file nodes-6379.conf
配置说明:
集群中的每个节点都有一个集群相关的配置文件,其保存了集群的相关信息。改文件不手动配置,而是由节点自身生成并更新该文件。注意,集群中所有实例的该配置文件名不能冲突。
cluster-node-timeout 15000
配置说明:
集群节点间的链接超时毫秒(默认为15s)。当集群之间连接超时超过该值,将被认为该节点处于不可用状态。
cluster-slave-validity-factor 10
配置说明:
当集群中某个master进行故障转移的时候,全部slave都会请求申请成为新的master,但是有些slave已经和maste断开较长一段时间了,这时这个slave上的数据就会过于陈旧,这样的slave不能提升为master。对于slave,没有比较精确的衡量标准去衡量它的数据age,所以redis提供了两个检查:
- 如果有多个slave服务器可以进行故障转移,他们之间将会交换消息,以试图以最佳的复制偏移量给slave提供故障转移优势。(slave之间相互交换数据,使数据尽量达到最新)
- 计算每个slave与master最后一次互动的时间。互动可能为最后一次Ping的时间、接受命令或者与master断开的时间。若该时间过去太久将不会进行故障转移。
cluster-slave-validity-factor参数用来衡量slave与master数据断开时间过长的一个标准,比较slave断线时间与(node-timeout * slave-validity-factor) + repl-ping-slave-period,当断线时间小于该时间的时候才能进行故障转移。
注意该值默认为10,若该值过大,可能会导致slave数据过于陈旧也会发声故障转移;若该值过小,可能会导致没有可选的slave升级为master。
cluster-migration-barrier 1
配置说明:
Redis集群中的slave节点可以迁移到没有slater节点或者slave节点全部停止工作的master节点下,这种机制提高了redis集群地抵御故障的能力,不然的话,如果master节点下没有正在工作的节点,这台master节点将会成为孤儿节点。
该参数的作用用于指定:当该集群下master节点的slave数量大于该值的时候,其他的节点才能迁移到孤儿master节点下。
如当前值为1,则只有当前master节点下至少有两个slave节点的时候才可以将其中一个节点迁移到孤儿master节点下。若该值为2,则master节点下至少有3个节点,其中一个节点才能迁移到孤儿节点下。
若要禁用slave节点迁移,可以将该值设置成一个比较大的值即可。但是设置为0会比较危险。
cluster-require-full-coverage yes
配置说明:
默认情况下,redis集群中,如果有一个哈希槽没有可用的节点为他提供服务(该哈希槽不属于任何一个节点),redis将停止提供服务。也就是需要保证所有的哈希槽都正常,redis才能正常服务。但是,有的时候使用的指示redis集群的一个子集,这个时候就可以将该选项设置为no,使其正常服务。
cluster-slave-no-failover no
配置说明:
当master挂掉的时候,禁止slave发生故障转移。尤其是在多数据中心的时候该选项可起很大作用。
14、慢请求日志配置
慢请求日志是用来记录redis运行过程中执行比较慢的命令以及耗时。当命令执行时间超过某一个值的时候,将会保存在慢请求日志中,慢请求日志只存储在内存中,不会写文件,所以记录慢请求日志没有IO操作。
查看慢请求日志:
SLOWLOG GET 10(指定查看的条数)
返回数据:
1) (integer) 644 --- 编号
2) (integer) 1551360953 --- 命令执行时的时间戳
3) (integer) 630137 --- 命令执行时间(us)
4) 1) "PING" --- 命令组成的字符串列表
查看慢请求日志条数:
SLOWLOG LEN
重置慢请求日志:
SLOWLOG RESET
参考:https://www.cnblogs.com/weihanli/p/redis-slowlog.html
slowlog-log-slower-than 10000
配置说明:
用于设置记录慢请求日志的最小时间(单位微妙)。若命令运行超过该时间,将被记录到慢请求日志中。注意:负数将禁用慢查询日志;0会强制记录所有日志。由于是IO操作,所以记录所有的操作对性能也不会有太大的影响。
slowlog-max-len 128
配置说明:
最大慢查询日志条数。当慢查询日志超过设定值的时候,redis将剔除最老的记录。
15、延迟监控配置
Redis2.8.13引入了延迟监控新功能,它可以帮助用户检查和定位可能的延迟问题。Redis会耗时将大于等于阈值的操作记录下来,并生成监控信息便于用户查看。详细说明参考:http://ghoulich.xninja.org/2016/12/08/how-to-use-latency-monitor-in-redis/
latency-monitor-threshold 0
配置说明:
设置监控阈值,只监控耗时大于上述值的操作。若设置为0,表示不启用该功能。
16、事件通知配置
Redis2.8.0之后,添加了事件通知新特性,而这个新特性是依赖发布订阅模式实现的。我们可以通过对该功能进行配置来获知某一时间的发生,依赖该功能可以实现定时器等等。但是该功能不是可靠地时间通知,当客户端断开后,将丢失所有断开期间的时间通知,而且并不能确保事件通知的到达。如果不使用该功能建议关闭,因为当数据集较大的时候可能会影响redis的性能。
事件通知的应用可参考:https://blog.csdn.net/kunpeng1987/article/details/79624915
notify-keyspace-events “”
配置说明:
参数是一下字符的任意组合,它指定了服务器该发送哪些类型的通知:
K : 键空间通知,所有通知以 [email protected] 为前缀
E : 键事件通知,所有通知以 [email protected] 为前缀
g : DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知
$ : 字符串命令的通知
l : 列表命令的通知
s : 集合命令的通知
h : 哈希命令的通知
z : 有序集合命令的通知
x : 过期事件:每当有过期键被删除时发送
e : 驱逐(evict)事件:每当有键因为 maxmemory 政策而被删除时发送
A : 参数 g$lshzxe 的别名
当配置参数为空的时候表示不启用该功能。
具体使用教程可参考:https://blog.csdn.net/qijiqiguai/article/details/78229111
17、高级配置
高级配置中主要涉及了redis对特定数据结构进行内存优化的一些参数。
对于hash map类型,当hash key中的field个数和所占内存大小小于某个值的时候,其存储方式实际上是采用zipmap的方式存储的,而不是hash-table,这样可以节省很多内存,原因它省去了hash map很多元数据的存储开销。虽然zipmap的添加、删除、查找的复杂度都是O(n),但是在数据集较小的情况下,其性能与hash-map的性能还是差不多的。当hash key超过某一个大小或者field个数超过一定限制后,redis会在内部自动将zipmap存储重组为正常的hashtable。
对于list数据类型,当数据集小于一定值的时候,其压缩存储方式为ziplist。
对于set数据类型,当数据集小于一定值的时候,其压缩存储方式为inset。
对于zset数据类型,当数据集小于一定值的时候,其压缩存储方式为ziplist。
参考:https://blog.csdn.net/freebird_lb/article/details/7733994
https://blog.csdn.net/session_time/article/details/52792190
http://zhangtielei.com/posts/blog-redis-quicklist.html
hash-max-ziplist-entries 512
配置说明:
指定该参数ziplist中存储的filed数最大为512,当超过该值将重组为hash table。
hash-max-ziplist-value 64
配置说明:
单位字节,指定该参数ziplist中存储的值大小最大为64字节,当超过该大小将被重组为hash table。
配置说明:
当该值为正值的时候,表示以list中的元素的个数为限制决定是否使用ziplist;当该值为负值的时候,表示以list的大小为限制决定是否使用ziplist。
负值可选项有以下几种:
-1 : 每个list的大小不能超过4kb
-2 : 每个list的大小不能超过8kb(默认)
-3 : 每个list的大小不能超过16kb
-4 : 每个list的大小不能超过32kb
-5 : 每个list的大小不能超过64kb
如list-max-ziplist-size 10 表示当list中的元素数超过10个时候,list将被从ziplist重组为list结构。list-max-ziplist-size -2表示当list value大小超过8kb的时候,list将被从ziplist重组为list结构。
list-compress-depth 0
配置说明:
当列表很长的时候,最容易被访问的就是列表两端的数据,中间的数据被访问的频率比较低,访问性能也比较低。所以redis提供这个选项,能够把中间的数据节点进行压缩,进一步的节省内存空间。
0 : 表示所有数据都不压缩。(默认)
1 : 表示quicklist两端各有1个数据不被压缩
2 : 表示quicklist两端各有2个数据不被压缩
3 : 表示quicklist两端各有3个数据不被压缩
……
set-max-intset-entries 512
配置说明:
指定set中最大记录数为512是才使用intset数据结构存储,超过该限制将被重组为Dict结构。
zset-max-ziplist-entries 128
配置说明:
指定zset中最大记录数为128时使用ziplist结构,超过该限制被重组为hash map结构。
zset-max-ziplist-value 64
配置说明:
指定zset中最大大小为64字节时使用ziplist结构,超过该限制被重组为hash map结构。
hll-sparse-max-bytes 3000
配置说明:
单位字节。指定HyperLogLog 稀疏表示字节限制。当value小于等于指定值的时候使用稀疏表示方式,超过该值则使用稠密数据结构。默认为3000。
关于稀疏和稠密数据和结构可参考:https://github.com/LH0702/Single-learn/issues/11
activerehashing yes
配置说明:
默认情况下redis每秒进行10次rehash,用于尽快释放内存。默认该操作开启,若对实时性要求比较高,可将该选项置为no;若对实时性要求没那么高,最好开启次参数尽快释放内存。
client-output-buffer-limit normal 0 0 0
配置说明:
client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>
用于配置客户端输出缓冲限制,是redis server的一种保护机制。client-output-buffer是在server端实现的一个读取缓冲区。redis server在接收到客户端的请求后,把影响结果写入到client buffer中,而不是直接发送给客户端。server把结果写入到client buffer中后,继续处理客户端的其他请求。这样异步处理方式使redis server不会因为网络原因阻塞其他请求的处理。
class:客户端种类
- normal : 普通的客户端
- slave : 从库的复制客户端
- pubsub:发布订阅的客户端
hard limit:缓冲区大小硬性限制。0表示不限制
soft limit:缓冲区大小软性限制。0表示不限制
soft seconds:缓冲区大小达到了soft limit值的持续时间。
Redis server触发保护机制主要有两种情况:
- client buffer达到了soft limit 并且持续了soft seconds时间,将立即断开和客户端的链接
- client buffer达到了hasr limit。Server也立即断开与客户端的链接。
由于client buffer实际上占用了redis数据内存空间。所以当client buffer较大时可能会导致内存空间不足,报OOM错误(内存不足)。所以该值一定不要使用默认值。需要根据需要自行设置。
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
client-query-buffer-limit 1gb
配置说明:
Redis为每个客户端分配了输入缓冲区,它的作用是将客户端发送的命令临时保存,同时redis从输入缓冲中取出命令并执行。输入缓冲区为客户端发送命令到服务端执行命令提供了缓冲。当缓冲区大小超过限制(默认为1GB)的时候,客户端将被强制关闭。可通过client list命令查看所有的客户端和输入输出缓冲区。
由于输入缓冲区的内存与输出缓冲区内存相同,都是用的redis-server得数据空间,所以让输入缓冲区过大也可能会出现OOM问题。
若不设置,则限制为1gb也可以根据实际情况手动设置其他值,注意此值为每个客户端的最大查询缓冲。
参考:https://blog.csdn.net/sunhuiliang85/article/details/75092403
proto-max-bulk-len 512mb
配置说明:
指定redis单个请求的元素的大小限制,默认上限为512mb,即redis中任意一个string大小不能超过512mb,无论是key还是value,建议不要小于512mb,具体可以参考以下链接。
https://github.com/antirez/redis/issues/757
hz 10
配置说明:
该参数用于设定redis调用内部函数执行后台任务的频率。后面的值表示1s内执行多少次,默认为10,建议不要超过100。
如redis会定时调用内部函数进行关闭超时的客户端连接,清除过期的redis key等等。
这个值越大耗费的CPU也随之增加,使得redis执行后台任务的灵敏度提高,如过期的key可以更快的清除。
aof-rewrite-incremental-fsync yes
配置说明:
当子进程重写AOF文件,以下选项开启时,AOF文件会每产生32M数据调用fsync函数同步一次。这有助于更快写入文件到磁盘避免延迟
https://blog.csdn.net/COOL_CR/article/details/52411172
https://github.com/RedisLabsModules/redex
https://blog.csdn.net/u012152619/article/details/52821201
https://www.jianshu.com/p/5a187bfd4a06
http://xiaorui.cc/2016/12/08/redis-module