Redis的配置文件Redis.conf详解

1、Redis版本

查看Redis的版本的命令

redis-server --version

本人用的是 Redis 6.2.6 的版本

在这里插入图片描述

2、配置文件解释

首先我们打开配置文件

vim redis.conf

我们由上往下依次分析

2.1、启动方式和单位

# 说明redis的启动方式
# ./redis-server /path/to/redis.conf
# Note on units: when memory size is needed, it is possible to specify
# it in the usual form of 1k 5GB 4M and so forth:
# #如果要配置跟内存大小相关的参数是可以这样配置
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#
# units are case insensitive so 1GB 1Gb 1gB are all the same.
# 这些单位Unit对大小写是不敏感的

在这里插入图片描述

2.2、INCLUDES 包含

在这里插入图片描述

################################## INCLUDES ###################################

# 包含一个或多个配置文件,通常include引入包含的配置,不能
# 被"CONFIG REWRITE"重写。另外,由于Redis总是根据最后一个
# 出现的相同的配置项的值作为配置值,所以如果我们不希望include的
# 配置覆盖了当前文件的配置,那么请把include放在当前配置文件的前面。
# include /path/to/local.conf
# include /path/to/other.conf

就好比我们学习Spring的import或者jsp的include

2.3、MODULES 模块

在这里插入图片描述

################################## MODULES #####################################
# 用于启动时加载模块。如果服务器无法加载模块它将中止。
# 可以使用多个loadmodule指令进行加载需要的模块。
# loadmodule /path/to/my_module.so
# loadmodule /path/to/other_module.so

2.4、NETWORK 网络

在这里插入图片描述

################################# NETWORK #####################################

# 默认情况下,如果你没有显式的指定bind参数,那么Redis将只接
# 受服务器本地回环的连接,如果你想监听网络上其它IP的连接,
# 也可以像下面这样配置一个或多个IP地址。

# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1

# Redis绑定的 IP
# 警告 如果要接受网络上所有机器的连接,可以配置成bind 0.0.0.0,
# 这样Redis就会接受所有IPv4地址的连接请求。在实际应用中,
# 但是这样是十分不安全的,不推荐这么做。如果改了一定要设置Redis密码
bind 127.0.0.1

# 这是一层安全保护,默认情况下是yes,外部网络无法访问当前redis,
# 通常我们会在配置好bind的IP地址及访问密码(后面的requirepass参数)之后,会将它重新设置主no。
# 这样外部网络就可以访问当前Redis了。
protected-mode yes

# 指定redis的监听端口,默认端口是6379
port 6379

# 此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度, 
# 当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxconn值,
# 默认是511。而Linux的默认参数值是128,当系统并发量大
# 并且客户端速度缓慢的时候,建议修改值大于511。
tcp-backlog 511

# 指定unix socket目录
# unixsocket /tmp/redis.sock

# 指定unix socket file的权限
# unixsocketperm 700

# 链接空闲了多少秒之后会被链接,也就是超时时间,
# 0的话就表示永不超时
timeout 0

# 每隔多少秒向客户端发送ACKs来检测客户端是否还存活着
tcp-keepalive 300

2.5、TLS/SSL 套接字安全

在这里插入图片描述

################################# TLS/SSL #####################################

# 默认情况下,TLS/SSL 是禁用的。要启用它,“tls-port”配置指令可用于定义 TLS 侦听端口。
# 要在默认端口上启用 TLS ,请使用:
# 
# port 0
# tls-port 6379
 
# 配置 X.509 证书和私钥,用于向连接的客户端、主节点或集群对等方验证服务器。这些文件应该是PEM 格式。
#
# tls-cert-file redis.crt 
# tls-key-file redis.key
 
# 配置DH 参数文件以启用Diffie-Hellman (DH) 密钥交换:
#
# tls-dh-params-file redis.dh
 
# 配置用于验证 TLS/SSL 客户端和对等方的 CA 证书包或目录。Redis 需要至少一个显式配置。这些,并且不会隐式使用系统范围的配置。
#
# tls-ca-cert-file ca.crt
# tls-ca-cert-dir /etc/ssl/certs
 
# 默认情况下,TLS 端口上的客户端(包括副本服务器)需要使用有效的客户端证书进行身份验证. 
# 如果指定“no”,则不需要且不接受客户端证书。如果指定了“optional”,则接受客户端证书,并且如果提供,则必须是有效的,但不是必需的。
# tls-auth-clients no
# tls-auth-clients optional
 
# 默认情况下,Redis 副本不会尝试与其主服务器建立 TLS 连接。
# 使用以下指令在复制链接上启用 TLS。
# tls-replication yes
 
# 默认情况下,Redis Cluster 总线使用普通 TCP 连接。要为总线协议启用 TLS,请使用以下指令:
# tls-cluster yes
 
