Redis07_Redis.conf详解

redis.conf是Redis服务器的配置文件,用于自定义Redis行为,涵盖网络、安全、持久化、内存管理等关键参数。重要配置包括监听地址(bind)、端口(port)、持久化方式(RDB/AOF)、内存限制(maxmemory)及淘汰策略(maxmemory-policy)等。正确配置可优化性能、保障数据安全与高可用性。支持运行时修改并通过CONFIG REWRITE保存。

作品集: Redis学习
作者头像
LumiBee
22 天前 · 53 0
分享

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 ""
  • 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: 由操作系统决定何时同步,速度最快,但数据丢失风险最大。
  • no-appendfsync-on-rewrite no:
    • 在进行 AOF 重写(BGREWRITEAOF)期间,是否禁止 appendfsync
    • 默认值为 no。如果设置为 yes,在 AOF 重写期间,新的写操作会暂存在内存中,而不是立即同步到磁盘,这可以减少重写期间的磁盘 I/O 压力,但会增加数据丢失的风险(如果此时 Redis 宕机)。
  • 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-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 KILLSHUTDOWN 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 文件,原有的注释和文件结构可能会丢失或改变。建议在执行前备份原配置文件。
阅读量: 53

评论区

登录后发表评论

正在加载评论...
相关阅读

暂无相关文章推荐

返回首页浏览更多文章