欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Redis学习笔记(第六天):详细解读Redis 6配置文件

最编程 2024-07-25 10:56:25
...

Redis-6配置文件详解

1、前言

在Redis的解压目录下有个很重要的配置文件 redis.conf,关于Redis的很多功能的配置都在此文件中完成的,一般为了不破坏安装的文件,并且防止以后编辑错了可以恢复,出厂默认配置最好不要去改,所以我们将此配置文件复制到 /etc/redis.conf目录下了。

2、配置文件介绍

通过 vim /etc/redis.conf 命令打开此文件。下面我们将详细介绍此配置文件。

2.1、units单元

#./redis-server /path/to/redis.conf

# Note on units: when memory size is needed, it is possible to specifiy
# 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.

说明了redis的启动方式和要配置跟内存大小相关的参数,开头定义了一些基本的度量单位,只支持bytes,不支持bit。需要注意的是后面需要使用内存大小时,可以指定单位,通常是以 k,gb,m的形式出现,并且单位不区分大小写。

2.2、INCLUDES

20 ################################## INCLUDES ##############################
22 # Include one or more other config files here.  This is useful if you
23 # have a standard template that goes to all Redis servers but also need
24 # to customize a few per-server settings.  Include files can include
25 # other files, so use this wisely.
26 #
27 # Notice option "include" won't be rewritten by command "CONFIG REWRITE"
28 # from admin or Redis Sentinel. Since Redis always uses the last processed
29 # line as value of a configuration directive, you'd better put includes
30 # at the beginning of this file to avoid overwriting config change at runti     me.
31 #
32 # If instead you are interested in using includes to override configuration
33 # options, it is better to use include as the last line.
34 #
35 # include /path/to/local.conf

包含一个或多个配置文件,我们知道Redis只有一个配置文件,如果多个人进行开发维护,那么就需要多个这样的配置文件,不能被"CONFIG REWRITE"重写。这时候需要的多个配置文件就可以在此通过 include /path/to/local.conf 配置进来,而原本的 redis.conf 配置文件就作为一个总闸。

ps:如果用过struts2 开发的同学,在项目组中多人开发的情况下,通常会有多个struts2.xml 文件,这时候也会通过类的配置引入进来。另外需要注意的是,如果将此配置写在 redis.conf 文件的开头,那么后面的配置会覆盖引入文件的配置,如果想以引入文件的配置为主,那么需要将 include 配置写在 redis.conf 文件的末尾。

include /path/to/local.conf
include /path/to/other.conf

2.3、NETWORK

这里的配置较长,只截取了一部分。

image.png

2.3.1、bind

默认情况bind=127.0.0.1只能接受本机(Linux)的访问请求,其他电脑不能连接,如果不写这个bind后面的ip地址的情况下,无限制接受任何ip地址的访问。实际上我们在生产环境里面肯定要写你应用服务器的地址,不能写本机地址,服务器是需要远程访问的,所以需要将其注释掉。

注释掉以后,保存配置,停止服务,重启启动查看进程,就不再是本机访问了

image.png

更加官方的说法:bind就是绑定redis服务器网卡IP,默认为127.0.0.1,即本地回环地址。这样的话,访问redis服务只能通过本机的客户端连接,而无法通过远程连接。如果bind选项为空的话,那会接受所有来自于可用网络接口IP地址的连接。

2.3.2、protected-mode

image.png

如果开启了protected-mode【yes】,那么在没有设定bind ip且没有设密码的情况下,Redis只允许接受本机的响应,将本机访问保护模式设置no,可以支持远程访问【注释掉bind ip】

2.3.3、Port

image.png

指定redis运行的端口,默认是6379。由于Redis是单线程模型,因此单机开多个Redis进程的时候会修改端口。

2.3.4、tcp-backlog

image.png

设置tcpbacklogbacklog其实是一个连接队列,backlog队列总和=未完成三次握手队列 + 已经完成三次握手队列。

在高并发环境下你需要一个高backlog值来避免慢客户端连接问题。注意Linux内核会将这个值减小到/proc/sys/net/core/somaxconn的值(128),所以需要确认增大/proc/sys/net/core/somaxconn/proc/sys/net/ipv4/tcp_max_syn_backlog(128)两个值来达到想要的效果

2.3.5、timeout

image.png

