redis数据库的配置文件redis.conf详解

  • redis数据库的配置文件redis.conf详解
  • redis.cong配置详细解析
  • INCLUDES
  • MODULES
  • NETWORK
  • TLS/SSL
  • GENERAL
  • SNAPSHOTTING
  • REPLICATION
  • KEYS TRACKING 键的追踪
  • SECURITY 安全
  • CLIENTS 客户端
  • 内存管理
  • LAZY FREEING 惰性释放
  • THREADED I/O 线程IO
  • KERNEL OOM CONTROL 内核OOM控制
  • APPEND ONLY MODE AOF模式
  • LUA SCRIPTING Lua脚本
  • REDIS CLUSTER Redis集群
  • CLUSTER DOCKER/NAT support docker集群/NAT支持
  • SLOW LOG 延迟监控
  • LATENCY MONITOR 事件通知
  • GOPHER SERVER gopher服务
  • ADVANCED CONFIG 高级配置
  • ACTIVE DEFRAGMENTATION 活跃的碎片整理


redis数据库的配置文件redis.conf详解

redis数据的启动方式一般都要加上配置文件的路径的,如下:

[root@yueapp redis]# ./bin/redis-server  ./redis-6.0.8/redis.conf

在参考网上很多解释后,我对其中的重要参数做了详细的整理,以免其中有些会理解错误。

redis.cong配置详细解析

###开头说明

# Redis configuration file example.
#
# Note that in order to read the configuration file, Redis must be
# started with the file path as first argument:
#
# ./redis-server /path/to/redis.conf
# 当你需要为某个配置项指定内存大小的时候,必须要带上单位,
# 通常的格式就是 1k 5gb 4m 等酱紫:
#
# 1k  => 1000 bytes
# 1kb => 1024 bytes
# 1m  => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g  => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#
# 单位是不区分大小写的,你写 1K 5GB 4M 也行

这里没什么好说的,需要注意的是后面需要使用内存大小时,可以指定单位,通常是以 k,gb,m的形式出现,并且单位不区分大小写。

INCLUDES

**include:**这个的意思就是可以多加载其他的配置,实现个性化配置。默认:空
我们知道Redis只有一个配置文件,如果多个人进行开发维护,那么就需要多个这样的配置文件,这时候多个配置文件就可以在此通过 include /path/to/local.conf 配置进来,而原本的 redis.conf 配置文件就作为一个总闸。另外需要注意的时,如果将此配置写在redis.conf 文件的开头,那么后面的配置会覆盖引入文件的配置,如果想以引入文件的配置为主,那么需要将 include 配置写在 redis.conf 文件的末尾。

################################## INCLUDES ###################################
 
# 假如说你有一个可用于所有的 redis server 的标准配置模板,
# 但针对某些 server 又需要一些个性化的设置,
# 你可以使用 include 来包含一些其他的配置文件,这对你来说是非常有用的。
#
# 但是要注意哦,include 是不能被 config rewrite 命令改写的
# 由于 redis 总是以最后的加工线作为一个配置指令值,所以你最好是把 include 放在这个文件的最前面,
# 以避免在运行时覆盖配置的改变,相反,你就把它放在后面(外国人真啰嗦)。
#
# include /path/to/local.conf
# include /path/to/other.conf

MODULES

**loadmodule:**在redis 4.0以上,redis支持了可扩展了module,让用户可以自己根据需求自己扩展redis相关的功能了。启动时加载模块,如果server无法加载模块,则此配置会被忽略。可以使用多个loadmodule。

################################## MODULES #####################################

# Load modules at startup. If the server is not able to load modules
# it will abort. It is possible to use multiple loadmodule directives.
#
# loadmodule /path/to/my_module.so
# loadmodule /path/to/other_module.so

NETWORK

  1. **bind:**是绑定本机的IP地址,(准确的是:本机的网卡对应的IP地址,每一个网卡都有一个IP地址),而不是redis允许来自其他计算机的IP地址。如果指定了bind,则说明只允许来自指定网卡的Redis请求。如果没有指定,就说明可以接受来自任意一个网卡的Redis请求。
    举个例子:如果redis服务器(本机)上有两个网卡,每一个网卡对应一个IP地址,例如IP1和IP2。(注意这个IP1和IP2都是本机的IP地址)。
    我们的配置文件:bind IP1。 只有我们通过IP1来访问redis服务器,才允许连接Redis服务器,如果我们通过IP2来访问Redis服务器,就会连不上Redis。而且如果设置成其他IP的话,redis的服务也不能启动起来。
