Redis.conf详解
定义
redis.conf
是 Redis 服务器启动时加载的配置文件。它包含了 Redis 运行时的各种参数和选项,通过修改这个文件,可以自定义 Redis 服务器的行为以满足不同的需求。理解并正确配置 redis.conf
对于优化 Redis 性能、保证数据安全以及实现高可用性至关重要。
文件结构和基本语法
指令,内存大小单位(支持k, kb, m, mb, g, gb),时间单位(支持s, m, h, d)都不区分大小写.
如果值包含空格或特殊字符,建议用双引号括起来,例如 requirepass "your very strong password"
。
重要配置项详解
网络 (Network)
bind 127.0.0.1 ::1
:- 指定 Redis 服务器监听的网络接口。
- 默认值为
127.0.0.1 ::1
,表示只允许本机(IPv4 和 IPv6)连接。 - 如果要允许其他机器连接,可以设置为
0.0.0.0
(监听所有 IPv4 地址) 或特定 IP 地址。 - 安全警告: 将
bind
设置为0.0.0.0
会使 Redis 暴露在公网上,必须配合防火墙和密码认证(requirepass
)使用。
port 6379
:- 指定 Redis 服务器监听的端口号。
- 默认值为
6379
。 - 如果需要在一台服务器上运行多个 Redis 实例,需要为每个实例配置不同的端口号。
tcp-backlog 511
:- TCP 连接队列的长度。当有大量连接请求时,这个参数决定了有多少连接可以等待被 Redis 接受。
- 默认值通常足够,但在高并发场景下可以适当调大。
timeout 0
:- 客户端空闲多少秒后关闭连接。
- 默认值为
0
,表示不关闭空闲连接。 - 可以设置为一个非零值,例如
300
(5分钟),以释放不活跃的连接资源。
tcp-keepalive 300
:- TCP Keepalive 机制的探测间隔,单位为秒。
- 用于检测客户端连接是否依然存活,避免因网络异常导致连接资源无法释放。
- 默认值为
300
。设置为0
表示禁用。
通用 (General)
daemonize no
:- 是否以守护进程模式运行 Redis。
- 默认值为
no
,Redis 在前台运行,日志会直接输出到控制台。 - 设置为
yes
时(一般都会设置成yes),Redis 会在后台运行,通常用于生产环境。
pidfile /var/run/redis_6379.pid
:- 当 Redis 以守护进程模式运行时,指定 PID 文件的路径。
loglevel notice
:- 日志级别。可选值有:
debug
: 记录大量信息,用于开发和调试。verbose
: 比debug
少一些信息。notice
: 适度的日志级别,生产环境常用(默认值)。warning
: 只记录重要的或者关键的警告信息。
- 日志级别。可选值有:
logfile ""
:- 日志文件的路径。
- 默认值为空字符串,表示日志输出到标准输出(当
daemonize no
时)或/dev/null
(当daemonize yes
时)。 - 可以指定一个文件路径,例如
/var/log/redis/redis-server.log
。
databases 16
:- 数据库的数量。Redis 默认支持 16 个数据库,编号从 0 到 15。
- 客户端可以通过
SELECT <dbid>
命令切换数据库。 - 注意: 不同数据库之间的数据是隔离的,但所有数据库共享同一个 Redis 进程的资源。在集群模式下,只支持数据库 0。
快照 (Snapshotting - RDB 持久化)
Redis 支持两种持久化方式:RDB 和 AOF。RDB 是在指定的时间间隔内将内存中的数据集快照写入磁盘。
save <seconds> <changes>
:- 配置 RDB 持久化的触发条件。可以配置多条
save
规则。 - 例如:
save 900 1
: 900 秒(15分钟)内至少有 1 个 key 发生变化,则进行快照。save 300 10
: 300 秒(5分钟)内至少有 10 个 key 发生变化,则进行快照。save 60 10000
: 60 秒内至少有 10000 个 key 发生变化,则进行快照。
- 如果想禁用 RDB,可以将所有
save
行注释掉,或者添加一个空的save ""
。
- 配置 RDB 持久化的触发条件。可以配置多条
stop-writes-on-bgsave-error yes
:- 当后台 RDB 持久化(BGSAVE)发生错误时,是否停止接受写操作。
- 默认值为
yes
,可以防止在持久化失败的情况下继续写入数据,避免数据不一致的风险。 - 如果对数据一致性要求不是非常高,且希望即使持久化失败也能继续提供服务,可以设置为
no
。
rdbcompression yes
:- 是否对 RDB 文件进行压缩。
- 默认值为
yes
,可以减小 RDB 文件的大小,但会消耗一些 CPU 资源。 - 如果 CPU 资源紧张,可以设置为
no
。
rdbchecksum yes
:- 是否在 RDB 文件末尾追加 CRC64 校验和。
- 默认值为
yes
,可以提高 RDB 文件的健壮性,但在生成和加载 RDB 文件时会消耗大约 10% 的性能。 - 如果追求极致性能,可以设置为
no
。
dbfilename dump.rdb
:- RDB 文件的名称。
rdb-del-sync-files no
:- 在没有持久化配置的情况下,主从复制成功后是否删除 RDB 同步文件。
- 默认为
no
。
dir ./
:- RDB 文件和 AOF 文件(如果启用)的存放目录。
- 默认值为
./
,表示当前启动 Redis 的目录。 - 建议设置为一个专门的持久化数据目录,例如
/var/lib/redis
。
只追加文件 (Append Only File - AOF 持久化)
AOF 持久化记录服务器接收到的所有写操作命令,并在服务器启动时通过重新执行这些命令来还原数据集。相比 RDB,AOF 通常能提供更好的数据持久性。
appendonly no
:- 是否启用 AOF 持久化。
- 默认值为
no
。设置为yes
则启用 AOF。 - 建议: 为了数据安全,通常建议同时开启 RDB 和 AOF,或者至少开启 AOF。
appendfilename "appendonly.aof"
:- AOF 文件的名称。
appendfsync everysec
:- AOF 文件同步到磁盘的策略。可选值有:
always
: 每个写命令都立即同步到磁盘,最安全但也最慢。everysec
: 每秒同步一次,是性能和数据安全的折中方案(默认值)。最多丢失 1 秒的数据。no
: 由操作系统决定何时同步,速度最快,但数据丢失风险最大。
- AOF 文件同步到磁盘的策略。可选值有:
no-appendfsync-on-rewrite no
:- 在进行 AOF 重写(
BGREWRITEAOF
)期间,是否禁止appendfsync
。 - 默认值为
no
。如果设置为yes
,在 AOF 重写期间,新的写操作会暂存在内存中,而不是立即同步到磁盘,这可以减少重写期间的磁盘 I/O 压力,但会增加数据丢失的风险(如果此时 Redis 宕机)。
- 在进行 AOF 重写(
auto-aof-rewrite-percentage 100
:- 触发 AOF 文件自动重写的条件:当 AOF 文件大小相对于上次重写后的大小增长百分比达到此值时,触发重写。
- 例如,如果上次重写后 AOF 文件大小为 64MB,那么当 AOF 文件增长到 128MB (64MB + 64MB * 100%) 时,会触发重写。
- 设置为
0
表示禁用自动 AOF 重写。
auto-aof-rewrite-min-size 64mb
:- 触发 AOF 文件自动重写的最小文件大小。只有当 AOF 文件大小超过此值时,
auto-aof-rewrite-percentage
才生效。
- 触发 AOF 文件自动重写的最小文件大小。只有当 AOF 文件大小超过此值时,
aof-load-truncated yes
:- 当 Redis 启动时,如果检测到 AOF 文件末尾损坏(例如由于服务器意外宕机导致),是否加载这个可能被截断的 AOF 文件。
- 默认值为
yes
,Redis 会尽可能加载有效的部分。 - 设置为
no
,则 Redis 会拒绝启动并报错。
aof-use-rdb-preamble yes
(Redis 4.0 及以上版本):- 在 AOF 重写时,是否使用 RDB 格式作为 AOF 文件的前缀。
- 默认值为
yes
。这样可以在 AOF 文件开头存储一个 RDB 快照,使得恢复速度更快。
安全 (Security)
requirepass foobared
:- 设置客户端连接 Redis 时需要使用的密码。
- 强烈建议: 在生产环境中务必设置一个强密码,特别是当 Redis 暴露在公网时。
- 如果设置了密码,客户端连接时需要使用
AUTH <password>
命令进行认证。
rename-command CONFIG ""
:- 重命名或禁用危险命令。
CONFIG
命令可以用来动态修改 Redis 配置,甚至可以用来执行FLUSHALL
等危险操作。- 将命令重命名为一个难以猜到的字符串可以增加安全性。例如
rename-command CONFIG "ajf83nfh4d"
。 - 将命令重命名为空字符串
""
表示禁用该命令。 - 可以重命名其他命令,如
FLUSHALL
,FLUSHDB
,KEYS
(在生产环境数据量大时,KEYS *
可能导致 Redis 阻塞)。
客户端 (Clients)
maxclients 10000
:- 最大客户端连接数。
- 默认值通常足够,但如果应用需要大量并发连接,可以适当调大。
- 注意,每个连接都会消耗一定的系统资源。
内存管理 (Memory Management)
maxmemory <bytes>
:- 设置 Redis 可以使用的最大内存量。
- 当达到内存限制时,Redis 会根据配置的
maxmemory-policy
来移除数据。 - 例如
maxmemory 2gb
。 - 如果不设置,Redis 会尽可能使用所有可用内存。
- 重要: 在 64 位系统上,如果不设置
maxmemory
,Redis 可能会耗尽所有物理内存。在 32 位系统上,单个进程的内存限制通常在 3GB 左右。
maxmemory-policy noeviction
:- 当达到
maxmemory
限制时,数据淘汰策略。可选值有:noeviction
: (默认值) 不淘汰任何数据,对于写操作直接返回错误。allkeys-lru
: 移除最近最少使用的 key (LRU)。volatile-lru
: 只从设置了过期时间的 key 中移除最近最少使用的 key。allkeys-random
: 随机移除一个 key。volatile-random
: 只从设置了过期时间的 key 中随机移除一个 key。volatile-ttl
: 移除即将过期的 key (根据 TTL,剩余存活时间最短的)。allkeys-lfu
(Redis 4.0+): 移除最不经常使用的 key (LFU)。volatile-lfu
(Redis 4.0+): 只从设置了过期时间的 key 中移除最不经常使用的 key。
- 选择合适的淘汰策略取决于您的应用场景。
- 当达到
maxmemory-samples 5
:- 对于 LRU、LFU 和 volatile-ttl 这些基于采样的淘汰策略,每次淘汰时采样的 key 的数量。
- 默认值为
5
。增加采样数量可以提高淘汰的准确性,但会增加 CPU 消耗。
lazyfree-lazy-eviction no
:- 当进行数据淘汰时,是否使用异步方式释放内存。
- 默认值为
no
。设置为yes
可以减少主线程的阻塞时间,特别是在删除大对象时。
lazyfree-lazy-expire no
:- 当 key 过期时,是否使用异步方式释放内存。
- 默认值为
no
。设置为yes
可以减少主线程因删除过期大对象而产生的阻塞。
lazyfree-lazy-server-del no
:- 对于一些由服务器内部触发的删除操作(如
RENAME
命令覆盖已有 key),是否使用异步方式释放内存。 - 默认值为
no
。
- 对于一些由服务器内部触发的删除操作(如
replica-lazy-flush no
(Redis 5.0+) /slave-lazy-flush no
(旧版本):- 当副本在进行全量同步时,清空旧数据时是否使用异步方式。
- 默认值为
no
。
慢查询日志 (Slow Log)
用于记录执行时间超过指定阈值的命令。
slowlog-log-slower-than 10000
:- 慢查询的阈值,单位为微秒 (microseconds)。
- 执行时间超过此值的命令会被记录到慢查询日志中。
- 例如
10000
表示 10 毫秒。 - 设置为
0
会记录所有命令。设置为负数则禁用慢查询日志。
slowlog-max-len 128
:- 慢查询日志的最大条目数。当日志条目达到此数量时,最早的记录会被删除。
Lua 脚本 (Lua Scripting)
lua-time-limit 5000
:- Lua 脚本的最大执行时间,单位为毫秒。
- 如果脚本执行时间超过此限制,Redis 会记录一个错误,并且后续的脚本命令会返回错误,直到执行
SCRIPT KILL
或SHUTDOWN NOSAVE
。 - 注意: 这个限制是为了防止恶意或有 bug 的脚本阻塞服务器。
集群 (Cluster) - 如果使用 Redis Cluster
当 Redis 以集群模式运行时,以下配置项会生效:
cluster-enabled yes
:- 是否启用集群模式。
cluster-config-file nodes-6379.conf
:- 集群配置文件的名称。这个文件由 Redis 自动维护,不需要手动修改。
cluster-node-timeout 15000
:- 集群节点间的超时时间,单位为毫秒。如果一个节点在此时间内无法访问,其他节点会认为它已下线。
cluster-slave-validity-factor 10
/cluster-replica-validity-factor 10
:- 用于判断副本是否仍然有效的因子。
cluster-migration-barrier 1
:- 主节点在迁移槽位给其他主节点前,至少需要连接的副本数量。
cluster-require-full-coverage yes
:- 是否要求集群中所有槽位都被节点覆盖。
- 默认值为
yes
。如果设置为no
,即使部分槽位没有被分配,集群仍然可以继续提供服务(但访问这些未分配槽位的 key 会失败)。
cluster-allow-reads-when-down no
(Redis 5.0+):- 当集群状态为
fail
(例如,由于主节点下线且没有足够的副本进行故障转移),是否允许从副本节点读取数据。 - 默认值为
no
。
- 当集群状态为
哨兵 (Sentinel) - 如果使用 Redis Sentinel
redis.conf
文件本身不用于配置 Sentinel。Sentinel 有自己的配置文件,通常命名为 sentinel.conf
。但是,被 Sentinel 监控的 Redis 主从实例仍然使用 redis.conf
。
加载配置
-
启动时加载: Redis 服务器在启动时会查找并加载
redis.conf
文件。可以通过命令行参数指定配置文件的路径:redis-server /path/to/your/redis.conf
如果不指定配置文件,Redis 会使用内部的默认配置启动。
-
运行时修改 (CONFIG SET):
-
部分配置参数可以在 Redis 运行时通过
CONFIG SET
命令动态修改,而无需重启 Redis。例如:
CONFIG SET loglevel warning CONFIG SET maxmemory 1gb
-
注意: 并非所有参数都支持运行时修改。修改后的配置不会自动保存到
redis.conf
文件中。
-
-
保存运行时配置 (CONFIG REWRITE):
- 可以使用
CONFIG REWRITE
命令将当前运行时生效的配置(包括通过CONFIG SET
修改的)写回到redis.conf
文件中,使其持久化。 - 重要:
CONFIG REWRITE
会重写整个redis.conf
文件,原有的注释和文件结构可能会丢失或改变。建议在执行前备份原配置文件。
- 可以使用
评论区
请登录后发表评论