# 明确指定要支持的 TLS 版本。允许的值不区分大小写并包括“TLSv1”、“TLSv1.1”、“TLSv1.2”、“TLSv1.3”(OpenSSL >= 1.1.1)或任意组合。
# 要仅启用 TLSv1.2 和 TLSv1.3,请使用:
# tls-protocols "TLSv1.2 TLSv1.3"
 
# 配置允许的密码。有关此字符串的语法的更多信息,请参见 ciphers(1ssl) 联机帮助页。
# 注意:此配置仅适用于<= TLSv1.2。
# tls-ciphers DEFAULT:!MEDIUM
 
# 配置允许的 TLSv1.3 密码套件。请参阅 ciphers(1ssl) 联机帮助页以获取有关此字符串语法的更多信息,特别是 TLSv1.3 密码套件
# tls-ciphersuites TLS_CHACHA20_POLY1305_SHA256
 
# 选择密码时,使用服务器的首选项而不是客户端首选项。默认情况下,服务器遵循客户端的偏好。
# tls-prefer-server-ciphers yes
 
# 默认情况下,TLS 会话缓存已启用,以允许支持它的客户端更快、更便宜地重新连接。使用以下指令禁用缓存。
# tls-session-caching no
 
# 更改缓存的 TLS 会话的默认数量。0值将缓存设置为无限大小。默认大小为 20480。
# tls-session-cache-size 5000
 
# 更改缓存 TLS 会话的默认超时时间。默认超时时间为 300 秒。
# tls-session-cache-timeout 60 

2.6、 GENERAL 通用

################################# GENERAL #####################################
# 默认情况下,Redis 不作为守护进程运行。如果需要,请使用“yes”。
# 注意Redis在daemonized时会在/var/run/redis.pid中写入pid文件。
daemonize no
 
# 如果您从 upstart 或 systemd 运行 Redis,Redis 可以加入你的管理树中与您的监督树。
# 四个选项:
#   supervised no      - no supervision interaction
#   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
#                        requires "expect stop" in your upstart job config
#   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
# 注意:这些监督方法仅表示“进程已准备好”
# 他们不能连续 ping 回你的supervisor.
supervised no
 
# 如果指定了 pid 文件,Redis 在启动时将其写入指定的位置并在退出时将其删除。
# 当服务器运行非守护进程时,如果没有在配置中指定,则不会创建 pid 文件。
# 当服务器被守护时也就是以后台方式运行,即使没有指定,也会使用pid 文件#,默认为“/var/run/redis.pid”。
# 如果Redis无法创建pid文件,则最好创建一个pid文件
# 没有什么不好的事情发生,服务器将启动并正常运行。
pidfile /var/run/redis_6379.pid
 
# 指定日志详细级别。
# 四个选项:
# debug (开发,很多信息,对开发/测试有用)
# verbose (默认,许多很少有用的信息,但不像调试级别那样混乱)
# notice (生产,适度冗长,你可能在生产中想要什么)
# warning (警告,仅记录非常重要/关键的消息)
loglevel notice
 
# 日志文件的位置,当指定为空字符串时,为标准输出,
# 如果redis已守护进程模式运行,那么日志将会输出到/dev/null,
# 若指定了路径,日志将会输出到指定文件,默认值是""
logfile ""
 
# 是否把日志记录到系统日志,默认是no
# syslog-enabled no
 
# 指定系统日志标识。
# syslog-ident redis
 
# 指定系统日志工具。必须是 USER 或介于 LOCAL0-LOCAL7 之间。
# syslog-facility local0
 
# 设置数据库的总数量。默认数据库是第一个 DB 0
# 您可以使用 SELECT <dbid> 在每个连接的基础上选择不同的数据库,其中dbid 是介于 0和'databases'-1 
databases 16

# 是否展示ASCII码logo,默认yes 
# 默认情况下 Redis 显示 ASCII 徽标仅当开始记录到标准输出并且标准输出是 TTY 时。基本上这意味着通常ASCII徽标仅在交互式会话中显示。
# 但是,通过将以下选项设置为 yes,可以强制执行 4.0 之前的行为并始终在启动日志中显示# ASCII 徽标。
always-show-logo yes

2.7、SNAPSHOTTING 快照

持久化,在规定的时间内,执行了多少次操作,则会持久化到文件.rdb.aof
redis是内存数据库,如果没有持久化,那么数据断电即失

################################ SNAPSHOTTING  ################################


# save <seconds> <changes>
# 如果发生给定的秒数和给定的对 DB 的写操作次数,将保存DB。

# 也可以删除所有先前配置的save,格式是:save "" 

# 默认配置:
# 如果 900 秒(15 分钟)后,如果至少更改了 1 个键,就进行持久化操作
save 900 1
# 如果 300 秒(5 分钟)后,如果至少 10 个键更改了,就进行持久化操作
save 300 10
# 60 秒后,如果至少有 10000 个键更改了,就进行持久化操作
save 60 10000

