redis配置文件解读

一直使用redis,但是还没有怎么有机会去调优,互联网都喜欢使用redis来做高速缓存,所以也准备花点时间来研究一下redis的优化问题,首先从redis的配置文件着手吧,搞清楚配置里面能做哪些事,废话不多说,上配置

#include/path/to/local.conf

上面的配置主要是为了引入其他的配置文件,可以用来在引入的配置文件中定义一个模板配置文件。

#bind192.168.1.10010.0.0.1

绑定redis监听的网络接口,多个用空格隔开,生产环境建议绑定,出于安全考虑

protected-modeyes

受保护模式当受保护模式开启的情况下如果redisserver没有通过上面的bind绑定网络接口并且没有设置密码,那么redisserver就只能通过本机127.0.0.1的地址或者同一个域访问

port6379

这个没什么好说的,redis的端口

tcp-backlog511

这个是一个系统级别的参数,指的是建立连接后redis未来得及处理而放入等待队列的连接数量,

在高QPS系统中需要设置一个稍微大点的值来避免慢链接问题(由于部分链接执行慢而导致的后面链接积压)值得注意的是这个参数会受到Linux内核参数/proc/sys/net/core/somaxconn的影响所以需要同步设置Linux内核参数somaxconn和tcp_max_syn_backlog的值

#unixsocket/tmp/redis.sock

指定unixsocket通讯的路径地址,没有默认值unixsocket这个概念好像没有用过,我也不懂就不多做介绍

timeout0

连接超时时间,指的的是redis服务端一个连接空闲多久就会被关闭,默认为0不会关闭,单位是秒个人建议这个值应该根据客户端连接池来合理配置

tcp-keepalive300

TCP心跳检测默认值为300秒使用SO_KEEPALIVE发送ACK到客户端主要有方面的原因

1)发现断开的连接2)从第三方网络角度来确保连接是存活的。

daemonizeno

是否以daemonize进程启动

pidfile/var/run/redis_6379.pid

pid文件路径redis启动的时候会把自己的PID写到这个文件中,退出的时候删掉

loglevelnotice

redis日志级别

logfile""

日志文件路径空字符串则强制redis输出到控制台

databases16

设置redis数据库数量默认为16个,默认所在的库为db0,你可以通过select来改变当前所在的数据库

save9001

save30010

save6010000

设置redisRDB的频率,默认如上,表示60秒内有一万次或者300秒内有10次,或者900秒内有一次写就触发RDB,RDB则是内存镜像备份,个人建议在线上生产环境取消自动镜像备份,因为redis内存使用很大,每次镜像备份会比较耗资源,影响线上读写性能,可以手动在业务低谷期触发。

stop-writes-on-bgsave-erroryes

指的是当redis执行RDB内存镜像失败的时候,是否停止用户的写请求,默认是开启,这样可以让用户知道redis执行bgsave失败,否则就没人能注意到灾难会发生。个人建议在使用redis中如果不强依赖redis的数据一致性可以关闭此功能。

rdbcompressionyes

是否压缩内存镜像文件,默认开启,使用LZF方式压缩RDB文件,如果你想节省CPU,可以关闭,关闭后生产的镜像文件会比压缩后文件大不少。

rdbchecksumyes

从RDB第五版开始,会使用CRC64做一个校验和放置在文件的末尾,Thismakestheformatmoreresistanttocorruption,这句不知道该怎么翻译,大意就是这种格式容错机制更好吧,但是这会带来额外大约10%的性能开销,因此,你也可以禁用它来提高性能。

dbfilenamedump.rdb

RDB名称,默认为dump.rdb

dir./

RDB文件和AOF文件的路径

----------------下面是redis复制部分

#slaveof<masterip><masterport>

告诉redis从那台主节点复制数据,当前redisserver为slave

#masterauth<master-password>

如果master节点开启了密码保护,则需要设置master的密码

slave-serve-stale-datayes

当slave未完成复制的时候或者丢失了与master的连接的时候有如下两种方式回复客户端请求:1)如果上面设置为yes则slave会正常响应客户端请求,这样可能返回客户端过期的数据2)如果上面设置为no则slave会返回以下的错误信息"SYNCwithmasterinprogress"

slave-read-onlyyes

设置slave为只读模式,从redis2.6版本开始,默认slave为只读模式

repl-diskless-syncno

是否开启无磁盘复制默认为关闭

新的slave或者是重连后无法继续备份的slave需要做所谓的"全量复制",即将一个RDB文件从master传送到slave。这个传送有以下两种方式:

1)基于磁盘备份:redismaster新建一个进程来写RDB文件到磁盘上,稍后这个文件会被父进程增量传送给slave