设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接。默认值为0,表示不关闭。【比如Xshell连上我们的Redis,很久没有操作,过了这个时间就会关闭了,需要重新连接】

2.3.6、tcp-keepalive

image.png

对访问客户端的一种心跳检测,每个n秒检测一次。单位是秒,表示将周期性的使用SO_KEEPALIVE检测客户端是否还处于健康状态,避免服务器一直阻塞,官方给出的建议值是300s,如果设置为0,则不会周期性的检测。建议设置成60

2.4、GENERAL通用

daemonize:设置为yes表示指定Redis以守护进程的方式启动(后台启动)。默认值为 no

################################# GENERAL #####################################

# 《1》指定是否开启守护进程
# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize yes
#默认Redis不会作为守护进程运行。如果你需要的话将配置改为yes.
#当以守护进程运行时,默认Redis会将进程号写入/var/run/redis.pid文件

pidfile:配置PID文件存放路径,每个实例【进程】会产生一个不同的pid文件,当redis作为守护进程运行的时候,它会把 pid 默认写到 /var/run/redis_6379.pid 文件里面[同上]

#《3》以守护进程方式运行时,默认Redis写入进程id的文件路径
# If a pid file is specified, Redis writes it where specified at startup
# and removes it at exit.
#如果指定了pid文件,Redis将在启动时将其写入到指定的位置并在退出时将其删除
#
# 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".
#当服务器以非守护进程方式运行时,即使在配置文件中指定了也不会去创建pid文件,当服务器以守护进程方式启动时,即使未被指定也会创建pid文件,默认路径“/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.
#创建一个pid文件是最好的工作:如果redis无法创建它,并不会有什么不好的事情发生,服务将会
#正常的启动和运行
pidfile /var/run/redis_6379.pid

loglevel:定义日志级别。默认值为notice,有如下4种取值:

  • debug(记录大量日志信息,适用于开发、测试阶段)  
  • verbose(较多日志信息)  
  • notice(适量日志信息,使用于生产环境)  
  • warning(仅有部分重要、关键信息才会被记录)

四个级别根据使用阶段来选择,生产环境下一般选择notice 或者warning

#《4》设置日志级别
# Specify the server verbosity level.
#指定服务器详细的级别。
# This can be one of:
#可以是以下其中之一:
# debug (a lot of information, useful for development/testing)
# debug (很多信息,对开发/测试很有用)
# verbose (many rarely useful info, but not a mess like the debug level)
# verbose (很多精简的有用信息,但是不像debug等级那么多)
# notice (moderately verbose, what you want in production probably)
# notice (适量的信息,基本上是你生产环境中需要的程度)
# warning (only very important / critical messages are logged)
# warning (只有很重要/严重的信息会记录下来)
loglevel notice

logfile:配置log文件地址,也是日志文件名称,默认打印在命令行终端的窗口上

#《5》指定日志文件名
# Specify the log file name. Also the empty string can be used to force
# Redis to log on the standard output. Note that if you use standard
# output for logging but daemonize, logs will be sent to /dev/null
#指定日志文件名。空的字符串也可以用于强制Redis登录标准输出。请注意,如果你使用标准的日志输出且
#是守护进程方式,logs将被发送到/dev/null
logfile ""

databases:设置数据库的数目。默认的数据库是0号 ,可以在每个连接上使用select 命令选择一个不同的数据库,dbid是一个介于0到databases - 1 之间的数值。默认值是 16,也就是说默认Redis有16个数据库。

#《9》设置数据库个数
# 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
#设置数据库的数量。默认的是数据库是DB 0,你可以通过使用SELECT <dbid>命令选择
#在连接基础上的数据库,dbid是介于0'databases'-1之间的数字
databases 16

2.5、SNAPSHOTTING 快照

主要用来做持久化操作,即在规定的时间内,执行了多少次操作,则会持久化到文件.rdb.aof

save:

这里是用来配置触发Redis的持久化条件,也就是什么时候将内存中的数据保存到硬盘。默认如下配置:

  • save 900 1:表示900 秒内如果至少有 1 个 key 的值变化,则保存
  • save 300 10:表示300 秒内如果至少有 10 个 key 的值变化,则保存
  • save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存