# 默认情况下,如果 redis 最后一次的后台保存失败,redis 将停止接受写操作,
# 这样以一种强硬的方式让用户知道数据不能正确的持久化到磁盘, 否则就会没人注意到灾难的发生。 
# 如果后台保存进程重新启动工作了,redis 也将自动的允许写操作。
# 默认值是yes
# 持久化操作如果出错,是否还需要继续操作
stop-writes-on-bgsave-error yes

# 当 dump转储到rdb数据库的时候,要不要进行压缩,如果你想节约CPU资源,
# 可以设置为no,但那样的话,rdb数据集将很大。默认是yes。
# 意思:压缩rdb文件,但是需要消耗一些CPU资源
rdbcompression yes

#从Redis5之后,一个CRC64校验和就被存在rdb文件的尾部,
#校验可以确认rdb文件的完整性,但是它会占用10%左右的保存或加载
#rdb文件的资源,如果你为了让性能最大化,你可以设置为no,
# 默认是true。
# 意思:保存rdb文件的时候,进行错误的检查校验
rdbchecksum yes

#指定rdb文件的名称,默认是dump.rdb
dbfilename dump.rdb

# 在没有启用持久性的情况下删除复制使用的RDB文件,
# 默认情况下,此选项是禁用的,但是在某些环境中出于法规或其他安全问题,RDB 文件由 master保存在磁盘上以提供副本,
# 或由副本存储在磁盘上以便加载它们以进行初始同步,应该尽快删除。请注意,此选项仅适用于同时禁用AOF 和 RDB 持久性的实例,否则完全忽略。
# 获得相同效果的另一种(有时更好)方法是在主实例和副本实例上使用无盘复制。然而在副本的情况下,无盘并不总是一种选择
rdb-del-sync-files no

# rdb文件的存放路径,默认值为./
dir ./

2.8、REPLICATION 主从复制(重要)

在这里插入图片描述

################################# REPLICATION #################################

#如果当前服务器为slave,那么这里配置的就是master的ip和端口,
#如:192.168.1.2 6379
# replicaof <masterip> <masterport>

#如果当前服务器为slave,那么这里配置的就是master的访问密码
# masterauth <master-password>

#如果当前服务器为slave,那么这里配置的就是master的用户名
# masteruser <username>


#当slave失去与master的连接,或正在拷贝中,如果为yes,
#slave会响应客户端的请求,数据可能不同步甚至没有数据,
#如果为no,slave会返回错误"SYNC with master in progress"
replica-serve-stale-data yes

#如果当前服务器为slave,这里配置slave是否只读,默认为yes,
#如果为no的话,就是可读可写。
replica-read-only yes

#新的从站和重连后不能继续备份的从站,需要做所谓的“完全备份”,
#即将一个RDB文件从主站传送到从站。
#这个传送有以下两种方式:
#硬盘备份:redis主站创建一个新的进程,用于把RDB文件写到硬盘上。
#过一会儿,其父进程递增地将文件传送给从站。
#无硬盘备份:redis主站创建一个新的进程,子进程直接把RDB文件写
#到从站的套接字,不需要用到硬盘。
#在硬盘备份的情况下,主站的子进程生成RDB文件。一旦生成,多个
#从站可以立即排成队列使用主站的RDB文件。
#在无硬盘备份的情况下,一次RDB传送开始,新的从站到达后,需要
#等待现在的传送结束,才能开启新的传送。
#如果使用无硬盘备份,主站会在开始传送之间等待一段时间
#(可配置,以秒为单位),希望等待多个子站到达后并行传送。
#在硬盘低速而网络高速(高带宽)情况下,无硬盘备份更好。
repl-diskless-sync no

#无盘复制延时开始秒数,默认是5秒,意思是当PSYNC触发的时候,
#master延时多少秒开始向master传送数据流,以便等待更多的slave
#连接可以同时传送数据流,因为一旦PSYNC开始后,如果有新的slave
#连接master,只能等待下次PSYNC。可以配置为0取消等待,立即开始。
repl-diskless-sync-delay 5

#是否使用无磁盘加载,有三项:
#disabled:不要使用无磁盘加载,先将rdb文件存储到磁盘
#on-empty-db:只有在完全安全的情况下才使用无磁盘加载
#swapdb:解析时在RAM中保留当前db内容的副本,直接从套接字
#获取数据。
repl-diskless-load disabled

#这里指定slave定期向master进行心跳检测的周期,默认10秒
#repl-ping-replica-period 10

#对master进行心跳检测超时时间,默认60秒
#repl-timeout 60