# 默认情况下,redis 在 server 上所有有效的网络接口上监听客户端连接。
 # 你如果只想让它在一个网络接口上监听,那你就绑定一个IP或者多个IP。
 #
 # 示例,多个IP用空格隔开:
 #
 # bind 192.168.1.100 10.0.0.1
 # bind 127.0.0.1
  1. **protected-mode:**保护模式,该模式控制外部网是否可以连接redis服务,默认是yes,所以默认我们外网是无法访问的,如需外网连接rendis服务则需要将此属性改为no。redis本身无法限制【只有指定主机】连接到redis中,就像上面写的一样,bind指定只是用来设置接口地址(interfaces) 默认是:yes
    如果你的bind设置为:bind 127.0.0.1,这是非常安全的,因为只有本台主机可以连接到redis,就算不设置密码,也是安全的,除非有人登入到你的服务器上。
    如果你的bind设置为:bind 0.0.0.0,表示所有主机都可以连接到redis。(前提:你的服务器必须开放redis的端口)。这时设置密码,就会多一层保护,只有知道密码的才可以访问。也就是任何知道密码的主机都可以访问到你的redis。
# Protected mode is a layer of security protection, in order to avoid that
 # Redis instances left open on the internet are accessed and exploited.
 #
 # When protected mode is on and if:
 #
 # 1) The server is not binding explicitly to a set of addresses using the
 #    "bind" directive.
 # 2) No password is configured.
 #
 # The server only accepts connections from clients connecting from the
 # IPv4 and IPv6 loopback addresses 127.0.0.1 and ::1, and from Unix domain
 # sockets.
 #
 # By default protected mode is enabled. You should disable it only if
 # you are sure you want clients from other hosts to connect to Redis
 # even if no authentication is configured, nor a specific set of interfaces
 # are explicitly listed using the "bind" directive.
  1. port: 指定 Redis 监听端口,默认端口为 6379 .默认:6379
# Accept connections on the specified port, default is 6379 (IANA #815344).
 # If port 0 is specified Redis will not listen on a TCP socket.
  1. **tcp-backlog:**设置tcp的backlog,backlog是一个连接队列,backlog队列总和=未完成三次握手队列+已完成三次握手队列。在高并发环境下你需要一个高backlog值来避免慢客户端连接问题。注意Linux内核会将这个值减小到/proc/sys/net/core/somaxconn 的值,所以需要确认增大somaxconn和tcp_ max_syn_backlog两个值来达到想要的。
    建议修改为 2048,修改somaxconn,该内核参数默认值一般是128,对于负载很大的服务程序来说大大的不够。一般会将它修改为2048或者更大。
    echo 2048 > /proc/sys/net/core/somaxconn 但是这样系统重启后保存不了
    在/etc/sysctl.conf中添加如下
    net.core.somaxconn = 2048
    然后在终端中执行sysctl -p
# TCP listen() backlog.
 #
 # In high requests-per-second environments you need an high backlog in order
 # to avoid slow clients connections issues. Note that the Linux kernel
 # will silently truncate it to the value of /proc/sys/net/core/somaxconn so
 # make sure to raise both the value of somaxconn and tcp_max_syn_backlog
 # in order to get the desired effect.
 tcp-backlog 511
  1. **timeout:**客户端闲置多少秒后,断开连接,默认为0。(0代表禁用,永不关闭)一般设置300秒
# Close the connection after a client is idle for N seconds (0 to disable)
 timeout 0
  1. **tcp-keepalive:**设置检测客户端网络中断时间间隔,单位为秒,如果设置为0,则不检测,建议设置为300,使用keepalive有两个好处:检测挂掉的对端。降低中间设备出问题而导致网络看似连接却已经与对端端口的问题。在Linux内核中,设置了keepalive,redis会定时给对端发送ack。检测到对端关闭需要两倍的设置值。
# tcp 心跳包。
 #
 # 如果设置为非零,则在与客户端缺乏通讯的时候使用 SO_KEEPALIVE 发送 tcp acks 给客户端。
 # 这个之所有有用,主要由两个原因:
 #
 # 1) 防止死的 peers
 # 2) Take the connection alive from the point of view of network
 #    equipment in the middle.
 #
 # On Linux, the specified value (in seconds) is the period used to send ACKs.
 # Note that to close the connection the double of the time is needed.
 # On other kernels the period depends on the kernel configuration.
 #
 # A reasonable value for this option is 300 seconds.
 # 推荐一个合理的值就是300秒
 tcp-keepalive 0

TLS/SSL

TLS/SSL 加密等方面

################################# 套接字安全 #####################################

这部分都是SSL相关的配置,默认不开启SSL,读者有兴趣自己了解一下
# port 0
# tls-port 6379
# tls-cert-file redis.crt
# tls-key-file redis.key
# tls-dh-params-file redis.dh
# tls-ca-cert-file ca.crt
# tls-ca-cert-dir /etc/ssl/certs
# tls-auth-clients no
# tls-replication yes
# tls-cluster yes
# tls-protocols "TLSv1.2 TLSv1.3"
# tls-ciphers DEFAULT:!MEDIUM
# tls-ciphersuites TLS_CHACHA20_POLY1305_SHA256
# tls-prefer-server-ciphers yes
# tls-session-cache-timeout 60
# tls-session-cache-size 5000
# tls-session-caching no
# tls-prefer-server-ciphers yes