2)无磁盘备份:redismaster新建一个进程,直接将RDB文件写到slave的sockets,不再使用磁盘。

在硬盘备份的情况下,master的子进程生成RDB文件。一旦生成,多个slave可以立即排成队列使用主站的RDB文件。在无硬盘备份的情况下,一次RDB传送开始,新的从站到达后,需要等待现在的传送结束,才能开启新的传送。

如果使用无硬盘备份,master会在开始传送之间等待一段时间(可配置,以秒为单位),希望等待多个slave到达后并行传送。

在硬盘低速而网络高速(高带宽)情况下,无硬盘备份更好

repl-diskless-sync-delay5

上面讲到的无磁盘复制的时候master生成RDB后会等待一段时间再发送,单位为秒

#repl-ping-slave-period10

slave以一个固定的时间间隔发送ping到服务器,默认为10秒

#repl-timeout60

slave复制超时时间默认为60秒,确保这个值要大于上面的repl-ping-slave-period不然每次ping都会被认为超时

repl-disable-tcp-nodelayno

复制时是否禁用tcp-nodelay特性,默认不禁用,这样可能会复制有一些延迟,但是会使TCP的包数量更少发送频率更低,最多达到40毫秒的延迟,会使用Linux内核的配置参数

#repl-backlog-size1mb

在master上面为每个slave分配的复制缓冲区大小,主要用来缓存slave断开重连期间产生的数据,当slave重连上master可以直接复制这部分数据,不用全量复制,这个值设置越大那么slave断开重连后只需要部分复制的时间就可以越长,这个缓冲区只有在至少有一个slave连接的时候才会分配内存

#repl-backlog-ttl3600

上面配置的缓冲区的超时时间,当slave断开master后多长时间master会释放缓冲区。

slave-priority100

slave的优先权,主用用于sentinel来选择提升slave成为一个新的master时使用,数值越低优先权越高,但是0是一个特殊的值,它表示永远不会成为master的角色

#min-slaves-to-write3

#min-slaves-max-lag10

设置master至少满足上面的条件才能接受客户端的写请求,min-slaves-to-write指的的至少多少个slave在线,min-slaves-max-lag指的是slave复制的延迟时间,

-----------------安全部分----------------

#requirepassfoobared

redis的连接密码,当在一个不安全的网络中使用时需要设置

rename-command原命令新命令名称

用来重命名redis的命令名称,用于在一个共享的网络中对一些危险的命令进行重命名,比如config命令或者save,flushall等等,也可以通过重命名为一个空字符串来完全警用这个命令,比如rename-commandconfig""

需要注意的是重命名的指令会记录到AOF文件或者传送给slave

-----------------limit---------

#maxclients10000

同时连接的客户端的最大连接数,默认值为10000,但是这个也会受到系统连接数的限制。

#maxmemory<bytes>

设置redis最大使用内存,当使用达到最大内存时,redis会使用指定的内存驱逐策略来释放内存空间,如果redis无法释放出内存或者设置了不驱逐的策略,那么redis对于需要更多内存的命令回应一个错误信息,根据个人经验,此值设置为物理内存大小的70%-80%比较合理,因为master上面还需要预留出给每个slave的outputbuffer

#maxmemory-policynoeviction

当内存使用完之后的驱逐策略,默认为不驱逐,redis支持6种策略,分别如下:

1)volatile-lru在设置了过期时间的Key上运用LRU算法移除

2)allkeys-lru在所以的Key上运用LRU算法移除

3)volatile-random在设置了过期时间的key上随机移除

4)allkeys-random在所以Key上运用随机算法移除

5)volatile-ttl移除最快将要过期的数据(设置了过期时间的)

6)noeviction不驱逐数据

根据个人的经验,当设置为noeviction时,内存满了之后客户端无法连上redis,也无法执行读写操作,唯一能做的就是重启服务,所以不建议设置为此值。

#maxmemory-samples5

使用LRU和TTL算法驱逐策略不是一个非常准确的算法,因此redis提供了这个参数来提高准确度,默认会检查5个key选一个最接近的值,这个值越大越准确但是redis消耗也越大。

--------------------APPENDONLYMODE--------------

appendonlyno

使用AOF的方式进行数据持久化,redis提供了RDB和AOF两种持久化机制,两种方式可以同时使用。

appendfilename"appendonly.aof"

AOF文件名称

appendfsynceverysec

AOF方式的刷盘频率,redis提供了三种方式,如下:

1)no:不主动刷盘,由操作系统决定什么时候讲数据写入磁盘,性能好

2)always每次写之后都刷盘到AOF文件,性能低但是安全

