单位
- # 当你需要为某个配置项指定内存大小的时候, 必须要带上单位,
- # 通常的格式就是 1k 5gb 4m 等:
- #1k => 1000 bytes
- #1kb => 1024 bytes
- #1m => 1000000 bytes
- #1mb => 10241024 bytes
- #1g => 1000000000 bytes
- #1gb => 10241024*1024 bytes
文件引入
- # 引入其他的配置文件
- #include /path/to/local.conf
- #include /path/to/other.conf
模块加载
- # 启动时加载模块
- #loadmodule /path/to/my_module.so
- #loadmodule /path/to/other_module.so
网络
- # 指定 Redis 只能接受来自此 IP 绑定的网卡的请求, 注意此默认值默认外网是不可访问的
- bind 127.0.0.1
- # 是否开启保护模式. 如果没有指定 bind 和密码, Redis 只会本地进行访问, 拒绝外部访问.
- protected-mode yes
- # 默认端口, 建议生产环境不要使用默认端口避免被恶意扫描到
- port 6379
- #TCP 连接中已完成队列 (完成三次握手之后) 的长度
- tcp-backlog 511
- # 配置 unix socket 来让 Redis 支持监听本地连接.
- #unixsocket /tmp/Redis.sock
- # 配置 unix socket 使用文件的权限
- #unixsocketperm 700
- # 客户端连接空闲超过 timeout 将会被断开, 为 0 则断开
- timeout 0
- #tcp keepalive 参数
- tcp-keepalive 300
基本配置
- # 是否后台启动
- daemonize no
- # 可以通过 upstart 和 systemd 管理 Redis 守护进程
- # 选项:
- #supervised no - 没有监督互动
- #supervised upstart - 通过将 Redis 置于 SIGSTOP 模式来启动信号
- #supervised systemd - signal systemd 将 READY = 1 写入 $ NOTIFY_SOCKET
- #supervised auto - 检测 upstart 或 systemd 方法基于 UPSTART_JOB 或 NOTIFY_SOCKET 环境变量
- supervised no
- # 配置 PID 文件路径
- pidfile /var/run/redis_6379.pid
- # 日志级别
- # 参数:
- # debug
- # verbose
- # notice
- # warning
- loglevel notice
- # 日志文件
- logfile ""
- # 是否打开记录 syslog 功能
- #syslog-enabled no
- #syslog 标识符
- #syslog-ident Redis
- # 日志的来源
- #syslog-facility local0
- # 数据库的数量, 默认使用的数据库是 DB 0
- # 可以通过 "SELECT" 命令选择一个 db
- # 集群环境默认只有 DB 0
- databases 16
- # 是否一直显示 logo
- always-show-logo yes
数据持久化 RDB
- # 保存数据到磁盘:
- #save
- #Will save the DB if both the given number of seconds and the given
- #number of write operations against the DB occurred.
- #In the example below the behaviour will be to save:
- #15 分钟有一个 key 发生变化就保存数据到磁盘
- #after 900 sec (15 min) if at least 1 key changed
- #5 分钟有 10 个 key 发生变化就保存数据到磁盘
- #after 300 sec (5 min) if at least 10 keys changed
- #1 分钟有 10000 个 key 发生变化就保存数据到磁盘
- #after 60 sec if at least 10000 keys changed
- #Note: you can disable saving completely by commenting out all "save" lines.
- # 还可以删除所有以前配置的保存.
- # 通过添加带有单个空字符串参数的保存指令
- #like in the following example:
- save 900 1
- save 300 10
- save 60 10000
- # 持久化出现错误后, 是否依然进行继续进行工作
- stop-writes-on-bgsave-error yes
- # 是否校验 rdb 文件
- rdbcompression yes
- # 使用压缩 rdb 文件, rdb 文件压缩使用 LZF 压缩算法,
- rdbchecksum yes
- #rdb 文件名称
- dbfilename dump.rdb
- #rdb 使用上面的 "dbfilename 配置指令的文件名保存到这个目录
- dir ./
主从复制
- # 指定主节点. 旧版本是: slaveof
- #replicaof
- #master 的密码
- #masterauth
- # 当一个 slave 失去和 master 的连接, 或者同步正在进行中, slave 的行为有两种可能:
- # 如果 replica-serve-stale-data 设置为 "yes" (默认值),slave 会继续响应客户端请求, 可能是正常数据, 也可能是还没获得值的空数据.
- # 如果 replica-serve-stale-data 设置为 "no",slave 会回复 "正在从 master 同步(SYNC with master in progress)" 来处理各种请求, 除了 INFO 和 SLAVEOF 命令.
- replica-serve-stale-data yes
- # 配置从是否为只读, 开启后从则不能写入数据, 旧版本是: slave-read-only yes
- replica-read-only yes
- # 同步策略: 磁盘或 socket, 默认磁盘方式
- repl-diskless-sync no
- # 如果非磁盘同步方式开启, 可以配置同步延迟时间, 以等待 master 产生子进程通过 socket 传输 RDB 数据给 slave.
- # 默认值为 5 秒, 设置为 0 秒则每次传输无延迟.
- repl-diskless-sync-delay 5
- #slave 根据指定的时间间隔向 master 发送 ping 请求. 默认 10 秒.
- #repl-ping-replica-period 10
- # 同步的超时时间
- #slave 在与 master SYNC 期间有大量数据传输, 造成超时
- # 在 slave 角度, master 超时, 包括数据, ping 等
- # 在 master 角度, slave 超时, 当 master 发送 REPLCONF ACK pings# 确保这个值大于指定的 repl-ping-slave-period, 否则在主从间流量不高时每次都会检测到超时
- #repl-timeout 60
- # 是否在 slave 套接字发送 SYNC 之后禁用 TCP_NODELAY
- # 如果选择 yes,Redis 将使用更少的 TCP 包和带宽来向 slaves 发送数据. 但是这将使数据传输到 slave 上有延迟, Linux 内核的默认配置会达到 40 毫秒.
- # 如果选择 no, 数据传输到 salve 的延迟将会减少但要使用更多的带宽.
- # 默认我们会为低延迟做优化, 但高流量情况或主从之间的跳数过多时, 可以设置为 "yes".
- repl-disable-tcp-nodelay no
- # 设置数据备份的 backlog 大小
- #repl-backlog-size 1mb
- # 从最后一个 slave 断开开始计时多少秒后, backlog 缓冲将会释放.
- #repl-backlog-ttl 3600
- # 优先级
- replica-priority 100
- # 如果 master 少于 N 个延时小于等于 M 秒的已连接 slave, 就可以停止接收写操作.
- #N 个 slave 需要是 "oneline" 状态.
- # 延时是以秒为单位, 并且必须小于等于指定值, 是从最后一个从 slave 接收到的 ping(通常每秒发送)开始计数.
- # 该选项不保证 N 个 slave 正确同步写操作, 但是限制数据丢失的窗口期.
- # 例如至少需要 3 个延时小于等于 10 秒的 slave 用下面的指令:
- #min-replicas-to-write 3
- #min-replicas-max-lag 10
安全
- # 密码
- #requirepass foobared
- # 命令重命名
- # 设置命令为空时禁用命令
- #rename-command CONFIG ""
限制
- # 设置最多同时连接的客户端数量
- #maxclients 10000
- # 内存限制
- #maxmemory
- # 如果达到上方最大的内存限制, Redis 如何选择删除 key
- #volatile-lru -> 根据 LRU 算法删除设置过期时间的 key
- #allkeys-lru -> 根据 LRU 算法删除任何 key
- #volatile-random -> 随机移除设置过过期时间的 key
- #allkeys-random -> 随机移除任何 key
- #volatile-ttl -> 移除即将过期的 key(minor TTL)
- #noeviction -> 不移除任何 key, 只返回一个写错误
- # 注意: 对所有策略来说, 如果 Redis 找不到合适的可以删除的 key 都会在写操作时返回一个错误.
- # 目前为止涉及的命令: set setnx setex append incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby getset mset msetnx exec sort
- #maxmemory-policy noeviction
- #LRU 和最小 TTL 算法的样本个数
- #maxmemory-samples 5
懒删除
- # 内存满逐出
- lazyfree-lazy-eviction no
- # 过期 key 删除
- lazyfree-lazy-expire no
- # 内部删除, 比如 rename oldkey newkey 时, 如果 newkey 存在需要删除 newkey
- lazyfree-lazy-server-del no
- # 接收完 RDB 文件后清空数据选项
- replica-lazy-flush no
持久化方式 AOF
- # 每次启动时 Redis 都会先把这个文件的数据读入内存里, 先忽略 RDB 文件
- appendonly no
- #AOF 文件名称
- appendfilename "appendonly.aof"
- #fsync() 系统调用告诉操作系统把数据写到磁盘上, 而不是等更多的数据进入输出缓冲区.
- # 有些操作系统会真的把数据马上刷到磁盘上; 有些则会尽快去尝试这么做.
- #Redis 支持三种不同的模式:
- #no: 不要立刻刷, 只有在操作系统需要刷的时候再刷. 比较快.
- #always: 每次写操作都立刻写入到 aof 文件. 慢, 但是最安全.
- #everysec: 每秒写一次. 折中方案.
- # 默认的 "everysec" 通常来说能在速度和数据安全性之间取得比较好的平衡.
- appendfsync everysec
- # 如果 AOF 的同步策略设置成 "always" 或者 "everysec", 并且后台的存储进程 (后台存储或写入 AOF 日志) 会产生很多磁盘 I/O 开销. 某些 Linux 的配置下会使 Redis 因为 fsync()系统调用而阻塞很久.
- # 注意, 目前对这个情况还没有完美修正, 甚至不同线程的 fsync() 会阻塞我们同步的 write(2)调用.
- # 为了缓解这个问题, 可以用下面这个选项. 它可以在 BGSAVE 或 BGREWRITEAOF 处理时阻止 fsync().
- # 这就意味着如果有子进程在进行保存操作, 那么 Redis 就处于 "不可同步" 的状态.
- # 这实际上是说, 在最差的情况下可能会丢掉 30 秒钟的日志数据.(默认 Linux 设定)
- # 如果把这个设置成 "yes" 带来了延迟问题, 就保持 "no", 这是保存持久数据的最安全的方式.
- no-appendfsync-on-rewrite no
- # 自动重写 AOF 文件. 如果 AOF 日志文件增大到指定百分比, Redis 能够通过 BGREWRITEAOF 自动重写 AOF 日志文件.
- # 工作原理: Redis 记住上次重写时 AOF 文件的大小(如果重启后还没有写操作, 就直接用启动时的 AOF 大小)
- # 这个基准大小和当前大小做比较. 如果当前大小超过指定比例, 就会触发重写操作.
- # 你还需要指定被重写日志的最小尺寸, 这样避免了达到指定百分比但尺寸仍然很小的情况还要重写.
- # 指定百分比为 0 会禁用 AOF 自动重写特性.
- auto-aof-rewrite-percentage 100
- # 文件达到大小阈值的时候进行重写
- auto-aof-rewrite-min-size 64mb
- # 如果设置为 yes, 如果一个因异常被截断的 AOF 文件被 Redis 启动时加载进内存, Redis 将会发送日志通知用户
- # 如果设置为 no,erdis 将会拒绝启动. 此时需要用 "redis-check-aof" 工具修复文件.
- aof-load-truncated yes
- # 加载时 Redis 识别出 AOF 文件以 "REDIS" 开头字符串,
- # 并加载带此前缀的 RDB 文件, 然后继续加载 AOF
- aof-use-rdb-preamble yes
Lua 脚本配置
- #Lua 脚本的最大执行毫秒数
- lua-time-limit 5000
集群
- # 开启 Redis 集群
- #cluster-enabled yes
- # 配置 Redis 自动生成的集群配置文件名. 确保同一系统中运行的各 Redis 实例该配置文件不要重名.
- #cluster-config-file nodes-6379.conf
- # 集群节点超时毫秒数
- #cluster-node-timeout 15000
- # 如果数据太旧, 集群中的不可用 master 的 slave 节点会避免成为备用 master. 如果 slave 和 master 失联时间超过:(node-timeout * slave-validity-factor) + repl-ping-slave-period 则不会被提升为 master.
- # 如 node-timeout 为 30 秒, slave-validity-factor 为 10, 默认 default repl-ping-slave-period 为 10 秒, 失联时间超过 310 秒 slave 就不会成为 master.
- # 较大的 slave-validity-factor 值可能允许包含过旧数据的 slave 成为 master, 同时较小的值可能会阻止集群选举出新 master.
- # 为了达到最大限度的高可用性, 可以设置为 0, 即 slave 不管和 master 失联多久都可以提升为 master
- #cluster-replica-validity-factor 10
- # 只有在之前 master 有其它指定数量的工作状态下的 slave 节点时, slave 节点才能提升为 master. 默认为 1(即该集群至少有 3 个节点, 1 master+2 slaves,master 宕机, 仍有另外 1 个 slave 的情况下其中 1 个 slave 可以提升)
- # 测试环境可设置为 0, 生成环境中至少设置为 1
- #cluster-migration-barrier 1
- # 默认情况下如果 Redis 集群如果检测到至少有 1 个 hash slot 不可用, 集群将停止查询数据.
- # 如果所有 slot 恢复则集群自动恢复.
- # 如果需要集群部分可用情况下仍可提供查询服务, 设置为 no.
- #cluster-require-full-coverage yes
- # 选项设置为 yes 时, 会阻止 replicas 尝试对其 master 在主故障期间进行故障转移
- # 然而, master 仍然可以执行手动故障转移, 如果强制这样做的话.
- #cluster-replica-no-failover no
Docker 集群配置
- # 默认情况下, Redis 会自动检测自己的 IP 和从配置中获取绑定的 PORT, 告诉客户端或者是其他节点.
- # 而在 Docker 环境中, 如果使用的不是 host 网络模式, 在容器内部的 IP 和 PORT 都是隔离的, 那么客户端和其他节点无法通过节点公布的 IP 和 PORT 建立连接.
- # 如果开启以下配置, Redis 节点会将配置中的这些 IP 和 PORT 告知客户端或其他节点. 而这些 IP 和 PORT 是通过 Docker 转发到容器内的临时 IP 和 PORT 的.
- #cluster-announce-ip
- #cluster-announce-port
- # 集群总线端口
- #cluster-announce-bus-port
慢查询日志
- # 记录超过多少微秒的查询命令
- #1000000 等于 1 秒, 设置为 0 则记录所有命令
- slowlog-log-slower-than 10000
- # 记录大小, 可通过 SLOWLOG RESET 命令重置
- slowlog-max-len 128
延时监控系统
- # 记录执行时间大于或等于预定时间 (毫秒) 的操作, 为 0 时不记录
- latency-monitor-threshold 0
事件通知
- #Redis 能通知 Pub/Sub 客户端关于键空间发生的事件, 默认关闭
- notify-keyspace-events ""
内部数据结构
- # 当 hash 只有少量的 entry 时, 并且最大的 entry 所占空间没有超过指定的限制时, 会用一种节省内存的
- # 数据结构来编码. 可以通过下面的指令来设定限制
- hash-max-ziplist-entries 512
- hash-max-ziplist-value 64
- # 当取正值的时候, 表示按照数据项个数来限定每个 quicklist 节点上的 ziplist 长度. 比如, 当这个参数配置
- # 成 5 的时候, 表示每个 quicklist 节点的 ziplist 最多包含 5 个数据项.
- # 当取负值的时候, 表示按照占用字节数来限定每个 quicklist 节点上的 ziplist 长度. 这时, 它只能取 - 1 到 - 5
- # 这五个值, 每个值含义如下:
- #-5: 每个 quicklist 节点上的 ziplist 大小不能超过 64 Kb.(注: 1kb => 1024 bytes)
- #-4: 每个 quicklist 节点上的 ziplist 大小不能超过 32 Kb.
- #-3: 每个 quicklist 节点上的 ziplist 大小不能超过 16 Kb.
- #-2: 每个 quicklist 节点上的 ziplist 大小不能超过 8 Kb.(-2 是 Redis 给出的默认值)
- #-1: 每个 quicklist 节点上的 ziplist 大小不能超过 4 Kb.
- list-max-ziplist-size -2
- # 这个参数表示一个 quicklist 两端不被压缩的节点个数.
- # 注: 这里的节点个数是指 quicklist 双向链表的节点个数, 而不是指 ziplist 里面的数据项个数.
- # 实际上, 一个 quicklist 节点上的 ziplist, 如果被压缩, 就是整体被压缩的.
- # 参数 list-compress-depth 的取值含义如下:
- #0: 是个特殊值, 表示都不压缩. 这是 Redis 的默认值.
- #1: 表示 quicklist 两端各有 1 个节点不压缩, 中间的节点压缩.
- #2: 表示 quicklist 两端各有 2 个节点不压缩, 中间的节点压缩.
- #3: 表示 quicklist 两端各有 3 个节点不压缩, 中间的节点压缩.
- # 依此类推...
- # 由于 0 是个特殊值, 很容易看出 quicklist 的头节点和尾节点总是不被压缩的, 以便于在表的两端进行快速存取.
- list-compress-depth 0
- #set 有一种特殊编码的情况: 当 set 数据全是十进制 64 位有符号整型数字构成的字符串时.
- # 下面这个配置项就是用来设置 set 使用这种编码来节省内存的最大长度.
- set-max-intset-entries 512
- # 与 hash 和 list 相似, 有序集合也可以用一种特别的编码方式来节省大量空间.
- # 这种编码只适合长度和元素都小于下面限制的有序集合
- zset-max-ziplist-entries 128
- zset-max-ziplist-value 64
- #HyperLogLog 稀疏结构表示字节的限制. 该限制包括
- #16 个字节的头. 当 HyperLogLog 使用稀疏结构表示
- # 这些限制, 它会被转换成密度表示.
- # 值大于 16000 是完全没用的, 因为在该点
- # 密集的表示是更多的内存效率.
- # 建议值是 3000 左右, 以便具有的内存好处, 减少内存的消耗
- hll-sparse-max-bytes 3000
- #Streams 宏节点最大大小 / 项目. 流数据结构是基数编码内部多个项目的大节点树. 使用此配置
- # 可以配置单个节点的字节数, 以及切换到新节点之前可能包含的最大项目数
- # 追加新的流条目. 如果以下任何设置设置为 0, 忽略限制, 因此例如可以设置一个
- # 大入口限制将 max-bytes 设置为 0, 将 max-entries 设置为所需的值
- stream-node-max-bytes 4096
- stream-node-max-entries 100
- # 启用哈希刷新, 每 100 个 CPU 毫秒会拿出 1 个毫秒来刷新 Redis 的主哈希表(顶级键值映射表)
- activerehashing yes
- # 客户端的输出缓冲区的限制, 可用于强制断开那些因为某种原因从服务器读取数据的速度不够快的客户端
- client-output-buffer-limit normal 0 0 0
- client-output-buffer-limit slave 256mb 64mb 60
- client-output-buffer-limit pubsub 32mb 8mb 60
- # 客户端查询缓冲区累积新命令. 它们仅限于固定的默认情况下,
- # 多数情况下为了避免协议不同步导致客户端查询缓冲区中未绑定的内存使用量的错误
- # 但是, 如果你有使用的话, 你可以在这里配置它, 比如我们有很多执行请求或类似的.
- #client-query-buffer-limit 1gb
- # 在 Redis 协议中, 批量请求, 即表示单个的元素 strings, 通常限制为 512 MB.
- # 但是, 您可以 z 更改此限制
- #proto-max-bulk-len 512mb
- # 默认情况下,"hz" 的被设定为 10. 提高该值将在 Redis 空闲时使用更多的 CPU 时, 但同时当有多个 key
- # 同时到期会使 Redis 的反应更灵敏, 以及超时可以更精确地处理
- hz 10
- # 开启动态 hz
- dynamic-hz yes
- # 当一个子进程重写 AOF 文件时, 如果启用下面的选项, 则文件每生成 32M 数据会被同步
- aof-rewrite-incremental-fsync yes
- # 当 Redis 保存 RDB 文件时, 如果启用了以下选项, 每生成 32 MB 数据, 文件将被 fsync-ed.
- # 这很有用, 以便以递增方式将文件提交到磁盘并避免大延迟峰值.
- rdb-save-incremental-fsync yes
碎片整理
- # 启用主动碎片整理
- #activedefrag yes
- # 启动活动碎片整理的最小碎片浪费量
- #active-defrag-ignore-bytes 100mb
- # 启动碎片整理的最小碎片百分比
- #active-defrag-threshold-lower 10
- # 使用最大消耗时的最大碎片百分比
- #active-defrag-threshold-upper 100
- # 在 CPU 百分比中进行碎片整理的最小消耗
- #active-defrag-cycle-min 5
- # 磁盘碎片整理的最大消耗
- #active-defrag-cycle-max 75
- # 将从主字典扫描处理的最大 set / hash / zset / list 字段数
- #active-defrag-max-scan-fields 1000
来源: https://www.qcloud.com/developer/article/1423727