GENERAL

  1. daemonize: 是否在后台执行,yes:后台运行;no:不是后台运行(老版本默认)默认情况下 redis 不是作为守护进程运行的,当redis作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件里面。 默认建议配置yes
  2. **supervised:**可以通过upstart和systemd管理Redis守护进程,这个参数是和具体的操作系统相关的,它可以
    配置的值有:no、upstart、systemd或auto。默认是 no
# If you run Redis from upstart or systemd, Redis can interact with your
 # supervision tree. Options:
 #   supervised no      - no supervision interaction
 #   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
 #   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
 #   supervised auto    - detect upstart or systemd method based on
 #                        UPSTART_JOB or NOTIFY_SOCKET environment variables
 # Note: these supervision methods only signal "process is ready."
 #       They do not enable continuous liveness pings back to your supervisor.
  1. **pidfile:**如以后台进程运行,则需指定一个pid,默认为/var/run/redis.pid
# If a pid file is specified, Redis writes it where specified at startup
 # and removes it at exit.
 #
 # When the server runs non daemonized, no pid file is created if none is
 # specified in the configuration. When the server is daemonized, the pid file
 # is used even if not specified, defaulting to "/var/run/redis.pid".
 #
 # Creating a pid file is best effort: if Redis is not able to create it
 # nothing bad happens, the server will start and run normally.
  1. **loglevel:**指定服务器调试等级,级别包括:debug(很多信息,方便开发、测试),verbose(许多有用的信息,但是没有debug级别信息多),notice(适当的日志级别,适合生产环境),warn(只有非常重要的信息) 默认是 notice
  2. logfile: 指定了记录日志的文件。空字符串的话,日志会打印到标准输出设备。后台运行的redis标准输出是/dev/null。可以设置成/var/log/redis/redis-server.log
  3. syslog-enabled no: 是否打开记录syslog功能,默认是注释关闭
# To enable logging to the system logger, just set 'syslog-enabled' to yes,
 # and optionally update the other syslog parameters to suit your needs.
 # syslog-enabled no
  1. syslog-ident redis: syslog的标识符,默认是注释关闭.
# Specify the syslog identity.
 # syslog-ident redis
  1. **syslog-facility local0:**日志的来源、设备,默认是注释关闭.
# Specify the syslog facility. Must be USER or between LOCAL0-LOCAL7.
 # syslog-facility local0
  1. databases 16: 设置数据库数量,默认值为16,默认当前数据库为0,可以使用select < dbid > 命令在连接上指定数据库id:
# Set the number of databases. The default database is DB 0, you can select
 # a different one on a per-connection basis using SELECT <dbid> where
 # dbid is a number between 0 and 'databases'-1
 databases 16
  1. always-show-logo: 是否展示ASCII码logo,默认yes
# By default Redis shows an ASCII art logo only when started to log to the
# standard output and if the standard output is a TTY. Basically this means
# that normally a logo is displayed only in interactive sessions.
#
# However it is possible to force the pre-4.0 behavior and always show a
# ASCII art logo in startup logs by setting the following option to yes.

SNAPSHOTTING

这里的配置主要用来做持久化操作。

  1. save 900 1
    save 300 10
    save 60 10000: 多少秒保存数据到磁盘,格式是:save 。意思是至少有changes条key数据被改变时,
    seconds秒保存到磁盘。
# 注释掉“save”这一行配置项就可以让保存数据库功能失效
 # 设置redis进行数据库镜像的频率。
 # 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化) 
 # 300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化) 
 # 60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化)
 #  通过添加一条带空字符串参数的save指令也能移除之前所有配置的save指令
 #  像下面的例子:
 #  save ""
  1. stop-writes-on-bgsave-error: 默认情况下,如果 redis 最后一次的后台保存失败,redis 将停止接受写操作,这样以一种强硬的方式让用户知道数据不能正确的持久化到磁盘, 否则就会没人注意到灾难的发生。 如果后台保存进程重新启动工作了,redis 也将自动的允许写操作。默认值是yes.当RDB持久化出现错误后,是否依然进行继续进行工作,yes:不能进行工作,no:可以继续进行工作,可以通过info中的rdb_ last_ bgsave_status了解RDB持久化是否有错误.
  2. rdbcompression: 使用压缩rdb文件,rdb文件压缩使用LZF压缩算法,yes:压缩,但是需要一些cpu的消耗。no:不压缩,需要更多的磁盘空间.当dump rdb数据库的时候,要不要进行压缩,如果你想节约CPU资源,可以设置为no,但那样的话,rdb数据
    集将很大。默认是yes。
  3. rdbchecksum: 从Redis5之后,一个CRC64校验和就被存在rdb文件的尾部,校验可以确认rdb文件的完整性,但是它会占用10%左右的保存或加载rdb文件的资源,如果你为了让性能最大化,你可以设置为no,默认是yes。
  4. dbfilename: 设置快照的文件名,默认是 dump.rdb
  5. rdb-del-sync-files:在没有持久性的情况下删除复制中使用的RDB文件,通常情况下保持默认即可。 默认 no
  6. dir: 设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。使用上面的 dbfilename 作为保存的文件名,rdb、aof文件也会写在这个目录。默认是 ./

