Redis - 配置文件
笔记
本内容介绍 Redis 的配置文件内容,这也是 Redis 进阶、优化需要掌握的技能。建议打开着配置文件看,理解更好。
# 1. 定位和理解redis.conf
- 位置:Redis配置文件通常位于Redis服务器的安装目录下,文件名为
redis.conf
。这个文件以纯文本格式存在,可以使用任何文本编辑器打开和编辑。 - 配置项:
redis.conf
文件包含了大量的配置项,每一项都控制着Redis操作的不同方面。这些配置项通常以key value
对的形式出现,并且每项配置的详细解释通常都会在其旁边以注释的形式提供。 - 动态配置:一些配置项可以在Redis运行时动态更改,而无需重启服务。可以通过Redis命令行接口(CLI)使用
CONFIG SET
命令来实现。相应地,使用CONFIG GET
命令可以查询当前的配置值。
config get * # 获取全部的配置
我们一般情况下,会单独拷贝出来一份进行操作。来保证初始文件的安全。
# 2. 配置单位和容量大小
- 单位大小写不敏感:在Redis配置文件中,指定容量大小时,单位可以是大写或小写(例如,
mb
和MB
是等效的),Redis不区分单位的大小写。 - G与GB的区别:在配置容量大小时,Redis区分了简写形式(如
G
)和完整形式(如GB
)。简写形式通常指的是基于1024的倍数(即2的幂),而不是1000的倍数。这是计算机存储领域的通用约定,其中G
通常表示GiB
(Gibibyte),而不是GB
(Gigabyte)。 - 支持的单位:Redis的配置支持的基本单位是字节(bytes),不支持比特(bits)。这意味着所有的配置项都应以字节为单位进行表达,确保配置的精确性和一致性。
# 3. include
- 包含其他配置文件:Redis配置允许通过
include
指令包含其他配置文件,这类似于编程中的文件包含机制。这使得配置管理变得更为灵活和模块化,特别是在维护大型或复杂的Redis部署时。 - 配置组织:通过使用
include
指令,可以将共通的配置项抽取到独立的文件中,然后在主配置文件中包含这些文件。这样,相同的配置项就不需要在多个地方重复定义,便于管理和更新。 - 适用于多实例配置:在运行多个Redis实例的场景中,
include
指令特别有用。可以将所有实例共享的配置(如安全设置、日志级别等)放在一个公共配置文件中,然后通过include
在每个实例的配置文件中引入,从而简化配置管理。
# 4. NETWORK网络配置
# bind、protected-mode、Port
bind 127.0.0.1 # 绑定的ip
protected-mode yes # 保护模式
port 6379 # 默认端口
2
3
bind
: 这个配置项用于指定Redis服务器监听的网络接口。默认情况下,它绑定到127.0.0.1
(仅本机访问)。如果需要让Redis接受远程连接,可以将此项设置为特定的IP地址,或者注释掉/移除此项来监听所有接口,从而接受任意IP地址的访问。protected-mode
: 当启用(默认)时,这个选项增加了Redis的安全性,限制了在没有设置密码和/或没有明确绑定IP地址时的远程访问。在protected-mode
为yes
且没有设置bind
指令和密码的情况下,Redis仅允许本地连接。port
: 这个配置定义了Redis服务器监听的端口号,默认为6379。可以根据需要更改此端口号。
# tcp-backlog
在Redis的配置中,tcp-backlog
设置对于优化和管理Redis服务器在高并发情况下的网络连接非常重要。tcp-backlog
指定了TCP连接的backlog大小,即服务器端保持处于半开(SYN_RECEIVED状态,已经接收到客户端的连接请求但客户端还未完成连接)和全开(已完成连接建立的)连接请求的队列的总和的最大长度。
- Backlog定义:Backlog是一个等待队列,其中包含了所有未完成三次握手(即未完全建立连接)的请求以及已完成连接但还未被应用程序接受的请求。这个队列的大小直接影响到在高负载条件下服务器能够接受新连接的能力。
- 高并发环境:在面对高并发的客户端连接请求时,一个较大的
tcp-backlog
值能够减少因为队列溢出而导致无法建立新连接的问题。这对于维持Redis服务的响应性和可用性尤为重要。 - Linux内核限制:实际上,
tcp-backlog
设置的效果可能受到Linux内核参数/proc/sys/net/core/somaxconn
和/proc/sys/net/ipv4/tcp_max_syn_backlog
的限制。/proc/sys/net/core/somaxconn
控制着全系统范围内的backlog的最大值,而/proc/sys/net/ipv4/tcp_max_syn_backlog
限制了未完成三次握手队列的大小。如果Redis配置的tcp-backlog
值超过这些内核参数的值,实际的backlog大小会被限制在这些内核参数的最大值。
# timeout
timeout
: 设置了客户端连接在多少秒空闲后关闭。设置为0表示禁用此功能,即连接将永远不会因为空闲而关闭。
# tcp-keepalive
tcp-keepalive
: 这个参数设置了TCP keepalive检测的时间间隔(秒)。Keepalive是一种网络协议机制,用于检测网络连接是否仍然活跃,有助于识别死连接。设置为0禁用keepalive检测。
# 5. GENERAL通用
Redis配置文件中的通用(GENERAL)部分包括一系列基础设置,这些设置涵盖了Redis服务的运行模式、进程管理、日志记录以及数据库数量的配置。这些配置项对于Redis服务器的运维和调试都至关重要。
# daemonize
daemonize
:这个选项控制Redis服务器是否以守护进程(后台服务)的方式运行。设置为yes
,Redis会在启动时转入后台运行,这是生产环境下推荐的设置,因为它允许Redis在不占用控制台的情况下持续运行。
# pidfile
pidfile
:指定存放Redis服务进程ID(PID)的文件路径。这个文件对于管理和控制Redis服务(如启动、停止、重启)非常有用,因为它记录了运行中的Redis实例的进程ID。
# loglevel
loglevel
:定义了日志记录的详细程度。Redis提供了四种日志级别:debug
、verbose
、notice
、warning
。debug
级别提供最详细的信息,适用于开发和测试环境;而warning
级别记录最关键的警告信息,适用于生产环境。默认设置为notice
,提供了一个平衡的日志详细程度。
四个级别根据使用阶段来选择,生产环境选择 notice 或者 warning。
# logfile
logfile
:设置日志文件的名称,Redis会将运行日志写入指定的文件中。这对于后期的监控和问题排查非常重要。如果设置为空字符串,Redis会将日志输出到标准输出(通常是终端或控制台),这主要在调试时使用。
# databases
databases
:设置Redis服务器可用的数据库数量,默认值为16。Redis支持多个数据库,客户端可以通过SELECT <dbid>
命令来选择使用哪个数据库。每个数据库在逻辑上是相互隔离的,这允许在同一个Redis服务器上为不同的应用或数据集提供独立的空间。
# 6. Redis配置文件常用模板
# 守护进程模式
daemonize yes # 设置为yes,Redis将以守护进程模式运行。这意味着Redis将在后台运行,并自动管理进程的生命周期。
# 进程监控
supervised no # 指定Redis的守护进程是否由进程监控工具管理。常见的选项包括upstart和systemd。默认为no,表示不由外部工具监控。
# 日志记录
loglevel notice # 设置日志级别为notice,为生产环境推荐的日志级别,提供适量的日志信息,平衡了日志详细度和文件大小。
logfile "" # 设置日志文件的路径。默认情况下,此处为空字符串,意味着日志将输出到标准输出(通常是终端或控制台)。在生产环境中,通常会指定一个日志文件路径。
# 数据库设置
databases 16 # 设置Redis服务器可以使用的数据库数量。默认为16个数据库,编号从0到15。根据应用需求,这个数字可以增减。
# 其他设置
always-show-logo yes # 设置为yes,Redis启动时总是显示Redis logo。这个选项通常不影响生产环境的设置,而是一个偏好设置。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 7. SNAPSHOPTING持久化
Redis支持两种主要的数据持久化方式:RDB
(Redis Database) 和 AOF
(Append Only File)。这两种持久化方式可以根据需要和场景进行配置和使用,以确保数据的安全性和恢复能力。
由于 Redis 是基于内存的数据库,需要将数据由内存持久化到文件中。
持久化方式:
- RDB
- AOF
AOF 配置:
AOF持久化通过记录每个写操作到一个日志文件中来实现数据保存。这种方式提供了数据的高度安全性,允许在发生故障时重新执行这些操作来恢复数据。
# 900秒(15分钟)内至少 1 个 key 值改变(则进行数据库保存--持久化)
save 900 1
# 300秒(5分钟)内至少 10 个 key 值改变(则进行数据库保存--持久化)
save 300 10
# 60秒(1分钟)内至少 10000 个 key 值改变(则进行数据库保存--持久化)
save 60 10000
2
3
4
5
6
appendonly yes
:启用AOF持久化。appendfsync
:设置同步策略,如everysec
(每秒同步一次),保证数据的及时写入磁盘。
RDB 配置:(内容太长,以代码显示)
RDB持久化通过创建内存数据的快照来实现数据保存。这种方式适合需要快速保存和恢复大量数据的场景。
stop-writes-on-bgsave-error yes # 持久化出现错误后,是否依然进行继续进行工作
rdbcompression yes # 使用压缩 rdb 文件 yes:压缩,但是需要一些 cpu 的消耗。no:不压缩,需要更多的磁盘空间
rdbchecksum yes # 是否校验 rdb 文件,更有利于文件的容错性,但是在保存 rdb 文件的时候,会有大概 10% 的性能损耗
dbfilename dump.rdb # dbfilenamerdb 文件名称
dir ./ # dir 数据目录,数据库的写入会在这个目录。rdb、aof 文件也会写在这个目录
2
3
4
5
6
7
8
9
# 8. REPLICATION主从复制
简单认识,后面详细说。
# 9. SECURITY安全(密码)
# 通过命令行设置密码
命令访问密码的查看,设置和取消,缺点:在命令中设置密码,只是临时的。重启 redis 服务器,密码就还原了。
- 连接到Redis服务器:首先启动Redis服务器,然后使用CLI连接到服务器。
- 设置密码:
- 使用
config get requirepass
命令查看当前的密码设置。 - 使用
config set requirepass "<your_password>"
命令设置新的访问密码。
- 使用
- 验证密码:
- 尝试执行一个命令(如
ping
),应该会收到NOAUTH Authentication required.
错误,表明需要认证。 - 使用
auth <your_password>
命令进行认证。 - 认证成功后,再次执行
ping
命令,应该能够正常收到PONG
响应。
- 尝试执行一个命令(如
# 启动redis
# 连接客户端
# 获得和设置密码
config get requirepass
config set requirepass "123456"
#测试ping,发现需要验证
127.0.0.1:6379> ping
NOAUTH Authentication required.
# 验证
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> ping
PONG
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 通过配置文件永久设置密码
为了确保密码设置在Redis服务器重启后依然有效,推荐在Redis的配置文件redis.conf
中设置密码。
- 编辑
redis.conf
文件:找到Redis的配置文件,通常位于Redis安装目录下。 - 设置
requirepass
指令:在配置文件中添加或修改requirepass
指令,如requirepass "123456"
,将123456
替换为你的密码。 - 重启Redis服务器:修改配置后,需要重启Redis服务器以应用更改。重启后,所有客户端连接到Redis服务器都需要先进行密码认证。
requirepass "123456"
# 10. 客户端连接相关
# maxclients
- 功能:限制同时连接到Redis服务器的客户端数量。
- 默认值:通常默认为10000个客户端。如果服务器达到此限制,Redis会拒绝新的连接请求,并向尝试连接的客户端发送
max number of clients reached
消息。 - 配置示例:
maxclients 10000
# maxmemory
- 功能:设置Redis可以使用的最大内存量。一旦达到这个限制,Redis会根据
maxmemory-policy
指定的策略尝试移除一些键值对。 - 注意事项:建议设置此配置以防止Redis占用所有系统内存,可能导致服务器宕机。未设置时,Redis会使用所有可用内存。
- 配置示例:
maxmemory 2gb
# maxmemory-policy
- 功能:定义当达到
maxmemory
限制时,Redis如何选择和移除键值对来释放内存。 - 策略选项:
volatile-lru
:从已设置过期时间的键中使用LRU算法移除。allkeys-lru
:从所有键中使用LRU算法移除。volatile-random
:从已设置过期时间的键中随机移除。allkeys-random
:从所有键中随机移除。volatile-ttl
:移除即将过期的键。noeviction
:不移除任何键,写操作返回错误。(默认)
- 配置示例:
maxmemory-policy noeviction
redis 中的 默认 的过期策略是 volatile-lru
。
命令设置方式
config set maxmemory-policy volatile-lru
配置文件设置
maxclients 10000 # 最大客户端数量
maxmemory <bytes> # 最大内存限制
maxmemory-policy noeviction # 内存达到限制值的处理策略
2
3
# maxmemory-samples
- 功能:影响LRU和最小TTL算法的准确性和性能。该配置指定了在决定哪个键被移除时,要检查的键的数量。
- 建议:通常设置为3到7。较低的值减少了准确性但提高了性能;较高的值提高了准确性但需要更多的计算资源。
- 配置示例:
maxmemory-samples 5
# 11. appendonly模式
AOF(Append Only File)持久化是Redis用来记录每个写操作命令的日志文件,确保数据安全性的一种机制。通过重放这些命令,Redis可以在服务器重启后重构其数据状态。这种方式对于需要最小化数据丢失风险的应用场景特别有用。
appendfsync everysec
# appendfsync aof 持久化策略的配置
# no 表示不执行 fsync,由操作系统保证数据同步到磁盘,速度最快。
# always表示每次写入都执行 fsync,以保证数据同步到磁盘。
# everysec表示每秒执行一次 fsync,可能会导致丢失这 1s数据。
2
3
4
5
# AOF文件同步方式
appendfsync
配置项控制了Redis如何将数据从内存同步到磁盘的AOF文件。这个设置对性能和数据安全性有直接影响。可用的选项包括:
no
:不主动进行同步,完全依赖于操作系统进行数据的刷新。这种方式提供了最高的性能,但在发生故障时可能会丢失最近的数据。always
:每次写操作后立即同步数据到AOF文件。虽然这种方式几乎可以消除数据丢失的风险,但对性能的影响最大,因为每次写操作都需要等待磁盘同步完成。everysec
(推荐):每秒同步一次数据到AOF文件。这提供了一个平衡的方案,在保证较好的数据安全性的同时,对性能的影响相对较小。在这种模式下,最多可能丢失一秒钟的数据。
# AOF重写
随着操作的不断执行,AOF文件会持续增长。为了优化性能和减小AOF文件大小,Redis提供了AOF重写的功能,它通过移除冗余命令来创建一个新的、更紧凑的AOF文件。AOF重写可以手动触发,也可以配置Redis自动触发。
# 自动AOF重写配置
auto-aof-rewrite-percentage
:AOF文件增长到一定比例时自动触发重写。这是相对于上次重写后AOF文件大小的百分比增长。auto-aof-rewrite-min-size
:触发AOF重写所需的最小AOF文件大小。
总结
AOF持久化提供了数据安全性的同时,需要适当配置以平衡性能和数据恢复需求。appendfsync
的设置决定了数据如何从内存同步到磁盘,其中everysec
选项通常是推荐的平衡选择。为了控制AOF文件的大小,定期进行AOF重写是一个好的实践。通过合理配置,可以使Redis在保证数据安全性的前提下,达到优良的运行性能。