当然如果你只是用Redis的缓存功能,不需要持久化,那么你可以注释掉所有的 save 行来停用保存功能。可以直接一个空字符串来实现停用:save ""

stop-writes-on-bgsave-error :

默认值为yes。当启用了RDB文件且最后一次后台保存数据失败,Redis是否停止接收数据。这会让用户意识到数据没有正确持久化到磁盘上,否则没有人会注意到灾难(disaster)发生了。如果Redis重启了,那么又可以重新开始接收数据了

rdbcompression

默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。

rdbchecksum :

默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。>dbfilename :设置快照的文件名,默认是 dump.rdb

dir:

设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。使用上面的 dbfilename 作为保存的文件名。

2.6、REPLICATION 复制

主从复制的时候阐述

replicaof <masterip> <masterport> 当设置本机为从服务器时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步

masterauth <master-password> 当master服务设置了密码保护时,从服务器连接master的密码

replica-serve-stale-data yes 当主从连接中断,或者主从复制建立期间,是否允许从服务器对外提供服务。默认为yes,即允许对外提供服务,但有可能读到脏数据。

replica-read-only yes 将从服务器设置为只读模式。需要注意,只读模式针对的只是客户端的写操作,对管理命令无效。

repl-diskless-sync no 是否使用无盘复制。为了降低主节点磁盘开销,Redis支持无盘复制,生成的RDB文件不保存到磁盘而是直接通过网络发送给从节点。无盘复制适用于主节点所在机器磁盘性能较差但网络宽带较充裕的场景。需要注意的是,无盘复制目前依然处于实验阶段。

repl-ping-replica-period 10 ,repl-diskless-sync-delay 5 master每隔一段固定的时间向从服务器发送一个PING命令

repl-timeout 复制超时时间。

repl-disable-tcp-nodelay 设置为yes,主节点会等待一段时间才发送TCP数据包,具体等待时间取决于Linux内核,一般是40毫秒。适用于主从网络环境复杂或带宽紧张的场景。默认为no。

repl-backlog-size 复制积压缓冲区,复制积压缓冲区是保存在主节点上的一个固定长度的队列。用于从Redis 2.8开始引入的部分复制。

repl-backlog-ttl 如果master上的从服务器全都断开了,且在指定的时间内没有连接上,则backlog会被master清除掉。repl-backlog-ttl即用来设置该时长,默认为3600s,如果设置为0,则永不清除。

replica-priority 设置从服务器的优先级,用于Redis Sentinel主从切换时使用,值越小,则提升为主的优先级越高。需要注意的是,如果设置为0,则代表该从服务器不参加选主。

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

2.7、SECURITY 安全

设置密码

# Require clients to issue AUTH <PASSWORD> before processing any other
# commands.  This might be useful in environments in which you do not trust
# others with access to the host running redis-server.
# 要求客户端在处理任何其他命令之前发出Auth<Password>。
# 这在不信任其他具有访问主机运行Redis-server的主机的环境中可能是有用的。
#
# This should stay commented out for backward compatibility and because most
# people do not need auth (e.g. they run their own servers).
# 为了向后兼容性,这应该保留注释,因为大多数人不需要auth(例如,他们运行自己的服务器)
#
# Warning: since Redis is pretty fast an outside user can try up to
# 150k passwords per second against a good box. This means that you should
# use a very strong password otherwise it will be very easy to break.
# 警告:由于Redis非常快,外部用户可以在一个好的盒子上每秒尝试多达150k的密码。
# 这意味着您应该使用一个非常强大的密码,否则它将非常容易被打破。
#
# requirepass foobared  //requirepass  这个就是配置redis访问密码的参数;默认没有密码

用命令进行访问密码的查看、设置和取消:

获取查看密码
        config get requirepass
设置密码
        config set requirepass 123456
当有密码的时候登录时需要密码登录【密码验证:】
        auth 密码
取消密码
        config set requirepass ''
  • 在用上面命令设置密码,只是临时的。重启redis服务器,密码就还原了。
  • 永久设置,需要再配置文件中进行设置。requirepass 密码

配置文件修改Redis密码:

在配置文件中有个参数: requirepass 这个就是配置redis访问密码的参数;比如 requirepass test123;(Ps:需重启Redis才能生效)

redis的查询速度是非常快的,外部用户一秒内可以尝试多大150K个密码;所以密码要尽量长(对于DBA 没有必要必须记住密码);

