redis配置文件解读

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

# include /path/to/local.conf
上面的配置主要是为了引入其他的配置文件,可以用来在引入的配置文件中定义一个模板配置文件。

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

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

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

tcp-backlog 511
这个是一个系统级别的参数,指的是建立连接后redis未来得及处理而放入等待队列的连接数量,
在高QPS系统中需要设置一个稍微大点的值来避免慢链接问题(由于部分链接执行慢而导致的后面链接积压)值得注意的是这个参数会受到Linux内核参数 /proc/sys/net/core/somaxconn 的影响所以需要同步设置Linux内核参数 somaxconn 和 tcp_max_syn_backlog的值

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

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

tcp-keepalive 300
TCP心跳检测 默认值为300秒 使用SO_KEEPALIVE发送ACK到客户端 主要有方面的原因
1)发现断开的连接 2)从第三方网络角度来确保连接是存活的。

daemonize no
是否以daemonize进程启动

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

loglevel notice
redis 日志级别

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

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

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

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

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

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

dbfilename dump.rdb
RDB名称,默认为 dump.rdb

dir ./
RDB文件和AOF文件的路径

----------------下面是redis 复制部分
# slaveof
告诉redis从那台主节点复制数据,当前redis server为slave

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

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

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

repl-diskless-sync no
是否开启无磁盘复制 默认为关闭
新的slave或者是重连后无法继续备份的slave 需要做所谓的"全量复制",即将一个RDB文件从master传送到slave。这个传送有以下两种方式:
1)基于磁盘备份:redis master新建一个进程来写RDB文件到磁盘上,稍后这个文件会被父进程增量传送给slave
2)无磁盘备份:redis master新建一个进程,直接将RDB文件写到slave的sockets,不再使用磁盘。
在硬盘备份的情况下,master的子进程生成RDB文件。一旦生成,多个slave可以立即排成队列使用主站的RDB文件。在无硬盘备份的情况下,一次RDB传送开始,新的从站到达后,需要等待现在的传送结束,才能开启新的传送。
如果使用无硬盘备份,master会在开始传送之间等待一段时间(可配置,以秒为单位),希望等待多个slave到达后并行传送。
在硬盘低速而网络高速(高带宽)情况下,无硬盘备份更好

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

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

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

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

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

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

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

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


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

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

rename-command 原命令 新命令名称
用来重命名redis的命令名称,用于在一个共享的网络中对一些危险的命令进行重命名,比如config命令或者save,flushall 等等,也可以通过重命名为一个空字符串来完全警用这个命令,比如 rename-command config ""
需要注意的是重命名的指令会记录到AOF文件或者传送给slave

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

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

# maxmemory-policy noeviction
当内存使用完之后的驱逐策略,默认为不驱逐,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-samples 5
使用LRU和 TTL 算法驱逐策略不是一个非常准确的算法,因此redis提供了这个参数来提高准确度,默认会检查5个key选一个最接近的值,这个值越大越准确但是redis消耗也越大。

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

appendfilename "appendonly.aof"
AOF文件名称

appendfsync everysec
AOF方式的刷盘频率,redis提供了三种方式,如下:
1)no : 不主动刷盘,由操作系统决定什么时候讲数据写入磁盘,性能好
2)always 每次写之后都刷盘到AOF文件,性能低 但是安全
3)everysec 每秒刷盘一次,兼顾性能和安全性,是一种比较妥协的方式。

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

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
这两个参数用来进行AOF文件的自动rewrite操作,上面一个设置自动触发的比例,下面一个设置自动触发的最小文件大小

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

---------------------- LUA SCRIPTING ----------------------
lua-time-limit 5000
lua脚步执行的最长时间限制,单位为毫秒,默认为 5秒

-----------------------REDIS CLUSTER--------------------
# cluster-enabled yes
是否启用redis集群

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

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

# cluster-slave-validity-factor 10
这个参数用来设置当集群中有master被踢出,它的slave会来竞争成为master,但是有些slave可能与master断开的时间过长了,数据很老了,这样的slave就不能参与竞争了,通过这个计算方式来计算 (node-timeout * slave-validity-factor) + repl-ping-slave-period
比如上面 node-time=15秒 slave-validity-factor=10 repl-ping-slave-period 默认为10秒那么一个slave最后跟master通讯的时间超过 15*10+10=160秒则这个slave不能成为master,设置为0是唯一能保证当集群从分区恢复的时候集群能继续正常运行。

# cluster-migration-barrier 1
这个配置解释有点绕, 一个slave可能从一个master转移去作为另外一个孤立的master的从节点,这个值配置至少一个master有多少个其他的slave的时候才允许这个操作
配置为1 表示一个master除去转移去另外一个master的salve外还剩下至少一个slave,既是这个master当前至少有2个存活的slave。

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

------------------------- SLOW LOG ----------------

slowlog-log-slower-than 10000
指定慢查询的触发条件,单位是微妙,这儿需要注意,这应该是所以配置单位最小的了,当执行时间超过这个值会记录到慢日志中,这个值不包含网络IO的开销
设置为负数表示不开启慢日志记录,
设置为0表示记录所以命令

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

----------------------LATENCY MONITOR-----------

latency-monitor-threshold 0
redis延迟监控,单位为毫秒, redis的latency-monitor子系统会在运行时采集不用操作命令的样本,收集可能与redis延迟相关的数据
通过 LATENCY 命令,可以打印出图形信息和获取到报表数据
该系统仅仅会记录这样的操作,执行时间大于或者等于此配置指定的值的操作,当设置为0表示关闭此功能。

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

list-max-ziplist-size -2
设置List在使用压缩格式时 每个ziplist节点的最大尺寸,有如下取值:
-5: max size: 64 Kb <-- not recommended for normal workloads
-4: max size: 32 Kb <-- not recommended
-3: max size: 16 Kb <-- probably not recommended
-2: max size: 8 Kb <-- good
-1: max size: 4 Kb <-- good

list-compress-depth 0
list 结构的压缩深度
0:不压缩
1:意味着当节点插入list后就压缩,从头到尾被压缩:
[head]->node->node->...->node->[tail]
head 和 tail 未压缩,中间的节点都会被压缩
2:表示list中头尾各有两个节点不压缩,中间的都压缩
3:表示list中头尾各有3个节点不压缩,中间的都压缩,
以此类推

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

你可能感兴趣的:(redis)