REPLICATION

设置主从复制同步的相关功能

  1. replicaof: 如果当前服务器为slave从库,那么这里配置的就是master的ip和端口,< masterip> < masterport>如:192.168.1.2 6379
# Master-Replica replication. Use replicaof to make a Redis instance a copy of
 # another Redis server. A few things to understand ASAP about Redis replication.
 #
 #   +------------------+      +---------------+
 #   |      Master      | ---> |    Replica    |
 #   | (receive writes) |      |  (exact copy) |
 #   +------------------+      +---------------+
 #
 # 1) Redis replication is asynchronous, but you can configure a master to
 #    stop accepting writes if it appears to be not connected with at least
 #    a given number of replicas.
 # 2) Redis replicas are able to perform a partial resynchronization with the
 #    master if the replication link is lost for a relatively small amount of
 #    time. You may want to configure the replication backlog size (see the next
 #    sections of this file) with a sensible value depending on your needs.
 # 3) Replication is automatic and does not need user intervention. After a
 #    network partition replicas automatically try to reconnect to masters
 #    and resynchronize with them.
 #
 # replicaof <masterip> <masterport>
  1. masterauth: 如果当前服务器为slave,那么这里配置的就是master的访问密码。masterauth
# If the master is password protected (using the "requirepass" configuration
 # directive below) it is possible to tell the replica to authenticate before
 # starting the replication synchronization process, otherwise the master will
 # refuse the replica request.
  1. masteruser: 如果当前服务器为slave,那么这里配置的就是master的用户名
  2. replica-serve-stale-data: 当slave失去与master的连接,或正在拷贝中,如果为yes,slave会响应客户端的请求,
    数据可能不同步甚至没有数据,如果为no,slave会返回错误"SYNC with master in progress".默认是yes
  3. replica-read-only: 如果当前服务器为slave,这里配置slave是否只读,默认为yes,如果为no的话,就是可读可写。
  4. repl-diskless-sync: 主从数据复制是否使用无硬盘复制功能。默认值为no。新的从站和重连后不能继续备份的从站,需要做所谓的“完全备份”,即将一个RDB文件从主站传送到从站。
    这个传送有以下两种方式:
    1.硬盘备份:redis主站创建一个新的进程,用于把RDB文件写到硬盘上。过一会儿,其父进程递增地将文件传送给从站。
    2.无硬盘备份:redis主站创建一个新的进程,子进程直接把RDB文件写到从站的套接字,不需要用到硬盘。
    在硬盘备份的情况下,主站的子进程生成RDB文件。一旦生成,多个从站可以立即排成队列使用主站的RDB文件。
    在无硬盘备份的情况下,一次RDB传送开始,新的从站到达后,需要等待现在的传送结束,才能开启新的传送。
    如果使用无硬盘备份,主站会在开始传送之间等待一段时间(可配置,以秒为单位),希望等待多个子站到达后并行传送。
    在硬盘低速而网络高速(高带宽)情况下,无硬盘备份更好。
  5. repl-diskless-sync-delay: 当启用无硬盘备份,服务器等待一段时间后才会通过套接字向从站传送RDB文件,这个等待时间是可配置的。 这一点很重要,因为一旦传送开始,就不可能再为一个新到达的从站服务。从站则要排队等待下一次RDB传送。因此服务器等待一段 时间以期更多的从站到达。延迟时间以秒为单位,默认为5秒。要关掉这一功能,只需将它设置为0秒,传送会立即启动。默认值为5。
  6. repl-diskless-load: 是否使用无磁盘加载,有三项:
    disabled 不要使用无磁盘加载,先将rdb文件存储到磁盘
    on-empty-db 只有在完全安全的情况下才使用无磁盘加载
    swapdb 解析时在RAM中保留当前db内容的副本,直接从套接字获取数据。默认是disabled
  7. repl-ping-replica-period: 这里指定slave定期向master进行心跳检测的周期,默认10秒。 配置文件里是默认注释掉的。
  8. repl-timeout: 对master进行心跳检测超时时间,默认60秒。默认配置里是注释掉的
  9. repl-disable-tcp-nodelay: 同步之后是否禁用从站上的TCP_NODELAY 如果你选择yes,redis会使用较少量的TCP包和带宽向从站发送数据。但这会导致在从站增加一点数据的延时。 Linux内核默认配置情况下最多40毫秒的延时。如果选择no,从站的数据延时不会那么多,但备份需要的带宽相对较多。默认情况下我们将潜在因素优化,但在高负载情况下或者在主从站都跳的情况下,把它切换为yes是个好主意。默认值为no。
    在slave和master同步后(发送psync/sync),后续的同步是否设置成TCP_NODELAY . 假如设置成yes,
    则redis会合并小的TCP包从而节省带宽,但会增加同步延迟(40ms),造成master与slave数据不一致
    假如设置成no,则redis master会立即发送同步数据,没有延迟。
  10. repl-backlog-size: 设置主从复制backlog容量大小。这个 backlog 是一个用来在 slaves 被断开连接时存放slave数据的buffer,所以当一个 slave 想要重新连接,通常不希望全部重新同步,只是部分同步就够了,仅仅传递 slave 在断开连接时丢失的这部分数据。这个值越大,salve 可以断开连接的时间就越长。默认是1mb,配置文件里是默认注释掉的。
  11. repl-backlog-ttl: 配置当master和slave失去联系多少秒之后,清空backlog释放空间。当配置成0时,表示永远不清空。默认是3600,配置文件里是默认注释掉的。
  12. replica-priority: 当 master 不能正常工作的时候,Redis Sentinel 会从 slaves 中选出一个新的 master,这个值越小,就越会被优先选中,但是如果是0,那是意味着这个slave不可能被选中。 默认优先级为100。
  13. min-replicas-to-write 3
    min-replicas-max-lag 10: 假如主redis发现有超过M个从redis的连接延时大于N秒,那么主redis就停止接受外来的写请求。这是因为从redis一般会每秒钟都向主redis发出PING,而主redis会记录每一个从redis最近一次发来PING的时间点,所以主redis能够了解每一个从redis的运行情况。上面这个例子表示,假如有大于等于3个从redis的连接延迟大于10秒,那么主redis就不再接受外部的写请求。上述两个配置中有一个被置为0,则这个特性将被关闭。默认情况下min-replicas-to-write为0,而min-replicas-max-lag为10。
  14. replica-announce-ip 5.5.5.5
    replica-announce-port 1234: 常用于端口转发或NAT场景下,对Master暴露真实IP和端口信息。

