一、前言
了解一下redis 的配置文件。redis.conf 这个文件的是非常重要的,大多数配置我们不需要改动,最好维持原样,今天我们来详细解析下 redis6.0 的大部分参数设置,一起加深对 redis 的认识,看完之后,对 redis 也有了个大致的基本概念,本文篇幅较长,建议收藏备忘。
二、各参数解析
2.1 Units 单位
2.2 INCLUDES 包含
类似于 c语言的头文件,就是引入其他文件到配置中,然后按顺序解析配置,如果配置相同,就按后面解析的为准。
2.3 MODULES 模块
跟导入文件类似,这块是导入新增模块功能
2.4 NETWORK 网络
2.4.1 bind
默认的 bind = 127.0.0.1 意思是只能接收本机的访问请求
如果不写的情况下,就是无限制接受任何ip地址的访问。
2.4.2 protected-mode
开启该参数后,redis 只会本地进行访问,默认yes ,最好将本机访问保护模式设置 no
2.4.3 PORT
默认端口号6379
2.4.4 tcp-backlog
设置跟tcp 相关的参数,backlog 事实上是一个连接队列,backlog队列总和=未完成三次握手队列+已经完成三次握手队列
在高并发环境下,往往需要设置一个比较大的值来避免客户端连接慢的问题
注意Linux内核会将这个值减小到
/proc/sys/net/core/somaxconn的值(128),所以需要确认增大/proc/sys/net/core/somaxconn和/proc/sys/net/ipv4/tcp_max_syn_backlog(128)两个值来达到想要的效果
2.4.5 timeout
一个空闲的客户端维持多少秒会关闭,0 表示关闭该功能,就是永远不关闭。
2.4.6 tcp-keepalive
它是对访问客户端的一种心跳检测的配置,避免服务器一直阻塞,每隔 n 秒 检测一次,如果设置为0,则不检测。
2.5 GENERAL 通用
2.5.1 daemonize
需要设置为yes,允许redis 以守护线程的形式在后台启动。
2.5.2 pidfile
存放 pid 文件的位置,每个实例会产生一个不同的 pid 文件。是 redis的 进程文件
2.5.3 loglevel
指定记录日志的级别,包含四层级别:
- debug:很多信息,方便那开发、测试
- vervose:许多有用信息,但是没有debug级别信息多
- notice:适当的日志级别,适合生产环境
- warn :只有非常重要的信息
通常生产环境选择 notice 或warn。
2.5.4 logfile
日志文件名称,空字符串的化,日志会打印到标准输出设备,后台运行的redis标准输出是
/dev/null logfile /usr/local/redis/var/redis.log
2.5.5 database 16
设定库的数量 默认16个,从0开始,通过 select 来指定数据库id
2.6 SNAPSHOTTING 快照
这里的配置主要用来做持久化操作
2.6.1 save
配置 redis 的持久化条件,即在什么条件下把内存的数据保存到磁盘上。当然,如果你不想开启这个功能,就通过空字符串来停用。
save 900 1:表示900 秒内如果至少有 1 个 key 的值变化,则保存
save 300 10:表示300 秒内如果至少有 10 个 key 的值变化,则保存
save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存
2.6.2 stop-writes-on-bgsave-error
当 RDB 持久化出现错误后,是否依然进行继续工作,可与通过 info 命令的 rdb_last_bgsave_status 来了解 RDB 持久化是否有错误
- yes :不能进行工作
- no : 可与进行工作
2.6.3 rdbcompression
对于存储到磁盘中的快照,可与设置是否进行压缩存储,如果是的话,会采用 LZF 算法进行压缩,但会消耗部分 CPU,但这是值得的,不然快照会比较大。
2.6.4 rdbchecksum
默认是yes ,在存储快照后,可与让 redis 使用 CRC64 算法来进行数据校验,但是这样做会增加大约 10% 的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。
2.6.5 dbfilename
设置快照的名称,默认是 dum.rdb
2.6.6 dir
设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。使用上面的 dbfilename 作为保存的文件名
2.7 REPLICATION 复制
2.7.1 slave-serve-stale-data
默认值为 yes ,当 一个 从库 与 主库失去联系,或者复制正在进行时的时候,slave 可能会有两种表现:
- 如果为 yes, slave 仍然会应答客户端请求,但返回的数据可能是过时,或者可能为空
- 如果为 no,除非你执行 info he salveof 命令,否则都返回 SYNC with master in progress 错误
2.7.2 slave-read-only
配置 redis 的slave 实例是否接受写操作,即 Slave 是否为只读 Redis,默认值为yes
2.7.3 repl-diskless-sync
主从复制是否使用无硬盘复制功能。默认是no
2.7.4 repl-diskless-sync-delay
当启用无硬盘备份,服务器等待一段时间后才会通过套接字向从站发送 RDB 文件,复制的延迟时间,所以最好等待一段时间,等更多的slave 连上来,一旦复制过程开始,就不会接收 slave 的复制请求了。
2.7.5 repl-disable-tcp-nodelay
是否禁止复制tcp 连接的 tcp nodelay 参数,在数据量传输很大的场景下,建议选择 yes
2.8 SECURITY 安全
2.8.1 设置密码
2.8.2 重命名
对于一些危险的命令修改成其他的名称,使得服务器更加安全。一些危险命令如下:
- 1、flushdb (清空数据库)
- 2、flushall(清空所有记录)
- 3、config (客户端连接后可配置服务器)
- 4、keys (客户端连接后可查看所有存在的键)
2.9 CLIENT 客户端
2.9.1 maxclients
客户端最大并发连接数,默认无限制,Redis 可以同时打开的客户端连接数,如果设置为0 就不做限制,当客户端连接数达到限制时,会返回 max number of clients reached 错误信息。
2.10 MEMORY MANAGEMENT 内存配置
2.10.1 maxmemory
设置 Redis 的最大内存,如果设置为0,表示不做限制,通常是配合下面介绍的maxmemory-policy 参数一起使用
2.10.2 maxmemory-policy
配置最大内存策略,当内存使用达到 maxmemory 设置的最大值时,redis 使用的内存清除策略,有以下几种可以选择:
- volatile-lru 利用LRU算法移除设置过过期时间的key (LRU:最近最少使用 Least Recently Used )
- allkeys-lru 利用LRU算法移除任何key
- volatile-lfu 利用LFU算法移除设置过过期时间的key (LFU:最近最不频繁使用的key )
- allkeys-lfu 利用LFU算法移除任何key
- volatile-random 移除设置过过期时间的随机key
- allkeys-random 移除随机key
- volatile-ttl 移除即将过期的key(minor TTL)
- noeviction noeviction 不移除任何key,只是返回一个写错误 ,默认选项
2.10.3 maxmemory-samples
设置 LRU TTL 算法检查的样本数
2.11 LAZY FREEING 懒释放
以非阻塞方式释放内存,使用以下配置指令调用了
2.12 APPEND ONLY MODE 添加方式
2.12.1 appendonly
默认 redis 使用的是 rdb方式持久化,如果要开启 rdb 方式 持久化,就将该命令设置为 yes
2.12.2 appendfilename
aof 存储的文件名
2.12.3 appendfsync
aof持久化策略的配置;
- no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快;
- always表示每次写入都执行fsync,以保证数据同步到磁盘;
- everysec表示每秒执行一次fsync,可能会导致丢失这1s数据
2.12.4 no-appendfsync-on-rewrite
在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。
2.12.5 auto-aof-rewrite-percentage
默认值为100。aof自动重写配置,当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,即当aof文件增长到一定大小的时候,Redis能够调用bgrewriteaof对日志文件进行重写。当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程。
2.12.6 auto-aof-rewrite-min-size:
64mb。设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写。
2.12.7 aof-load-truncated
aof文件可能在尾部是不完整的,当redis启动的时候,aof文件的数据被载入内存。重启可能发生在redis所在的主机操作系统宕机后,尤其在ext4文件系统没有加上data=ordered选项,出现这种现象 redis宕机或者异常终止不会造成尾部不完整现象,可以选择让redis退出,或者导入尽可能多的数据。如果选择的是yes,当截断的aof文件被导入的时候,会自动发布一个log给客户端然后load。如果是no,用户必须手动redis-check-aof修复AOF文件才可以。默认值为 yes。
2.12.8 aof-use-rdb-preamble
加载redis时,可以识别AOF文件以“redis”开头。 字符串并加载带前缀的RDB文件,然后继续加载AOF尾巴
2.13 LUA SCRIPTING LUA 脚本
lua-time-limit : 一个lua 脚本执行的最大时间,单位ms,默认值为5000
2.14 REDIS CLUSTER
2.14.1 cluster-enabled
集群开关,默认是不开启集群模式。
2.14.2 cluster-config-file
每一个集群节点都有一个配置文件,持久化的保存集群的信息,这个文件是由 redis 生成并更新的,每个Redis 集群节点需要一个单独的配置文件,请确保与实例运行的系统中配置文件名称不冲突。
2.14.3 cluster-node-timeout
节点互连超时的阈值。集群节点超时毫秒数。
2.14.4 cluster-replica-validity-factor
在主从模式中,主机挂掉了,所有的从机 都会请求申请为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将不会尝试进行故障转移
2.14.5 cluster-migration-barrier
master的slave数量大于该值,slave才能迁移到其他孤立master上,如这个参数若被设为2,那么只有当一个主节点拥有2 个可工作的从节点时,它的一个从节点会尝试迁移.
2.14.6 cluster-require-full-coverage
默认情况下,集群全部的slot有节点负责,集群状态才为ok,才能提供服务。 设置为no,可以在slot没有全部分配的时候提供服务。 不建议打开该配置,这样会造成分区的时候,小分区的master一直在接受写请求,而造成很长时间数据不一致
2.14.7 cluster-replica-no-failover
当设置为“是”时,此选项将阻止复制程序尝试故障转移。主设备故障时的主设备。但是,仍然可以执行手动故障切换(如果强制执行)。
2.15 CLUSTER DOCKER/NAT support
在某些部署中,Redis集群节点地址发现失败,因为地址被NAT-ted或者因为端口被转发(典型的情况是docker和其他容器)。
#*群集公告IP
#*群集公告端口
#*群集公告总线端口
# Example:
# cluster-announce-ip 10.1.1.5
# cluster-announce-port 6379
# cluster-announce-bus-port 6380
2.16 SLOW LOG
慢日志 用来记录 redis 运行中执行比较慢的命令。
当命令的执行时间超过了指定时间,就记录到slow log 中,该日志保存在内存 中,所以没有 io操作。
2.16.1 slowlog-log-slower-than
默认单位是微秒,负数时间会禁用慢查询日志,而 0 则会强制记录所有命令
2.16.2 slowlog-max-len
慢查询日志长度,当一个新的命令被写进日志的时候,最老的那条记录会被删除,这个长度没有限制,只要有足够的内存就行,可以通过 SLOWLOG RESET 来释放内存
2.17 LATENCY MONITOR
延迟监控功能是用来监控 redis 中执行比较缓慢的一些操作,用 LATENCY 打印 redis 实例 在跑命令时的耗时图表。
只记录大于等于设置的值的操作,0的话就是关闭监控,默认是关闭的,可以通过 CONFIG SET 命令动态设置
2.18 EVENT NOTIFICATION
键空间通知使得客户端可以通过订阅频道或模式,来接收那些以某种方式改动了 Redis 数据集的事件。因为开启键空间通知功能需要消耗一些 CPU ,所以在默认配置下,该功能处于关闭状态。
notify-keyspace-events 可以是下面字符的任意组合,指定了服务器该发送哪些类型的通知,输入的参数至少有一个 K 或者E,否则不会发送。
K Keyspace事件,以“\u Keyspace@<db>”前缀发布。
E Keyevent事件,以“\u Keyevent@<db>”前缀发布。
g 通用命令(非特定类型),如DEL、EXPIRE、RENAME等。。。
$ String命令
l 列出命令
s 设置命令
h 哈希命令
z 排序集命令
x 过期事件(每次密钥过期时生成的事件)
e 逐出事件(逐出maxmemory的键时生成的事件)
t 流命令
m 键未命中事件(注:不包括在“A”类中)
A g$lshzxet的别名,因此“AKE”字符串表示所有事件(因其特殊性而被排除在“A”之外的关键未命中事件除外)独特的性质)。
2.19 ADVANCED CONFIG 高级配置
2.19.1 hash-max-ziplist
这个参数来决定 hash的内部编码类型是 hashtable 还是 ziplist,ziplist 的最大优势就是存储的时候是连续的内存,可以极大的提升 CPU的缓存命中率,使用 object encoding 键 来查看所存数据的内部编码类型。
数据量小于等于 hash-max-ziplist-entries 的用 ziplist,大于 hash-max-ziplist-entries 用 hash
value 大小小于等于 hash-max-ziplist-value 的用 ziplist ,大于的用hash
2.19.2 list-max-ziplist-size
取正值表示按照数据项个数来限定每个quicklist节点上的ziplist长度。例如,当该参数配置为5时,每个quicklist节点的ziplist最多包含5个数据项。
取负值表示按照占用字节数来限定每个quicklist节点上的ziplist长度。此时,该值只能取-1到-5这五个值,每个值含义如下。
-5:每个quicklist节点上的ziplist大小不能超过64Kb(注:1kb = 1024 bytes);
-4:每个quicklist节点上的ziplist大小不能超过32Kb;
-3:每个quicklist节点上的ziplist大小不能超过16Kb;
-2:每个quicklist节点上的ziplist大小不能超过8Kb(Redis默认值);
-1:每个quicklist节点上的ziplist大小不能超过4 Kb。
2.19.3 list-compress-depth
列表上两端不被压缩的节点个数:
- 0为特殊值(Redis的默认值),表示都不压缩;
- 1表示list两端各有1个节点不压缩,中间的节点压缩;
- 2表示list两端各有2个节点不压缩,中间的节点压缩;
- 3表示list两端各有3个节点不压缩,中间的节点压缩;
- 其后依此类推。
2.19.4 set-max-intset-entries
当Set集合内的数据符合以下条件时,会使用intset编码:
- 当集合内所有数据都是字符对象;
- 都是基数为10的整数,范围为64位有符号整数。
2.19.5 zset-max-ziplist
排序集合对象同时满足以下两个条件时, 使用ziplist编码
- 排序集合对象保存的所有键值对的键和值的字符串长度的字节数都小于zset-max-ziplist-value的值;
- 排序集合对象保存的键值对数量小于zset-max-ziplist-entries的值。
2.19.6 hll-sparse-max-bytes
hyperLoglog 的编码设置,如果value 大小小于等于 hll-sparse-max-bytes 使用稀疏数据结构 (sparse),大于 hll-sparse-max-bytes 使用稠密的数据结构 dense。
一个比 16000 大 的value是几乎没有用的,建议的 value大概为3000,如果对 cpu要求不高,对空间要求比较高,建议设置到10000 左右。
2.19.7 stream-node-max
流宏节点最大大小。流数据结构是一个基数对内部多个项目进行编码的大节点树。 使用此配置可以配置单个节点的字节大小,以及附加新流条目时,它在切换到新节点之前可能包含的最大项目数。 如果以下任何设置设置为零,则忽略限制, 因此可以仅设置一个通过将max bytes设置为0,max entries设置为所需的值来限制max entires 的值。
2.19.8 activerehashing
Redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用。当你 的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置 为no。如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存
2.19.9 client-output-buffer-limit
对客户端输出缓冲进行限制可以强迫那些不从服务器获取数据的客户端断开连接,用来强制关闭传输缓慢的客户端。
normal :第一个 0 表示取消 hard limit;第二个 0 和第三个 0 表示取消 soft limit ,normal client 的默认取消限制
replica : 对于从机 和监控机 ,如果 client-output-buffer 一旦超过256 mb,又或者超过 64mb 持续60s,服务器将断开客户端连接。
pubsub :对于发布客户端,如果 client-output-buffer 超过32 mb,又或者超过8 mb 持续 60 s,那么服务器将断开客户端连接。
# 这是客户端查询的缓存极限值大小
# client-query-buffer-limit 1gb
2.19.10 hz
redis 执行任务的频率为 ls 除以 hz
当启用动态 HZ 时,实际配置的 HZ 将作为基线,但实际配置的 HZ 值的倍数在连接更多客户端后根据需要使用。
这样一个闲置的实例将占用很少的CPU时间,而繁忙的实例将反应更灵敏。
2.19.11 aof-rewrite-incremental-fsync
在aof重写的时候,如果打开了
aof-rewrite-incremental-fsync开关,系统会每32MB执行一次fsync。
这对于把文件写入磁盘是有帮助的,可以避免过大的延迟峰值
2.19.12 rdb-save-incremental-fsync
rdb保存的时候,如果打开了
rdb-save-incremental-fsync 开关,系统会每32MB执行一次fsync。
这对于把文件写入磁盘是有帮助的,可以避免过大的延迟峰值
2.20 ACTIVE DEFRAGMENTATION 碎片整理
激活 碎片整理允许 Redis 服务器压缩内存中数据的小分配和释放之间的剩余空间,从而允许回收内存。
碎片率达到多少时进行清除,可以使用 config get的方式查询,和config set 的方式在运行时设置。
至此,redis 6.0.18 的大部分配置已经讲解结束。
</article>