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会使用高效的内存结构