3)everysec每秒刷盘一次,兼顾性能和安全性,是一种比较妥协的方式。

no-appendfsync-on-rewriteno

设置当redis在rewrite操作时主线程不执行阻塞的刷盘操作,默认为关闭如果你希望有一个更低的延迟设置为yes,如果你不能容忍数据丢失则设置为no

auto-aof-rewrite-percentage100

auto-aof-rewrite-min-size64mb

这两个参数用来进行AOF文件的自动rewrite操作,上面一个设置自动触发的比例,下面一个设置自动触发的最小文件大小

aof-load-truncatedyes

是否允许redis加载不完整的AOF文件,当redis启动的时可能发现加载了不完整的AOF文件,这可能是因为OScrash或者redis进程crash造成的。

----------------------LUASCRIPTING----------------------

lua-time-limit5000

lua脚步执行的最长时间限制,单位为毫秒,默认为5秒

-----------------------REDISCLUSTER--------------------

#cluster-enabledyes

是否启用redis集群

#cluster-config-filenodes-6379.conf

集群配置文件,每一个集群节点需要一个单独的配置文件,这个文件不是手动创建和编辑的,它是有集群节点创建和编辑的,确保运行在同一个系统上的redis不会相互覆盖这个配置文件

#cluster-node-timeout15000

集群节点超时时间,单位是毫秒,大多数其他内部超时时间限制是这个超时时间的倍数

#cluster-slave-validity-factor10

这个参数用来设置当集群中有master被踢出,它的slave会来竞争成为master,但是有些slave可能与master断开的时间过长了,数据很老了,这样的slave就不能参与竞争了,通过这个计算方式来计算(node-timeout*slave-validity-factor)+repl-ping-slave-period

比如上面node-time=15秒slave-validity-factor=10repl-ping-slave-period默认为10秒那么一个slave最后跟master通讯的时间超过15*10+10=160秒则这个slave不能成为master,设置为0是唯一能保证当集群从分区恢复的时候集群能继续正常运行。

#cluster-migration-barrier1

这个配置解释有点绕,一个slave可能从一个master转移去作为另外一个孤立的master的从节点,这个值配置至少一个master有多少个其他的slave的时候才允许这个操作

配置为1表示一个master除去转移去另外一个master的salve外还剩下至少一个slave,既是这个master当前至少有2个存活的slave。

#cluster-require-full-coverageyes

表示集群是否需求所以的hashslot都正常才能访问,默认情况下redis发现有至少一个hashslot没在集群中时就会停止客户端请求,这种情况可能是因为网络分区造成的,当集群恢复后会自动恢复访问。

-------------------------SLOWLOG----------------

slowlog-log-slower-than10000

指定慢查询的触发条件,单位是微妙,这儿需要注意,这应该是所以配置单位最小的了,当执行时间超过这个值会记录到慢日志中,这个值不包含网络IO的开销

设置为负数表示不开启慢日志记录,

设置为0表示记录所以命令

slowlog-max-len128

保留的慢日志数量,慢日志是一个FIFO的队列,如果超过限制数量旧数据会被移除。

----------------------LATENCYMONITOR-----------

latency-monitor-threshold0

redis延迟监控,单位为毫秒,redis的latency-monitor子系统会在运行时采集不用操作命令的样本,收集可能与redis延迟相关的数据

通过LATENCY命令,可以打印出图形信息和获取到报表数据

该系统仅仅会记录这样的操作,执行时间大于或者等于此配置指定的值的操作,当设置为0表示关闭此功能。

-------------------ADVANCEDCONFIG---------------------

hash-max-ziplist-entries512

hash-max-ziplist-value64

hash结构可以使用一个更加高效的内存结构来编码当里面的entries比较少的时候,比如上面指定当一个hash结构中entries少于512时使用高效的编码方式

list-max-ziplist-size-2

设置List在使用压缩格式时每个ziplist节点的最大尺寸,有如下取值:

-5:maxsize:64Kb<--notrecommendedfornormalworkloads

-4:maxsize:32Kb<--notrecommended

-3:maxsize:16Kb<--probablynotrecommended

-2:maxsize:8Kb<--good

-1:maxsize:4Kb<--good

list-compress-depth0

list结构的压缩深度

0:不压缩

1:意味着当节点插入list后就压缩,从头到尾被压缩:

[head]->node->node->...->node->[tail]

head和tail未压缩,中间的节点都会被压缩

2:表示list中头尾各有两个节点不压缩,中间的都压缩

3:表示list中头尾各有3个节点不压缩,中间的都压缩,

以此类推

set-max-intset-entries512

set集合中超过此值redis就会使用hash表结构表示,小于此值redis会使用高效的内存结构