#在slave和master同步后(发送psync/sync),后续的同步是否设
#置成TCP_NODELAY . 假如设置成yes,则redis会合并小的TCP包
#从而节省带宽,但会增加同步延迟(40ms),造成master与slave
#数据不一致,假如设置成no,则redis master会立即发送同步数据,
#没有延迟。
repl-disable-tcp-nodelay no

#设置主从复制backlog容量大小。这个 backlog 是一个用来在
# slaves 被断开连接时存放slave数据的buffer,所以当一个
# slave 想要重新连接,通常不希望全部重新同步,只是部分同步就够
#了,仅仅传递 slave 在断开连接时丢失的这部分数据。这个值越大,
#salve 可以断开连接的时间就越长。
#repl-backlog-size 1mb

#配置当master和slave失去联系多少秒之后,清空backlog释放空间。
#当配置成0时,表示永远不清空。
repl-backlog-ttl 3600

#当 master 不能正常工作的时候,Redis Sentinel 会从 slaves 
#中选出一个新的 master,这个值越小,就越会被优先选中,但是如果
#是0,那是意味着这个slave不可能被选中。 默认优先级为100。
replica-priority 100

#假如主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。
#min-replicas-to-write 3
#min-replicas-max-lag 10

#常用于端口转发或NAT场景下,对Master暴露真实IP和端口信息。
#replica-announce-ip 5.5.5.5
#replica-announce-port 1234

2.9、KEYS TRACKING 键跟踪

############################### KEYS TRACKING #################################

# 最大跟踪数
# tracking-table-max-keys 1000000

2.10、SECURITY 安全

redis默认是没有密码的,在安全里面可以设置密码

################################## SECURITY ###################################

# ACL日志的最大长度,默认是128M。关于acl,详见:
# https://redis.io/topics/acl
acllog-max-len 128

# ACL外部配置文件所在位置
aclfile /etc/redis/users.acl

# 当前redis服务的访问密码,默认是不需要密码
# requirepass foobared

命令查看与设置密码,但是这种设置密码重启服务器就没了,还有如果开放bind关闭保护模块的话,一定要设置这个配置文件的密码,不然容易被植入脚本挖矿。

config get requirepass  #查看密码

config set requirepass "密码" #设置密码

auth 密码  # 密码验证登录

示例
在这里插入图片描述

2.11、CLIENTS 客户端

################################## CLIENTS ####################################

#客户端最大连接数配置默认是10000。
#maxclients 10000

2.12、MEMORY MANAGEMENT 内存管理

############################## MEMORY MANAGEMENT ################################

#指定Redis最大内存限制。达到内存限制时,Redis将尝试删除已到期或即将到期的 Key。
# maxmemory <bytes>

# 淘汰策略,像GC一样
# MAXMEMORY处理策略:当到达MAXMEMORY时,Redis将如何选择要删除的内容。下面的八种策略.
# volatile-lru      -> 对设置了过期时间的keys适用LRU淘汰策略
# allkeys-lru       -> 对所有keys适用LRU淘汰策略
# volatile-lfu      -> 对设置了过期时间的keys适用LFU淘汰策略
# allkeys-lfu       -> 对所有keys适用LFU淘汰策略
# volatile-random   -> 对设置了过期时间的keys适用随机淘汰策略
# allkeys-random    -> 对所有keys适用随机淘汰策略
# volatile-ttl      -> 淘汰离过期时间最近的keys
# noeviction        -> 不淘汰任何key,仅对写入操作返回一个错误,即永不过期
# 内存策略,默认是noeviction
# maxmemory-policy noeviction


# LRU,LFU,minimal TTL 算法都不是精准的算法,这里设置抽查的样本数量,默认是5个样本。
# 默认值为5会产生足够好的结果。10非常接近真实的LRU,但CPU成本更高。3更快,但不是很准确。
# maxmemory-samples 5

# 逐出处理设计为在默认设置下运行良好。
# 如果写入流量异常大,则可能需要增加此值。降低此值可能会降低延迟,但有被逐出的风险处理有效性
# 0=最小延迟,10=默认值,100=不考虑延迟的过程
# maxmemory-eviction-tenacity 10


# 从Redis 5开始,默认情况下,复制副本将忽略其maxmemory设置(除非在故障切换后升级为master或手动)。这意味着密钥的逐出将由主机处理,在主机端的密钥逐出时将DEL命令发送到复制副本。
# 此行为可确保主副本和副本保持一致,并且通常是您想要的,但是如果您的副本是可写的,或者您希望副本具有不同的内存设置,并且您确定对副本执行的所有写入都是幂等的,然后,您可以更改此默认设置(但一定要了解您正在做什么)。
# 请注意,由于复制副本在默认情况下不会退出,因此最终可能会使用比通过maxmemory设置的内存更多的内存(复制副本上的某些缓冲区可能更大,或者数据结构有时可能占用更多内存等等)。因此,请确保监视复制副本,并确保它们有足够的内存,在主副本达到配置的maxmemory设置之前,不会出现真正的内存不足情况。
# replica-ignore-maxmemory yes

