Redis配置文件详解
Redis的配置文件redis.conf过滤掉空行和注释行,总共有49个可控项。
1 daemonize no
默认情况下,redis不是后台运行,如果需要后台运行,把该项的值改为yes。
2 pidfile /var/run/redis.pid
当Redis 在后台运行的时候,Redis 默认会把pid 文件放在/var/run/redis.pid,你可以配置到其他地址。
当运行多个redis 服务时,需要指定不同的pid 文件和端口
3 port 6379
监听的端口号
4 tcp-backlog 511
TCP监听的最大容量数。
在高并发的环境下,你需要把这个值调高,以避免客户端连接缓慢的问题。
Linux内核会自动把这个值缩小成/paoc/sys/net/core/somaxconn对应的值,所以你要修改这两个值才能达到预期效果。
5 timeout 0
设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接,0就是不管它。
6 tcp-keepalive 0
tcp心跳包。
如果设置为非0,则在与客户端缺乏通讯的时候使用SO_KEEPALIVE发送tcp acks给客户端。
推荐一个合理的值就是60秒
7 loglevel notice
定义日志的级别,一共有四种:debug、verbose、notice、warning
8 logfile ""
指定日志文件的位置
9 databases 16
设置数据库的个数,可以使用SELECT 命令来切换数据库。默认使用的数据库是0号库,默认16个库。
10 save 900 1
11 save 300 10
12 save 60 10000
保存数据快照的频率,即将数据持久化到dump.rdb文件中的频度。
用来描述"在多少秒期间至少多少个变更操作"触发snapshot数据保存动作
默认设置,意思是:
if(在60 秒之内有10000 个keys 发生变化时){
进行镜像备份
}else if(在300 秒之内有10 个keys 发生了变化){
进行镜像备份
}else if(在900 秒之内有1 个keys 发生了变化){
进行镜像备份
}
13 stop-writes-on-bgsave-error yes
当持久化出现错误时,是否依然继续进行工作,是否终止所有的客户端write请求。
默认设置"yes"表示终止,一旦snapshot数据保存故障,那么此server为只读服务。
如果为"no",那么此次snapshot将失败,但下一次snapshot不会受到影响,不过如果出现故障,数据只能恢复到"最近一个成功点"
14 rdbcompression yes
在进行数据镜像备份时,是否启用rdb文件压缩手段,默认为yes。
压缩可能需要额外的cpu开支,不过这能够有效的减小rdb文件的大,有利于存储/备份/传输/数据恢复
15 rdbchecksum yes
是否进行校验和,是否对rdb文件使用CRC64校验和,默认为"yes",那么每个rdb文件内容的末尾都会追加CRC校验和,利于第三方校验工具检测文件完整性
16 dbfilename dump.rdb
镜像备份的文件名
17 dir ./
数据库镜像备份的文件rdb/AOF文件放置的路径。
这里的路径跟文件名要分开配置是因为Redis 在进行备份时,先会将当前数据库的状态写入到一个临时文件中,
等备份完成时,再把该临时文件替换为上面所指定的文件,而这里的临时文件和上面所配置的备份文件都会放在这个指定的路径当中
18 slave-serve-stale-data yes
当主master服务器挂机或主从复制在进行时,是否依然可以允许客户访问可能过期的数据。
在"yes"情况下,slave继续向客户端提供只读服务,有可能此时的数据已经过期;
在"no"情况下,任何向此server发送的数据请求服务(包括客户端和此server的slave)都将被告知"error"
19 slave-read-only yes
slave是否为"只读",强烈建议为"yes"
20 repl-diskless-sync no
21 repl-diskless-sync-delay 5
22 repl-disable-tcp-nodelay no
slave与master的连接,是否禁用TCP nodelay选项。
"yes"表示禁用,那么socket通讯中数据将会以packet方式发送(packet大小受到socket buffer限制)。
可以提高socket通讯的效率(tcp交互次数),但是小数据将会被buffer,不会被立即发送,对于接受者可能存在延迟。
"no"表示开启tcp nodelay选项,任何数据都会被立即发送,及时性较好,但是效率较低,建议设为no
23 slave-priority 100
适用Sentinel模块(unstable,M-S集群管理和监控),需要额外的配置文件支持。
slave的权重值,默认100.当master失效后,Sentinel将会从slave列表中找到权重值最低(>0)的slave,并提升为master。
如果权重值为0,表示此slave为"观察者",不参与master选举
24 appendonly no
redis 默认每次更新操作后会在后台异步的把数据库镜像备份到磁盘,但该备份非常耗时,且备份不宜太频繁
redis 同步数据文件是按上面save条件来同步的
如果发生诸如拉闸限电、拔插头等状况,那么将造成比较大范围的数据丢失
所以redis提供了另外一种更加高效的数据库备份及灾难恢复方式
开启append only 模式后,redis 将每一次写操作请求都追加到appendonly.aof 文件中
redis重新启动时,会从该文件恢复出之前的状态。
但可能会造成 appendonly.aof 文件过大,所以redis支持BGREWRITEAOF 指令,对appendonly.aof重新整理@
25 appendfilename "appendonly.aof"
更新日志文件名,默认值为appendonly.aof
26 appendfsync everysec
27 no-appendfsync-on-rewrite no
在aof rewrite期间,是否对aof新记录的append暂缓使用文件同步策略,主要考虑磁盘IO开支和请求阻塞时间。
默认为no,表示"不暂缓",新的aof记录仍然会被立即同步
28 auto-aof-rewrite-percentage 100
当Aof log增长超过指定比例时,重写log file, 设置为0表示不自动重写Aof 日志,重写是为了使aof体积保持最小,而确保保存最完整的数据。
29 auto-aof-rewrite-min-size 64mb
触发aof rewrite的最小文件尺寸
30 aof-load-truncated yes
31 lua-time-limit 5000
lua脚本运行的最大时间
32 slowlog-log-slower-than 10000
"慢操作日志"记录,单位:微秒(百万分之一秒,1000 * 1000),如果操作时间超过此值,将会把command信息"记录"起来.(内存,非文件)。
其中"操作时间"不包括网络IO开支,只包括请求达到server后进行"内存实施"的时间."0"表示记录全部操作
33 slowlog-max-len 128
"慢操作日志"保留的最大条数,"记录"将会被队列化,如果超过了此长度,旧记录将会被移除。
可以通过"SLOWLOG <subcommand> args"查看慢记录的信息(SLOWLOG get 10,SLOWLOG reset)
34 latency-monitor-threshold 0
35 notify-keyspace-events ""
36 hash-max-ziplist-entries 512
37 hash-max-ziplist-value 64
hash 中包含超过指定元素个数并且最大的元素当没有超过临界时,hash 将以zipmap来存储
zipmap又称为 small hash,可大大减少内存的使用
hash类型的数据结构在编码上可以使用ziplist和hashtable。ziplist的特点就是文件存储(以及内存存储)所需的空间较小,在内容较小时,性能和hashtable几乎一样.
因此redis对hash类型默认采取ziplist。如果hash中条目的条目个数或者value长度达到阀值,将会被重构为hashtable。
这个参数指的是ziplist中允许存储的最大条目个数,,默认为512,建议为128
ziplist中允许条目value值最大字节数,默认为64,建议为1024
38 list-max-ziplist-entries 512
39 list-max-ziplist-value 64
对于list类型,将会采取ziplist,linkedlist两种编码类型
40 set-max-intset-entries 512
intset中允许保存的最大条目个数,如果达到阀值,intset将会被重构为hashtable
41 zset-max-ziplist-entries 128
42 zset-max-ziplist-value 64
zset为有序集合,有2中编码类型:ziplist,skiplist。因为"排序"将会消耗额外的性能,当zset中数据较多时,将会被重构为skiplist。
43 hll-sparse-max-bytes 3000
44 activerehashing yes
是否重置Hash表
设置成yes后redis将每100毫秒使用1毫秒CPU时间来对redis的hash表重新hash,可降低内存的使用
当使用场景有较为严格的实时性需求,不能接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。
如果没有这么严格的实时性要求,可以设置为 yes,以便能够尽可能快的释放内存
45 client-output-buffer-limit normal 0 0 0
46 client-output-buffer-limit slave 256mb 64mb 60
47 client-output-buffer-limit pubsub 32mb 8mb 60
客户端buffer控制。在客户端与server进行的交互中,每个连接都会与一个buffer关联,此buffer用来队列化等待被client接受的响应信息。
如果client不能及时的消费响应信息,那么buffer将会被不断积压而给server带来内存压力.如果buffer中积压的数据达到阀值,将会导致连接被关闭,buffer被移除。
buffer控制类型包括:normal -> 普通连接;slave ->与slave之间的连接;pubsub ->pub/sub类型连接,
此类型的连接,往往会产生此种问题;因为pub端会密集的发布消息,但是sub端可能消费不足.
指令格式:client-output-buffer-limit <class> <hard> <soft> <seconds>",其中hard表示buffer最大值,一旦达到阀值将立即关闭连接;
soft表示"容忍值",它和seconds配合,如果buffer值超过soft且持续时间达到了seconds,也将立即关闭连接,
如果超过了soft但是在seconds之后,buffer数据小于了soft,连接将会被保留.
其中hard和soft都设置为0,则表示禁用buffer控制.通常hard值大于soft.
48 hz 10
Redis server执行后台任务的频率,默认为10,此值越大表示redis对"间歇性task"的执行次数越频繁(次数/秒)。
"间歇性task"包括"过期集合"检测、关闭"空闲超时"的连接等,此值必须大于0且小于500。
此值过小就意味着更多的cpu周期消耗,后台task被轮询的次数更频繁。此值过大意味着"内存敏感"性较差。建议采用默认值。
49 aof-rewrite-incremental-fsync yes