KEYS TRACKING 键的追踪

在使用了客户端缓存(什么是客户端缓存:https://redis.io/topics/client-side-caching)的时候
这里配置要追踪的key的数量,如果配置为0,则表示要追踪的key的数量不受限制

tracking-table-max-keys: 默认是1000000,配置文件里是默认注释掉的

SECURITY 安全

  1. acllog-max-len: ACL日志的最大长度,默认是128M。关于acl,详见:https://redis.io/topics/acl、
  2. aclfile: /etc/redis/users.acl,ACL外部配置文件所在位置,配置文件里是默认注释掉的。
  3. requirepass: 默认是foobared,当前redis服务的访问密码,默认是不需要密码,配置文件里是默认注释掉的。
  4. rename-command: 把危险的命令给修改成其他名称。比如CONFIG命令可以重命名为一个很难被猜到的命令,这样用户不能使用,而内部工具还能接着使用。例如:rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52。
    作为服务端redis-server,常常需要禁用以上命令来使得服务器更加安全,禁用的具体做法是是:rename-command FLUSHALL “”

CLIENTS 客户端

maxclients : 设置客户端最大并发连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件。 描述符数-32(redis server自身会使用一些),如果设置 maxclients为0 。表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息。

# Set the max number of connected clients at the same time. By default
# this limit is set to 10000 clients, however if the Redis server is not
# able to configure the process file limit to allow for the specified limit
# the max number of allowed clients is set to the current file limit
# minus 32 (as Redis reserves a few file descriptors for internal uses).
#
# Once the limit is reached Redis will close all the new connections sending
# an error 'max number of clients reached'.
#
# IMPORTANT: When Redis Cluster is used, the max number of connections is also
# shared with the cluster bus: every node in the cluster will use two
# connections, one incoming and another outgoing. It is important to size the
# limit accordingly in case of very large clusters.
#
# maxclients 10000

内存管理

  1. maxmemory: 设置Redis的最大内存,如果设置为0 。表示不作限制。通常是配合下面介绍的maxmemory-policy参数一起使用。配置文件里是默认注释掉的。
  2. maxmemory-policy: 当内存使用达到maxmemory设置的最大值时,redis使用的内存清除策略。配置文件里是默认注释掉的。有以下几种可以选择:
  1. volatile-lru 利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used )
  2. allkeys-lru 利用LRU算法移除任何key
  3. volatile-random 移除设置过过期时间的随机key
  4. allkeys-random 移除随机key
  5. volatile-ttl 移除即将过期的key(minor TTL)
  6. noeviction noeviction 不移除任何key,只是返回一个写错误 ,默认选项
# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
 # is reached. You can select one from the following behaviors:
 #
 # volatile-lru -> Evict using approximated LRU, only keys with an expire set.
 # allkeys-lru -> Evict any key using approximated LRU.
 # volatile-lfu -> Evict using approximated LFU, only keys with an expire set.
 # allkeys-lfu -> Evict any key using approximated LFU.
 # volatile-random -> Remove a random key having an expire set.
 # allkeys-random -> Remove a random key, any key.
 # volatile-ttl -> Remove the key with the nearest expire time (minor TTL)
 # noeviction -> Don't evict anything, just return an error on write operations.
 #
 # LRU means Least Recently Used
 # LFU means Least Frequently Used
 #
 # Both LRU, LFU and volatile-ttl are implemented using approximated
 # randomized algorithms.
 #
 # Note: with any of the above policies, Redis will return an error on write
 #       operations, when there are no suitable keys for eviction.
 #
 #       At the date of writing these commands are: set setnx setex append
 #       incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
 #       sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
 #       zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
 #       getset mset msetnx exec sort
 #
 # The default is:
 #
 # maxmemory-policy noeviction
  1. maxmemory-samples: LRU,LFU,minimal TTL 算法都不是精准的算法,这里设置抽查的样本数量,默认是5个样本。配置文件里是默认注释掉的。
  2. replica-ignore-maxmemory: 从 Redis 5 开始,默认情况下,replica 节点会忽略 maxmemory 设置(除非在发生 failover 后,此节点被提升为 master 节点)。 这意味着只有 master 才会执行过期删除策略,并且 master 在删除键之后会对 replica 发送 DEL 命令。配置文件里是默认注释掉的。
  3. active-expire-effort: 设置过期keys仍然驻留在内存中的比重,默认是为1,表示最多只能有10%的过期key驻留在内存中,该值设置的越小,那么在一个淘汰周期内,消耗的CPU资源也更多,因为需要实时删除更多的过期key。所以该值的配置是需要综合权衡的。配置文件里是默认注释掉的。

LAZY FREEING 惰性释放

  1. lazyfree-lazy-eviction: 针对redis内存使用达到maxmeory,并设置有淘汰策略时,在被动淘汰键时,是否采用lazy free机制。因为此场景开启lazy free, 可能使用淘汰键的内存释放不及时,导致redis内存超用,超过maxmemory的限制。默认是no。
  2. lazyfree-lazy-expire: 针对设置有TTL的键,达到过期后,被redis清理删除时是否采用lazy free机制。此场景建议开启,因TTL本身是自适应调整的速度。默认是no。
  3. lazyfree-lazy-server-del: 针对有些指令在处理已存在的键时,会带有一个隐式的DEL键的操作。如rename命令,当目标键已存在,redis会先删除目标键,如果这些目标键是一个big key,那就会引入阻塞删除的性能问题。 此参数设置就是解决这类问题,建议可开启。默认是no
  4. replica-lazy-flush: 针对slave进行全量数据同步,slave在加载master的RDB文件前,会运行flushall来清理自己的数据场景,参数设置决定是否采用异常flush机制。如果内存变动不大,建议可开启。可减少全量同步耗时,从而减少主库因输出缓冲区爆涨引起的内存使用增长。默认是no
  5. lazyfree-lazy-user-del: 对于替换用户代码DEL调用的情况,也可以这样做使用UNLINK调用是不容易的,要修改DEL的默认行为命令的行为完全像UNLINK。默认是no。

THREADED I/O 线程IO

  1. io-threads 4:IO线程组中IO线程的数量,配置文件里是默认注释掉的。
  2. io-threads-do-reads no: 是否开启IO线程组,默认是不开启,想开启,可以设置为true,并指定上面io-threads的数值。配置文件里是默认注释掉的

KERNEL OOM CONTROL 内核OOM控制

  1. oom-score-adj no:当oom-killer发生时,linux会选择杀死哪些进程,该函数会计算每个进程的点数(0~1000)。点数越高,这个进程越有可能被杀死。每个进程的点数oom_score_adj有关,而且oom_score_adj可以被设置(-1000最低,1000最高)。
  2. oom-score-adj-values 0 200 800:

APPEND ONLY MODE AOF模式

  1. appendonly: 默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,Append Only File是另一种持久化方式, 可以提供更好的持久化特性。Redis会把每次写入的数据在接收后都写入appendonly.aof文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。默认值为no。是否启用aof持久化方式 。即是否在每次更新操作后进行日志记录,即在采用异步方式把数据写入到磁盘,如果不开启,可能会在断电时导致部分数据丢失。
  2. appendfilename: 更新日志文件名,默认为appendonly.aof。
  3. appendfsync: aof持久化策略的配置;no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快;always表示每次写入都执行fsync,以保证数据同步到磁盘;everysec表示每秒执行一次fsync,可能会导致丢失这1s数据。默认是everysec。
  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。
  5. auto-aof-rewrite-percentage: 默认值为100。aof自动重写配置,当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,即当aof文件增长到一定大小的时候,Redis能够调用bgrewriteaof对日志文件进行重写。当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程。
  6. auto-aof-rewrite-min-size: 设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写。
  7. aof-load-truncated: aof文件可能在尾部是不完整的,当redis启动的时候,aof文件的数据被载入内存。重启可能发生在redis所在的主机操作系统宕机后,尤其在ext4文件系统没有加上data=ordered选项,出现这种现象 redis宕机或者异常终止不会造成尾部不完整现象,可以选择让redis退出,或者导入尽可能多的数据。如果选择的是yes,当截断的aof文件被导入的时候,会自动发布一个log给客户端然后load。如果是no,用户必须手动redis-check-aof修复AOF文件才可以。默认值为 yes。
  8. aof-use-rdb-preamble: 在开启了这个功能之后,AOF重写产生的文件将同时包含RDB格式的内容和AOF格式的内容,其中RDB格式的内容用于记录已有的数据,而AOF格式的内存则用于记录最近发生了变化的数据,这样Redis就可以同时兼有RDB持久化和AOF持久化的优点(既能够快速地生成重写文件,也能够在出现问题时,快速地载入数据)。