# 设置过期keys仍然驻留在内存中的比重,默认是为1,表示最多
# 只能有10%的过期key驻留在内存中,该值设置的越小,那么在一个淘汰周期内,消耗的CPU资源也更多,
# 因为需要实时删除更多的过期key。所以该值的配置是需要综合权衡的。
#active-expire-effort 1

2.13、LAZY FREEING 惰性释放

############################# LAZY FREEING ####################################

#针对redis内存使用达到maxmeory,并设置有淘汰策略时,在被动淘汰键时,是否采用lazy free机制。
# 因为此场景开启lazy free, 可能使用淘汰键的内存释放不及时,导致redis内存超用,超过maxmemory的限制。
lazyfree-lazy-eviction no

#针对设置有TTL的键,达到过期后,被redis清理删除时是否采用lazyfree机制。
#此场景建议开启,因TTL本身是自适应调整的速度。
lazyfree-lazy-expire no

#针对有些指令在处理已存在的键时,会带有一个隐式的DEL键的操作。
#如rename命令,当目标键已存在,redis会先删除目标键,如果这些目标键是一个big key,那就会引入阻塞删除的性能问题。 
# 此参数设置就是解决这类问题,建议可开启。
lazyfree-lazy-server-del no

#针对slave进行全量数据同步,slave在加载master的RDB文件前
#,会运行flushall来清理自己的数据场景,参数设置决定是否
#采用异常flush机制。如果内存变动不大,建议可开启。可减
#少全量同步耗时,从而减少主库因输出缓冲区爆涨引起的内存
#使用增长。
replica-lazy-flush no

#对于替换用户代码DEL调用的情况,也可以这样做使用
#UNLINK调用是不容易的,要修改DEL的默认行为命令的行为
#完全像UNLINK。
lazyfree-lazy-user-del no

2.14、THREADED I/O 线程I/O

################################ THREADED I/O #################################

#默认线程是禁用的,redis建议至少我们的机器有4核,至少留下一个备用核
#如果你有4核或者更多,需要用到两核和三核 就使用下面的配置

#IO线程组中IO线程的数量
#io-threads 4

#是否开启IO线程组,默认是不开启,想开启,可以设置为true,
#并指定上面io-threads的数值
#io-threads-do-reads no

2.15、KERNEL OOM CONTROL 内核OOM控件

############################ KERNEL OOM CONTROL ##############################

# 在linux上,可以在内存溢出的时候提示 OOM 控件干掉那些进程
#启用此功能将使Redis主动控制其所有进程的oom_score_adj值
#,具体取决于它们的角色。 默认分数将尝试在所有其他进程之前
#杀死后台子进程,并在主进程之前杀死副本。
oom-score-adj no
#当使用oom score adj时,此指令控制主进程、副本进程和后
#台子进程使用的特定值。值的范围是-1000到1000(越高意味
#着死亡的可能性越大)。非特权进程(不是根进程,也没有
#CAP_SYS_资源功能)可以自由地增加它们的值,但不能将其降
#低到初始设置以下。 当服务器启动时,使用相对于oom_score_adj
#的初始值的值。因为通常初始值是0,所以它们通常与绝对值匹配。

oom-score-adj-values 0 200 800

2.16、KERNEL transparent hugepage CONTROL THP控制

内存大页机制(Transport Huge Pages,THP),是linux2.6.38后支持的功能,该功能支持2MB的大页内存分配,默认开启。常规的内存分配为4KB维度。

THP能减少内存分配的次数,同时可以加快子进程的fork速度。
但是redis采用了写时复制机制,一旦有数据要修改,redis不会直接修改内存数据,而是copy一份这个数据,然后进行修改,DOUBLE了。

在THP开启的情况下,如果就算只有2KB的数据,Redis也需要复制2MB的内存大页,而在常规情况下,只需要复制4KB的内存页,使得每次写命令引起的复制内存页的单位放大了512倍,这会拖慢写操作的执行时间,导致大于写操作慢查询,最终影响redis的性能。

所有在redis服务器需要关闭linux的THP

THP的内核逻辑
内核提供了THP开关可以控制,/sys/kernel/mm/transparent_hugepage/enabled,这个开关需要root权限,且是系统级别的影响。
always : 表示所有的进程都会被khugepaged扫描,尝试使用2M的透明大页。
madvise: 表示如果有进程调用了THP开关,则打开/关闭。
never: 表示khugepaged不会对任何进程生效,包括使用madvise的进程。