2.6、LIMITS限制

maxclients:

设置redis同时可以与多少个客户端进行连接。默认情况下为10000个客户端。当你无法设置进程文件句柄限制时,redis会设置为当前的文件句柄限制值减去32,因为redis会为自身内部处理逻辑留一些句柄出来。如果达到了此限制,redis则会拒绝新的连接请求,并且向这些连接请求方发出“max number of clients reached”以作回应。

509 # Once the limit is reached Redis will close all the new connections sending
510 # an error 'max number of clients reached'.
511 #
512 # maxclients 10000
默认情况下为10000个客户端

maxmemory

建议 必须设置 ,否则,将内存占满,造成服务器宕机。设置redis可以使用的内存量。一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。

如果redis无法根据移除规则来移除内存中的数据,或者设置了“不允许移除”,那么redis则会针对那些需要申请内存的指令返回错误信息,比如SET、LPUSH等。 但是对于无内存申请的指令,仍然会正常响应,比如GET等。如果你的redis是主redis(说明你的redis有从redis),那么在设置内存使用上限时,需要在系统中留出一些内存空间给同步队列缓存,只有在你设置的是“不移除”的情况下,才不用考虑这个因素

533 # In short... if you have slaves attached it is suggested that you set a lower
534 # limit for maxmemory so that there is some free RAM on the system for slave
535 # output buffers (but this is not needed if the policy is 'noeviction').
537 # maxmemory <bytes>

maxmemory-policy 最大缓存处理策略

  1. volatile-lru:使用LRU算法移除key,只对设置了过期时间的键
  2. allkeys-lru:使用LRU算法移除key
  3. volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键
  4. allkeys-random:移除随机的key
  5. volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key
  6. noeviction:不进行移除。针对写操作,只是返回错误信息

LRU 算法或者 TTL 算法都是不是很精确算法,而是1个近似算法。

539 # MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
540 # is reached. You can select among five behaviors:
541 #
542 # volatile-lru -> remove the key with an expire set using an LRU algorithm
543 # allkeys-lru -> remove any key according to the LRU algorithm
544 # volatile-random -> remove a random key with an expire set
545 # allkeys-random -> remove a random key, any key
546 # volatile-ttl -> remove the key with the nearest expire time (minor TTL)
547 # noeviction -> don't expire at all, just return an error on write operations

maxmemory-samples

设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小,redis默认会检查这么多个key并选择其中LRU的那个,一般设置3到7的数字,数值越小样本越不准确,但性能消耗越小。

562 # LRU and minimal TTL algorithms are not precise algorithms but approximated
563 # algorithms (in order to save memory), so you can tune it for speed or
564 # accuracy. For default Redis will check five keys and pick the one that was
565 # used less recently, you can change the sample size using the following
566 # configuration directive.
568 # The default of 5 produces good enough results. 10 Approximates very closely
569 # true LRU but costs a bit more CPU. 3 is very fast but not very accurate.
571 # maxmemory-samples 5

2.7、APPEND ONLY MODE 追加

appendonly no 是否开启aof

appendfilename “appendonly.aof” aof文件名

appendfsync
执行fynsc的策略
取值范围:
1 everysec 每秒执行一次sync 折衷方案
2 always 每次写操作都立刻写入到aof文件。慢,但是最安全
3 no 不要立刻刷,只有在操作系统需要刷的时候再刷。比较快
设置always往往比较影响性能,但是数据丢失的风险最低
一般推荐设置everysec

no-appendfsync-on-rewrite no 设置yes后,如果有保存的进程在执行,则不执行aof的appendfsync策略的fsync

auto-aof-rewrite-percentage
相对于上次aof文件大小的增长百分比如果超过这个值,则重写aof

auto-aof-rewrite-min-size
自动重写aof文件的最小大小,比 auto-aof-rewrite-percentage优先级高

aof-load-truncated
加入aof文件被截断了
1 设置yes,redis可以启动并且显示日志告知这个信息
2 设置no,redis启动失败,显示错误

aof-use-rdb-preamble
aof前部分用rdb,后面保存时缓存的命令还是用aof格式
优点:保存和恢复更快
设置yes开启

参考链接:

blog.****.net/szzzgyn/art…

blog.****.net/HBliucheng/…