LUA SCRIPTING Lua脚本

lua-time-limit: 一个lua脚本执行的最大时间,单位为ms。默认值为5000。

REDIS CLUSTER Redis集群

  1. cluster-enabled: 如果是yes,表示启用集群,否则以单例模式启动。默认是不开启集群模式。配置文件里是默认注释掉的。
  2. cluster-config-file: nodes-6379.conf 这不是一个用户可编辑的配置文件,这个文件是Redis集群节点自动持久化每次配置的改变,为了在启动的时候重新读取它。置文件里是默认注释掉的。
  3. cluster-node-timeout: 超时时间,集群节点不可用的最大时间。如果一个master节点不可到达超过了指定时间,则认为它失败了。注意,每一个在指定时间内不能到达大多数master节点的节点将停止接受查询请求。配置文件里是默认注释掉的。
  4. cluster-replica-validity-factor: 可以配置值为10。在进行故障转移的时候,全部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将不会尝试进行故障转移。配置文件里是默认注释掉的。
  5. cluster-migration-barrier: 可以配置值为1。master的slave数量大于该值,slave才能迁移到其他孤立master上,如这个参数若被设为2,那么只有当一个主节点拥有2 个可工作的从节点时,它的一个从节点会尝试迁移。配置文件里是默认注释掉的。
  6. cluster-require-full-coverage: 默认情况下,集群全部的slot有节点负责,集群状态才为ok,才能提供服务。 设置为no,可以在slot没有全部分配的时候提供服务。不建议打开该配置,这样会造成分区的时候,小分区的master一直在接受写请求,而造成很长时间数据不一致。配置文件里是默认注释掉的。
  7. cluster-replica-no-failover: 默认是no ,此选项设置为yes时,可防止从设备尝试对其进行故障转移master在主故障期间。 然而,仍然可以强制执行手动故障转移。配置文件里是默认注释掉的
  8. cluster-allow-reads-when-down: 是否允许集群在宕机时读取,配置文件里是默认注释掉的

CLUSTER DOCKER/NAT support docker集群/NAT支持

用于在NAT转换网络下配置公共地址和端口,其中bus的端口一般是节点端口加上10000

  1. cluster-announce-ip: 实际为各节点网卡分配ip
  2. cluster-announce-port: 节点映射端口
  3. cluster-announce-bus-port: 节点总线端

SLOW LOG 延迟监控

slowlog-max-len 128: 能够采样不同的执行路径来知道redis阻塞在哪里。这使得调试各种延时问题变得简单,设置一个毫秒单位的延时阈值来开启延时监控。

LATENCY MONITOR 事件通知

notify-keyspace-events: 默认是"",

关于事件通知,详见:http://redis.io/topics/notifications
	
	键事件通知,可用参数:
	K 键空间通知,所有通知以 keyspace@ 为前缀.
	E 键事件通知,所有通知以 keyevent@ 为前缀
	g DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知
	$ 字符串命令的通知
	l 列表命令的通知
	s 集合命令的通知
	h 哈希命令的通知
	z 有序集合命令的通知
	x 过期事件:每当有过期键被删除时发送
	e 驱逐(evict)事件:每当有键因为 maxmemory 策略而被删除时发送
	A 参数 g$lshzxe 的别名

GOPHER SERVER gopher服务

开启gopher功能,默认是no(不开启),关于gopher,详见:https://github.com/antirez/gopher2redis

gopher-enabled: 默认是 no ,配置文件里是默认注释掉的.

ADVANCED CONFIG 高级配置

  1. hash-max-ziplist-entries: ziplist最大条目数,默认是512。
  2. hash-max-ziplist-value: ziplist单个条目value的最大字节数,默认是64
  3. list-max-ziplist-size: 推荐是-2
