可引用外部的配置文件。
# include /path/to/local.conf
# include /path/to/other.conf
模块化,可以让用户自己编写代码来实现和扩展redis不具备的功能。
# loadmodule /path/to/my_module.so
# loadmodule /path/to/other_module.so
绑定主机地址。默认不设置的话,redis会响应本机所有可用网卡的连接请求。也可以通过bind配置项来指定要绑定的IP。
#bind 127.0.0.1
protected-mode no
监听端口号。如果设为0,redis将不在socket 上监听任何客户端连接。
port 6379
TCP监听的最大容纳数量。
在高并发的环境下,你需要把这个值调高以避免客户端连接缓慢的问题。在高并发环境下,需要一个高backlog值来避免慢客户端连接问题。注意Linux内核会将这个值减小到/proc/sys/net/core/somaxconn的值,所以需要确认增大somaxconn和tcp_max_syn_backlog两个值来打到想要的效果。
tcp-backlog 511
指定 unix socket 的路径。
# unixsocket /tmp/redis.sock
# unixsocketperm 700
间隔N秒后无响应关闭连接。(0忽略)
timeout 0
tcp心跳检测。单位为秒,如果设置为0,则不会进行keeyalive检测,建议设置成60。
tcp-keepalive 60
是否设置守护线程。
redis采用单进程多线程的模式。设置为yes,代表守护进程模式,redis会在后台运行,并将pid号写入redis.conf选项pidfile设置的文件中,此redis将一直运行,kill进程结束。
设置为no,进入redis命令界面,exit强制退出或者关闭连接工具(putty,xshell等)都会导致redis进程退出。
daemonize yes
可以通过upstart和systemd管理Redis守护进程。
选项:
supervised no - 没有监督互动
supervised upstart - 通过将Redis置于SIGSTOP模式来启动信号
supervised systemd - signal systemd将READY = 1写入$ NOTIFY_SOCKET
supervised auto - 检测upstart或systemd方法基于 UPSTART_JOB或NOTIFY_SOCKET环境变量。
supervised no
进程管道ID文件。
当redis作为守护进程运行的时候,它会把 pid 默认写到 /var/run/redis.pid 文件里面, 也可以在这里自己制定它的文件位置。
pidfile /var/run/redis_6379.pid
设置日志级别。
debug(记录大量日志信息,适用于开发、测试阶段)
verbose(较多日志信息)
notice(适量日志信息,使用于生产环境)
warning(仅有部分重要、关键信息才会被记录)
loglevel notice
日志记录方式,默认为标准输出,如果配置为redis为守护进程方式运行,而这里又配置为标准输出,则日志将会发送给/dev/null。
logfile ""
是否启用log。
syslog-enabled no
日志内容身份或识别ID,以redis开头。
syslog-ident redis
指定系统日志设置,必须是 USER 或者是 LOCAL0-LOCAL7 之间的值。指定syslog设备,值可以是user或local0-local7。
syslog-facility local0
redis库数量,默认16。
databases 16
启动时是否显示Logo。
always-show-logo yes
指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合。
满足以下条件将会同步数据:
900秒(15分钟)内有1个更改。
300秒(5分钟)内有10个更改。
60秒内有10000个更改。
Note: 可以把所有“save”行注释掉,这样就取消同步操作了。
save 900 1
save 300 10
save 60 10000
RDB快照不能用时,redis将停止写入。设置为no,表示不在乎数据不一致或者有其他手段发现和控制。
stop-writes-on-bgsave-error yes
指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大。
rdbcompression yes
在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。
rdbchecksum yes
设置存储快照文件名
dbfilename dump6379.rdb
指定数据库文件(快照文件)存放目录。一定是个目录,不能是文件名。
dir /usr/local/redis/data
主从复制,使用 slaveof 来让一个 redis 实例成为另一个reids 实例的副本,默认关闭注意这个只需要在 slave 上配置。
# slaveof
主从复制,如果 master 需要密码认证,就在这里设置,默认不设置。
masterauth
当一个 slave 与 master 失去联系,或者复制正在进行的时候,slave 可能会有两种表现:
①如果为 yes ,slave 仍然会应答客户端请求,但返回的数据可能是过时,或者数据可能是空的在第一次同步的时候 。
②如果为 no ,在你执行除了 info he salveof 之外的其他命令时,slave 都将返回一个 “SYNC with master in progress” 的错误。
slave-serve-stale-data yes
配置一个 slave 实体是否接受写入操作。
通过写入操作来存储一些短暂的数据对于一个 slave 实例来说可能是有用的,因为相对从 master 重新同步数而言,据数据写入到 slave会更容易被删除。但是如果客户端因为一个错误的配置写入,也可能会导致一些问题。从 redis 2.6 版起,默认 slaves 都是只读的。
slave-read-only yes
主从数据复制是否使用无硬盘复制功能。
新的从站和重连后不能继续备份的从站,需要做所谓的“完全备份”,即将一个RDB文件从主站传送到从站。
这个传送有以下两种方式:
①硬盘备份:redis主站创建一个新的进程,用于把RDB文件写到硬盘上。过一会儿,其父进程递增地将文件传送给从站。
②无硬盘备份:redis主站创建一个新的进程,子进程直接把RDB文件写到从站的套接字,不需要用到硬盘。
在硬盘备份的情况下,主站的子进程生成RDB文件。一旦生成,多个从站可以立即排成队列使用主站的RDB文件。
在无硬盘备份的情况下,一次RDB传送开始,新的从站到达后,需要等待现在的传送结束,才能开启新的传送。如果使用无硬盘备份,主站会在开始传送之间等待一段时间(可配置,以秒为单位),希望等待多个子站到达后并行传送。
在硬盘低速而网络高速(高带宽)情况下,无硬盘备份更好。
repl-diskless-sync no
当启用无硬盘备份,服务器等待一段时间后才会通过套接字向从站传送RDB文件,这个等待时间是可配置的。
这一点很重要,因为一旦传送开始,就不可能再为一个新到达的从站服务。从站则要排队等待下一次RDB传送。因此服务器等待一段时间以期更多的从站到达。
延迟时间以秒为单位,默认为5秒。要关掉这一功能,只需将它设置为0秒,传送会立即启动。
repl-diskless-sync-delay 5
从redis会周期性的向主redis发出PING包,你可以通过repl_ping_slave_period指令来控制其周期,默认是10秒。
# repl-ping-slave-period 10
接下来的选项为以下内容设置备份的超时时间:
①从从站的角度,同步期间的批量传输的I/O
②从站角度认为的主站超时(数据,ping)
③主站角度认为的从站超时(REPLCONF ACK pings)
确认这些值比定义的repl-ping-slave-period要大,否则每次主站和从站之间通信低速时都会被检测为超时。
# repl-timeout 60
同步之后是否禁用从站上的TCP_NODELAY。
如果你选择yes,redis会使用较少量的TCP包和带宽向从站发送数据。但这会导致在从站增加一点数据的延时。
Linux内核默认配置情况下最多40毫秒的延时。
如果选择no,从站的数据延时不会那么多,但备份需要的带宽相对较多。
默认情况下我们将潜在因素优化,但在高负载情况下或者在主从站都跳的情况下,把它切换为yes是个好主意。
repl-disable-tcp-nodelay no
设置备份的工作储备大小。
工作储备是一个缓冲区,当从站断开一段时间的情况时,它替从站接收存储数据,因此当从站重连时,通常不需要完全备份,只需要一个部分同步就可以,即把从站断开时错过的一部分数据接收。 工作储备越大,从站可以断开并稍后执行部分同步的断开时间就越长。只要有一个从站连接,就会立刻分配一个工作储备。
# repl-backlog-size 1mb
主站有一段时间没有与从站连接,对应的工作储备就会自动释放。这个选项用于配置释放前等待的秒数,秒数从断开的那一刻开始计算,值为0表示不释放。
# repl-backlog-ttl 3600
从站优先级是可以从redis的INFO命令输出中查到的一个整数。当主站不能正常工作时redis sentinel使用它来选择一个从站并将它提升为主站。
低优先级的从站被认为更适合于提升,因此如果有三个从站优先级分别是10,100,25,sentinel会选择优先级为10的从站,因为它的优先级最低。
然而优先级值为0的从站不能执行主站的角色,因此优先级为0的从站永远不会被redis sentinel提升。默认优先级是100。
slave-priority 100
主站可以停止接受写请求,当与它连接的从站少于N个,滞后少于M秒,N个从站必须是在线状态。
延迟的秒数必须<=所定义的值,延迟秒数是从最后一次收到的来自从站的ping开始计算。ping通常是每秒一次。
这一选项并不保证N个备份都会接受写请求,但是会限制在指定秒数内由于从站数量不够导致的写操作丢失的情况。
默认配置是想要至少3个从站且延迟少于10秒。
# min-slaves-to-write 3
# min-slaves-max-lag 10
Redis master能够以不同的方式列出所连接slave的地址和端口。
# slave-announce-ip 5.5.5.5
# slave-announce-port 1234
设置密码。
# requirepass "password"
命令重命名。可将某些认为是重要的命令重命名,若设置为空字符串就等于取消了这个命令。
# rename-command CONFIG ""
# rename-command FLUSHALL ""
# rename-command KEYS ""
设置客户端最大并发连接数,默认无限制。
Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数-32(redis server自身会使用一些),如果设置 maxclients为0 表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息。
# maxclients 10000
指定Redis最大内存限制。
Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区,格式:maxmemory 。
# maxmemory
当内存使用达到最大值时,redis使用的清除策略。
①volatile-lru 利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used )
②allkeys-lru 利用LRU算法移除任何key
③volatile-random 移除设置过过期时间的随机key
④allkeys-random 移除随机ke
⑤volatile-ttl 移除即将过期的key(minor TTL)
⑥noeviction noeviction 不移除任何key,只是返回一个写错误 ,默认选项。
maxmemory-policy volatile-lru
LRU 和 minimal TTL 算法都不是精准的算法,但是相对精确的算法(为了节省内存)每次进行淘汰的时候会随机抽取5个元素,从里面淘汰最不常用的(缺省配置)。
maxmemory-samples 5
是否使用使用AOF(Append Only File)的方式进行持久化。
appendonly no
AOF持久化保存文件名。
appendfilename "appendonly.aof"
AOF持久化策略的配置。
no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快。
always表示每次写入都执行fsync,以保证数据同步到磁盘。
everysec表示每秒执行一次fsync,可能会导致丢失这1s数据。
#appendfsync always
appendfsync everysec
#appendfsync no
在aof重写或者写入rdb文件的时候,会执行大量IO,此时对于everysec和always的aof模式来说,
执行fsync会造成阻塞过长时间,no-appendfsync-on-rewrite字段设置为默认设置为no。
如果对延迟要求很高的应用,这个字段可以设置为yes,否则还是设置为no,这样对持久化特性来说这是更安全的选择。
设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes。
Linux的默认fsync策略是30秒。可能丢失30秒数据。
no-appendfsync-on-rewrite no
aof自动重写配置,当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,即当aof文件增长到一定大小的时候,Redis能够调用bgrewriteaof对日志文件进行重写。
当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程。
设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写。
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 512mb
启动redis加载AOF文件时,是否自动修复AOF文件。
aof文件可能在尾部是不完整的,当redis启动的时候,aof文件的数据被载入内存。
重启可能发生在redis所在的主机操作系统宕机后,尤其在ext4文件系统没有加上data=ordered选项,出现这种现象,redis宕机或者异常终止不会造成尾部不完整现象,可以选择让redis退出,或者导入尽可能多的数据。
如果选择的是yes,当截断的aof文件被导入的时候,会自动发布一个log给客户端然后load。
aof-load-truncated yes
是否开启RDB-AOF混合持久化格式。
Redis 4.0 新增的一个可选的功能, 在开启了这个功能之后, AOF 重写产生的文件将同时包含 RDB 格式的内容和 AOF 格式的内容, 其中 RDB 格式的内容用于记录已有的数据, 而 AOF 格式的内存则用于记录最近发生了变化的数据, 这样 Redis 就可以同时兼有 RDB 持久化和 AOF 持久化的优点 —— 既能够快速地生成重写文件, 也能够在出现问题时, 快速地载入数据。
aof-use-rdb-preamble no
Lua脚本执行如果达到最大时间限制(毫秒),redis会记个log,然后返回error。当一个脚本超过了最大时限。
只有SCRIPT KILL和SHUTDOWN NOSAVE可以用。第一个可以杀没有调write命令的东西。
要是已经调用了write,只能用第二个命令杀。
lua-time-limit 5000
集群开关,默认是不开启集群模式。
# cluster-enabled yes
集群配置文件名称。每个节点都有一个集群相关的配置文件,持久化保存集群的信息。
这个文件并不需要手动配置,这个配置文件有Redis生成并更新,每个Redis集群节点需要一个单独的配置文件
请确保与实例运行的系统中配置文件名称不冲突。
# cluster-config-file nodes-6379.conf
节点互连超时的阀值,集群节点超时毫秒数。
# cluster-node-timeout 15000
在进行故障转移的时候,全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间了,导致数据过于陈旧,这样的slave不应该被提升为master。该参数就是用来判断slave节点与master断线的时间是否过长。
判断方法是:
比较slave断开连接的时间和(node-timeout * slave-validity-factor) + repl-ping-slave-period
如果节点超时时间为三十秒, 并且slave-validity-factor为10,假设默认的repl-ping-slave-period是10秒,即如果超过310秒slave将不会尝试进行故障转移。
# cluster-slave-validity-factor 10
master的slave数量大于该值,slave才能迁移到其他孤立master上,如这个参数若被设为2,那么只有当一个主节点拥有2 个可工作的从节点时,它的一个从节点会尝试迁移。
# cluster-migration-barrier 1
默认情况下,集群全部的slot有节点负责,集群状态才为ok,才能提供服务。
设置为no,可以在slot没有全部分配的时候提供服务。
不建议打开该配置,这样会造成分区的时候,小分区的master一直在接受写请求,而造成很长时间数据不一致。
cluster-require-full-coverage yes
slow log是用来记录redis运行中执行比较慢的命令耗时。
当命令的执行超过了指定时间,就记录在slow log中,slog log保存在内存中,所以没有IO操作。
执行时间比slowlog-log-slower-than大的请求记录到slowlog里面,单位是微秒,所以1000000就是1秒。
注意,负数时间会禁用慢查询日志,而0则会强制记录所有命令。
slowlog-log-slower-than 10000
慢查询日志长度。当一个新的命令被写进日志的时候,最老的那个记录会被删掉,这个长度没有限制。
只要有足够的内存就行,你可以通过 SLOWLOG RESET 来释放内存。
slowlog-max-len 128
延迟监控功能是用来监控redis中执行比较缓慢的一些操作,用LATENCY打印redis实例在跑命令时的耗时图表。
只记录大于等于下边设置的值的操作,0的话,就是关闭监视。
默认延迟监控功能是关闭的,如果你需要打开,也可以通过CONFIG SET命令动态设置。
latency-monitor-threshold 0
键空间通知使得客户端可以通过订阅频道或模式,来接收那些以某种方式改动了 Redis 数据集的事件。因为开启键空间通知功能需要消耗一些 CPU ,所以在默认配置下,该功能处于关闭状态。
字符 | 发送的通知 |
---|---|
K | 键空间通知,所有通知以__keyspace@__:expired为前缀 |
E | 键事件通知,所有通知以__keyevent@__:expired为前缀 |
g | del、exprire、rename等类型无关的通用命令的通知 |
$ | 字符串命令的通知 |
l | 列表命令的通知 |
s | 集合命令的通知 |
h | 哈希命令的通知 |
z | 有序集合命令的通知 |
x | 过期事件,每当有过期被删除时发送 |
e | 驱逐(evict)事件,每当有键因为maxmemory政策而被删除时发送 |
A | 参数g$lshzxe的别名 |
"notify-keyspace-events"的参数可以是以下字符的任意组合。
输入的参数中至少要有一个 K 或者E,否则的话,不管其余的参数是什么,都不会有任何 通知被分发。
notify-keyspace-events Ex
hash类型的数据结构在编码上可以使用ziplist和hashtable。
ziplist的特点就是文件存储(以及内存存储)所需的空间较小,在内容较小时,性能和hashtable几乎一样。
因此redis对hash类型默认采取ziplist。如果hash中条目的条目个数或者value长度达到阀值,将会被重构为hashtable。
这个参数指的是ziplist中允许存储的最大条目个数,,默认为512,建议为128。
hash-max-ziplist-entries 128
ziplist中允许条目value值最大字节数,默认为64,建议为1024。
hash-max-ziplist-value 1024
当取正值的时候,表示按照数据项个数来限定每个quicklist节点上的ziplist长度。比如,当这个参数配置成5的时候,表示每个quicklist节点的ziplist最多包含5个数据项。
当取负值的时候,表示按照占用字节数来限定每个quicklist节点上的ziplist长度。这时,它只能取-1到-5这五个值,每个值含义如下:
-5: 每个quicklist节点上的ziplist大小不能超过64 Kb。(注:1kb => 1024 bytes)
-4: 每个quicklist节点上的ziplist大小不能超过32 Kb。
-3: 每个quicklist节点上的ziplist大小不能超过16 Kb。
-2: 每个quicklist节点上的ziplist大小不能超过8 Kb。(-2是Redis给出的默认值)
-1: 每个quicklist节点上的ziplist大小不能超过4 Kb。
list-max-ziplist-size -2
这个参数表示一个quicklist两端不被压缩的节点个数。
注:这里的节点个数是指quicklist双向链表的节点个数,而不是指ziplist里面的数据项个数。
实际上,一个quicklist节点上的ziplist,如果被压缩,就是整体被压缩的。
参数list-compress-depth的取值含义如下:
0: 是个特殊值,表示都不压缩。这是Redis的默认值。
1: 表示quicklist两端各有1个节点不压缩,中间的节点压缩。
2: 表示quicklist两端各有2个节点不压缩,中间的节点压缩。
3: 表示quicklist两端各有3个节点不压缩,中间的节点压缩。
依此类推…
由于0是个特殊值,很容易看出quicklist的头节点和尾节点总是不被压缩的,以便于在表的两端进行快速存取。
list-compress-depth 0
数据量小于等于set-max-intset-entries用intset,大于set-max-intset-entries用set。
set-max-intset-entries 512
数据量小于等于zset-max-ziplist-entries用ziplist,大于zset-max-ziplist-entries用zset。
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
value大小小于等于hll-sparse-max-bytes使用稀疏数据结构(sparse)大于hll-sparse-max-bytes使用稠密的数据结构(dense),一个比16000大的value是几乎没用的,建议的value大概为3000。如果对CPU要求不高,对空间要求较高的,建议设置到10000左右。
hll-sparse-max-bytes 3000
Redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用。
当你的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。
如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存。
activerehashing yes
对客户端输出缓冲进行限制可以强迫那些不从服务器读取数据的客户端断开连接,用来强制关闭传输缓慢的客户端。对于normal client,第一个0表示取消hard limit,第二个0和第三个0表示取消soft limit,normal,client默认取消限制,因为如果没有寻问,他们是不会接收数据的。
client-output-buffer-limit normal 0 0 0
对于slave client和MONITER client,如果client-output-buffer一旦超过256mb,又或者超过64mb持续60秒,那么服务器就会立即断开客户端连接。
client-output-buffer-limit slave 256mb 64mb 60
对于pubsub client,如果client-output-buffer一旦超过32mb,又或者超过8mb持续60秒,那么服务器就会立即断开客户端连接。
client-output-buffer-limit pubsub 32mb 8mb 60
redis执行任务的频率为1s除以hz。
hz 10
在AOF重写的时候,如果打开了aof-rewrite-incremental-fsync开关,系统会每32MB执行一次fsync。
这对于把文件写入磁盘是有帮助的,可以避免过大的延迟峰值。
aof-rewrite-incremental-fsync yes