warning判断
redis的原有的逻辑是在启动阶段检查系统的THP配置,如果不是never,就会产生一个warning。redis自身并没有使用过madvise进行THP操作,即使使用了jemalloc,也不会对主要的内存进行THP操作。所以改成不是always就应该是安全的,所以,Oran接受了这个改动(https://github.com/redis/redis/pull/4001)。

关闭redis的进程THP
更加理想的做法是不管系统配置如何,redis都可以把自己进程的THP开关禁用掉,这样子不需要root权限控制,且不会影响其他的进程。Linux恰好提供了这样了一个syscall,所以在(https://github.com/redis/redis/pull/7381)中,会关闭掉。同时,根据Oran的意见,增加了配置项,在多数情况下,默认都是会自动关闭掉THP,除非用户强制指定了不关闭的配置。这样下来,在大多数情况下,用户都可以避免THP引起的fork之后的剧烈抖动问题。

#################### KERNEL transparent hugepage CONTROL ######################

# 通常,内核透明巨型页面控件默认设置为“madvise”或“never”(/sys/kernel/mm/Transparent\u hugepage/enabled),在这种情况下,此配置无效。在其设置为“始终”的系统上,
# redis将尝试专门针对redis进程禁用它,以避免fork(2)和CoW的延迟问题。用户都可以避免THP引起的fork之后的剧烈抖动问题。
#如果出于某种原因您希望保持启用状态,可以将此配置设置为“否”,将内核全局设置为“始终”。
disable-thp yes

推荐博客讲解:[linux][redis]redis支持disable-thp了

2.17、APPEND ONLY MODE AOF模式

############################## APPEND ONLY MODE ###############################
# 是否启用aof持久化方式 。即是否在每次更新操作后进行日志记录,以文本的方式记录,可以打开文件看到详细的操作记录。
# 默认配置是no,即在采用异步方式把数据写入到磁盘,
# 如果不开启,可能会在断电时导致部分数据丢失。大部分情况下 ,rdb完全够用了
appendonly no

#更新日志文件名,默认为appendonly.aof
appendfilename “appendonly.aof”

# aof文件刷新的频率。有三种:
# 1.no 依靠系统进行刷新,由系统决定何时同步数据,redis不主动刷新AOF,这样最快,但安全性就差。
# 2.always 每提交一个修改命令都调用fsync刷新到AOF文件,非常非常慢,但也非常安全。
# 3.everysec 每秒钟都调用fsync刷新到AOF文件,很快,但可能会丢失一秒以内的数据。
# appendfsync always
appendfsync everysec
# appendfsync no


#指定是否在后台aof文件rewrite期间调用fsync,默认为no,
#表示要调用fsync(无论后台是否有子进程在刷盘)。
#Redis在后台写RDB文件或重写AOF文件期间会存在大量磁盘IO
#,此时,在某些linux系统中,调用fsync可能会阻塞。
# 如果设置为no,则write后不会有fsync调用,由操作系统自动调度刷磁盘,性能是最好的。那就还不如用rdb
no-appendfsync-on-rewrite no

# aof文件增长比例,指当前aof文件比上次重写的增长比例大小
# aof重写即在aof文件在一定大小之后,重新将整个内存写到
# aof文件当中,以反映最新的状态(相当于bgsave)。
# 这样就避免了,aof文件过大而实际内存数据小的问题(频繁修改数据问题)。
auto-aof-rewrite-percentage 100

# aof文件重写最小的文件大小,即最开始aof文件必须要达到这个文件时才触发
# 后面的每次重写就不会根据这个变量了(根据上一次重写完成之后的大小)
# 此变量仅初始化启动redis有效.
# 如果是redis恢复时,则lastSize等于初始aof文件大小。
auto-aof-rewrite-min-size 64mb

#指redis在恢复时,会忽略最后一条可能存在问题的指令。
#默认值yes。即在aof写入时,可能存在指令写错的问题(
#突然断电,写了一半),这种情况下,yes会log并继续,
#而no会直接恢复失败。
aof-load-truncated yes

#在开启了这个功能之后,AOF重写产生的文件将同时包含RDB格式
#的内容和AOF格式的内容,其中RDB格式的内容用于记录已有的数
#据,而AOF格式的内存则用于记录最近发生了变化的数据,这样
#Redis就可以同时兼有RDB持久化和AOF持久化的优点(既能够快
#速地生成重写文件,也能够在出现问题时,快速地载入数据)。
# 示是否开启混合持久化
# 如果开启了混合持久化,aof在重写时,不再是单纯将内存数据转换为RESP命令写入aof文件,而是将重写这一刻之前的内存做rdb快照处理,并且将rdb快照内容和增量的aof修改内存数据的命令存在一起,都写入新的aof文件,新的aof文件一开始不叫appendonly.aof,等到重写完成后,新的aof文件才会进行改名,原子的覆盖原有的aof文件,完成新旧两个aof文件的替换。
# 于是在redis重启的时候,可以先加载rdb文件,然后再重放增量的aof日志就可以完全替代之前的aof全量文件重放,因此重启效率大幅得到提高。
aof-use-rdb-preamble yes

2.18、LUA SCRIPTING LUA脚本

################################ LUA SCRIPTING  ###############################

#一个Lua脚本最长的执行时间,单位为毫秒,如果为0或负数
#表示无限执行时间,默认为5000
lua-time-limit 5000

2.19、REDIS CLUSTER Redis集群配置

################################ REDIS CLUSTER  ###############################

#如果是yes,表示启用集群,否则以单例模式启动

#cluster-enabled yes

#这不是一个用户可编辑的配置文件,这个文件是Redis集群节点
#自动持久化每次配置的改变,为了在启动的时候重新读取它
#cluster-config-file nodes-6379.conf

#超时时间,集群节点不可用的最大时间。如果一个master节点
#不可到达超过了指定时间,则认为它失败了。注意,每一个在
#指定时间内不能到达大多数master节点的节点将停止接受查询请求。
#cluster-node-timeout 15000

#如果设置为0,则一个slave将总是尝试故障转移一个master。
#如果设置为一个正数,那么最大失去连接的时间是node timeout
#乘以这个factor。
#cluster-replica-validity-factor 10

#一个master和slave保持连接的最小数量(即:最少与多少个slave
#保持连接),也就是说至少与其它多少slave保持连接的slave才有
#资格成为master
#cluster-migration-barrier 1

#如果设置为yes,这也是默认值,如果key space没有达到百分
#之多少时停止接受写请求。如果设置为no,将仍然接受查询请求,
#即使它只是请求部分key
#cluster-require-full-coverage yes

#此选项设置为yes时,可防止从设备尝试对其进行故障转移master
#在主故障期间。 然而,仍然可以强制执行手动故障转移
#cluster-replica-no-failover no

#是否允许集群在宕机时读取
#cluster-allow-reads-when-down no

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

########################## CLUSTER DOCKER/NAT support  ########################

#宣布服务IP
#cluster-announce-ip 10.1.1.5

#宣布服务端口
#cluster-announce-tls-port 6379 # 带tls(Web的安全传输协议)的
#cluster-announce-port 6379

#宣布集群总线端口
#cluster-announce-bus-port 6380

2.21、SLOW LOG 慢查询日志

################################## SLOW LOG ###################################

#决定要对执行时间大于多少微秒
#(microsecond,1秒 = 1,000,000 微秒)的查询进行记录。
slowlog-log-slower-than 10000

#它决定 slow log 最多能保存多少条日志, slow log 本身是一个 
#FIFO 队列,当队列大小超过 slowlog-max-len 时,最旧的一条
#日志将被删除,而最新的一条日志加入到 slow log ,以此类推。
slowlog-max-len 128

2.22、LATENCY MONITOR 延迟监控

################################ LATENCY MONITOR ##############################

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

2.23、EVENT NOTIFICATION 事件通知

官方详解 :https://redis.io/topics/notifications
推荐博客:Redis 事件通知(keyspace & keyevent notification)

############################# EVENT NOTIFICATION ##############################

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

2.24、GOPHER SERVER gopher服务

############################### GOPHER SERVER #################################

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

2.25、ADVANCED CONFIG 高级配置

############################### ADVANCED CONFIG ###############################

#ziplist最大条目数
hash-max-ziplist-entries 512

#ziplist单个条目value的最大字节数
hash-max-ziplist-value 64

#ziplist列表最大值,默认存在五项:
#-5:最大大小:64 Kb <——不建议用于正常工作负载
#-4:最大大小:32 Kb <——不推荐
#-3:最大大小:16 Kb <——可能不推荐
#-2:最大大小:8 Kb<——很好
#-1:最大大小:4 Kb <——好
list-max-ziplist-size -2

#一个quicklist两端不被压缩的节点个数。0: 表示都不压缩。
#这是Redis的默认值,1: 表示quicklist两端各有1个节点不压缩,
#中间的节点压缩。3: 表示quicklist两端各有3个节点不压缩,
#中间的节点压缩。
list-compress-depth 0

#当集合中的元素全是整数,且长度不超过set-max-intset-entries
#(默认为512个)时,redis会选用intset作为内部编码,
#大于512用set。
set-max-intset-entries 512

#当有序集合的元素小于zset-max-ziplist-entries配置
#(默认是128个),同时每个元素的值都小于
#zset-max-ziplist-value(默认是64字节)时,Redis会用
#ziplist来作为有序集合的内部编码实现,ziplist可以
#有效的减少内存的使用。
zset-max-ziplist-entries 128
zset-max-ziplist-value 64

#value大小 小于等于hll-sparse-max-bytes使用稀疏数据结构
#(sparse),大于hll-sparse-max-bytes使用稠密的数据结构
#(dense)
hll-sparse-max-bytes 3000

#Streams单个节点的字节数,以及切换到新节点之前可能包含的
#最大项目数。
stream-node-max-bytes 4096
stream-node-max-entries 100

#主动重新散列每100毫秒CPU时间使用1毫秒,以帮助重新散列主
#Redis散列表(将顶级键映射到值)
activerehashing yes

#对客户端输出缓冲进行限制可以强迫那些不从服务器读取数据的
#客户端断开连接,用来强制关闭传输缓慢的客户端。
client-output-buffer-limit normal 0 0 0

#对于slave client和MONITER client,如果
#client-output-buffer一旦超过256mb,又或者超过64mb
#持续60秒,那么服务器就会立即断开客户端连接
client-output-buffer-limit replica 256mb 64mb 60

#对于pubsub client,如果client-output-buffer一旦超过
#32mb,又或者超过8mb持续60秒,那么服务器就会立即断开客
#户端连接
client-output-buffer-limit pubsub 32mb 8mb 60

#客户端查询缓冲区累积新命令。 默认情况下,它被限制为固
#定数量,以避免协议失步(例如由于客户端中的错误)将导致
#查询缓冲区中的未绑定内存使用。 但是,如果您有非常特殊
#的需求,可以在此配置它,例如我们巨大执行请求
#client-query-buffer-limit 1gb

#在Redis协议中,批量请求(即表示单个字符串的元素)通常
#限制为512 MB。 但是,您可以在此更改此限制
#proto-max-bulk-len 512mb

#默认情况下,hz设置为10.提高值时,在Redis处于空闲状
#态下,将使用更多CPU。范围介于1到500之间,大多数用户
#应使用默认值10,除非仅在需要非常低延迟的环境中将此
#值提高到100
hz 10

#启用动态HZ时,实际配置的HZ将用作基线,但是一旦连接
#了更多客户端,将根据实际需要使用配置的HZ值的倍数
dynamic-hz yes

#当一个子进程重写AOF文件时,如果启用下面的选项,则文
#件每生成32M数据会被同步
aof-rewrite-incremental-fsync yes

#当redis保存RDB文件时,如果启用了以下选项,则每生成
#32 MB数据将对文件进行fsync。 这对于以递增方式将文件
#提交到磁盘并避免大延迟峰值非常有用
rdb-save-incremental-fsync yes

#±-------±-----------±-----------±-----------±-----------±-#----------+
#| factor | 100 hits | 1000 hits | 100K hits | 1M hits | #10M hits |
#±-------±-----------±-----------±-----------±-----------±-#----------+
#| 0 | 104 | 255 | 255 | 255 | 255 |
#±-------±-----------±-----------±-----------±-----------±-----------+
#| 1 | 18 | 49 | 255 | 255 | 255 |
#±-------±-----------±-----------±-----------±-----------±-----------+
#| 10 | 10 | 18 | 142 | 255 | 255 |
#±-------±-----------±-----------±-----------±-----------±-----------+
#| 100 | 8 | 11 | 49 | 143 | 255 |
#±-------±-----------±-----------±-----------±-----------±-----------+

#可以调整计数器counter的增长速度,lfu-log-factor越大,
#counter增长的越慢。
#lfu-log-factor 10

#是一个以分钟为单位的数值,可以调整counter的减少速度
#lfu-decay-time 1

2.26、ACTIVE DEFRAGMENTATION 活跃碎片整理

########################### ACTIVE DEFRAGMENTATION #######################

#是否启用碎片整理,默认是no
#activedefrag no

#最小的碎片空间浪费量
#active-defrag-ignore-bytes 100mb

#最小的碎片百分比阈值
#active-defrag-threshold-lower 10

#最大的碎片百分比阈值
#active-defrag-threshold-upper 100

#碎片整理周期CPU消耗最小百分比
#active-defrag-cycle-min 1

#碎片整理周期CPU消耗最大百分比
#active-defrag-cycle-max 25

#从set / hash / zset / list 扫描的最大字段数
#active-defrag-max-scan-fields 1000

#默认情况下,用于清除的Jemalloc后台线程是启用的。
jemalloc-bg-thread yes

#设置redis服务器的IO线程组的CPU绑定:0,2,4,6
#server_cpulist 0-7:2

#设置BIO线程的CPU绑定为:1,3:
#bio_cpulist 1,3

#设置AOF子进程的CPU绑定为:8,9,10,11
#aof_rewrite_cpulist 8-11

#设置bgsave的CPU绑定为:1,10-11
#bgsave_cpulist 1,10-11

好了,这就是整个Redis的配置文件详解。

参考博客 Redis配置文件,感谢大佬!


版权声明:本文为m0_51295655原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。