ziplist列表最大值,默认存在五项:
 -5:最大大小:64 Kb <——不建议用于正常工作负载
 -4:最大大小:32 Kb <——不推荐
 -3:最大大小:16 Kb <——可能不推荐
 -2:最大大小:8 Kb<——很好
 -1:最大大小:4 Kb <——好
 list-max-ziplist-size -2
  1. list-compress-depth: 一个quicklist两端不被压缩的节点个数。0: 表示都不压缩。这是Redis的默认值,1: 表示quicklist两端各有1个节点不压缩,中间的节点压缩。3: 表示quicklist两端各有3个节点不压缩,中间的节点压缩。 默认是0
  2. set-max-intset-entries: 当集合中的元素全是整数,且长度不超过set-max-intset-entries(默认为512个)时,redis会选用intset作为内部编码,大于512用set。
  3. **zset-max-ziplist-entries 128 zset-max-ziplist-value 64 :**当有序集合的元素小于zset-max-ziplist-entries配置(默认是128个),同时每个元素的值都小于zset-max-ziplist-value(默认是64字节)时,Redis会用ziplist来作为有序集合的内部编码实现,ziplist可以有效的减少内存的使用。
  4. hll-sparse-max-bytes 3000: value大小 小于等于hll-sparse-max-bytes使用稀疏数据结构(sparse),大于hll-sparse-max-bytes使用稠密的数据结构(dense)
  5. stream-node-max-bytes 4096 stream-node-max-entries 100: Streams单个节点的字节数,以及切换到新节点之前可能包含的最大项目数。
  6. activerehashing: 主动重新散列每100毫秒CPU时间使用1毫秒,以帮助重新散列主Redis散列表(将顶级键映射到值
  7. client-output-buffer-limit normal 0 0 0: 对客户端输出缓冲进行限制可以强迫那些不从服务器读取数据的客户端断开连接,用来强制关闭传输缓慢的客户端。
  8. client-output-buffer-limit replica 256mb 64mb 60: 对于slave client和MONITER client,如果client-output-buffer一旦超过256mb,又或者超过64mb
    持续60秒,那么服务器就会立即断开客户端连接。
  9. client-output-buffer-limit pubsub 32mb 8mb 60: 对于pubsub client,如果client-output-buffer一旦超过32mb,又或者超过8mb持续60秒,那么服务
    器就会立即断开客户端连接。
  10. client-query-buffer-limit 1gb: 客户端查询缓冲区累积新命令。 默认情况下,它被限制为固定数量,以避免协议失步(例如由于客户端中的错误)将导致查询缓冲区中的未绑定内存使用。 但是,如果您有非常特殊的需求,可以在此配置它,例如我们巨大执行请求。配置文件里是默认注释掉的
  11. proto-max-bulk-len 512mb: 在Redis协议中,批量请求(即表示单个字符串的元素)通常限制为512 MB。 但是,您可以在此更改此限制。配置文件里是默认注释掉的。
  12. hz 10: 大多数用户应使用默认值10,除非仅在需要非常低延迟的环境中将此值提高到100。
  13. dynamic-hz yes:启用动态HZ时,实际配置的HZ将用作基线,但是一旦连接了更多客户端,将根据实际需要使用配置的HZ值的倍数。
  14. aof-rewrite-incremental-fsync yes: 当一个子进程重写AOF文件时,如果启用下面的选项,则文件每生成32M数据会被同步。
  15. rdb-save-incremental-fsync yes: 当redis保存RDB文件时,如果启用了以下选项,则每生成32 MB数据将对文件进行fsync。 这对于以递增方式将文件提交到磁盘并避免大延迟峰值非常有用。
  16. lfu-log-factor 10: 可以调整计数器counter的增长速度,lfu-log-factor越大,counter增长的越慢。配置文件里是默认注释掉的
  17. lfu-decay-time 1: 是一个以分钟为单位的数值,可以调整counter的减少速度。配置文件里是默认注释掉的。

ACTIVE DEFRAGMENTATION 活跃的碎片整理

  1. activedefrag no: 是否启用碎片整理,默认是no
  2. active-defrag-ignore-bytes 100mb: 最小的碎片空间浪费量,配置文件里是默认注释掉的。
  3. active-defrag-threshold-lower 10:最小的碎片百分比阈值,配置文件里是默认注释掉的。
  4. active-defrag-threshold-upper 100:最大的碎片百分比阈值,配置文件里是默认注释掉的。
  5. active-defrag-cycle-min 1:碎片整理周期CPU消耗最小百分比,碎片整理周期CPU消耗最大百分比。配置文件里是默认注释掉的。
  6. active-defrag-cycle-max 25:碎片整理周期CPU消耗最大百分比,碎片整理周期CPU消耗最大百分比。配置文件里是默认注释掉的。
  7. active-defrag-max-scan-fields 1000:从set / hash / zset / list 扫描的最大字段数,碎片整理周期CPU消耗最大百分比。配置文件里是默认注释掉的。
  8. jemalloc-bg-thread yes:默认情况下,用于清除的Jemalloc后台线程是启用的。
  9. server_cpulist 0-7:2:设置redis服务器的IO线程组的CPU绑定:0,2,4,6。配置文件里是默认注释掉的。
  10. bio_cpulist 1,3:设置BIO线程的CPU绑定为1,3,配置文件里是默认注释掉的。
  11. aof_rewrite_cpulist 8-11:设置AOF子进程的CPU绑定为8,9,10,11,配置文件里是默认注释掉的。
  12. bgsave_cpulist 1,10-11:设置bgsave的CPU绑定为1,10-11,配置文件里是默认注释掉的。