Redis配置redis.conf详解

237 阅读13分钟

1.network网络配置

bind 127.0.0.1  # 指定redis只接收来自该ip地址的请求,如果不设置,会处理所有请求

protected-mode yes  # 开启保护模式,开启后只本地进行访问,拒绝外部访问,要开启了密码和bind,可开启,否则最好关闭

port 6379  # 监听端口

timeout 0  # 客户端空闲超过则服务端断开连接,为0则服务端不会主动断开连接,不能小于0

daemonize yes  # 设置为在后台运行

pidfile /var/run/redis/redis.pid  # redis的进程文件

loglevel notice  # 指定服务端日志的级别,debug(信息多,开发测试),verbose, notice(适合生产), warn

logfile /usr/local/redis/var/redis.log  # 指定了记录日志的文件,空字符串的话会打印到标准输出设备

database 16  # 数据库的数量,默认使用的数据库是0

2.snapshotting快照配置

# rdb核心规则配置,save <间隔时间> <更新次数>,满足条件将内存中的数据同步到硬盘中
# save ""  # 打开则不使用rdb的持久化方案
save 900 1  # 当900s内有1个更改,将内存数据写入硬盘
save 300 10
save 60 10000

stop-writes-on-bgsaver-error yes  # rdb持久化出现错误是否继续工作

rdbcompression yes  # 配置存储至本地数据库时是否压缩数据,采用lzf压缩方式

rdbchecksum yes  # 是否校验rdb文件,在rdb文件的末尾带上crc64校验和,有利于文件的容错性

dbfilename dump.rdb  # 指定本地数据库文件名,默认采用dump.rdb

dir /usr/local/redis/var  # 数据目录,数据库的写入目录,rdb, aof文件也会写入这个目录

3.replication主从复制配置

replicaof 192.168.1.1 6379  # 复制选项,slave复制对应的master的ip和端口

masterauth 123456  # 如果master设置了requirepass,那么slave要连上,需要master的密码

replica-read-only yes  # 作为从服务器,默认情况下是只读的,可以修改为no(不建议)

repl-diskless-sync no  # 是否使用socket方式复制数据,目前两种方式,disk和socket,磁盘慢,网速快建议用socket

repl-diskless-sync-delay 5  # diskless复制的延迟时间,防止设置为0,一旦复制开始,节点

repl-ping-slave-period 10  # slave根据指定的时间向master发动ping
repl-timeout 60  # 当超过该时间则认为slave离线

repl-disable-tcp-nodelay no  # 是否禁止复制tcp链接的tcp nodelay参数,可传递yes或者no。默认是no,master设置yes则将数据复制到slave的时候,会减少包的数量和更小的网络带宽,但是可能会带来是数据延迟;

repl-backlog-size 1Mb  # 复制缓冲区的大小,这是一个环形复制缓冲区用来保存最新复制数据的命令,这样slave离线的时候,可以使用
repl-bakclog-ttl 3600  # master没有slave多长时间会释放复制缓冲区的内存 ,单位为秒

replica-priority 100  # master不可用的时候,哨兵根据的优先级来选举一个master,优先级最小的当选master,配置为0永远不会当选

min-replicas-to-write 3  # 当健康的slave的数量少于3的时候,master禁止写入,0则关闭该功能
min-replicas-max-lag 10  # 延迟小于10s的slave才被认为是健康的slave

4.security安全配置

requirepass password123456  # 设置了之后需要auth命令认证密码才能使用其他命令,可以让其在不受信的网络使用,可以注释,密码要复杂,因为每秒可认证15万次

rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52  # 将危险命令修改为其他名称,让用户不能使用
rename-command CONFIG ""  # 将命令设置为一个空值,可以禁止一个命令

5.clients客户端配置

maxclients 10000  # 能连接上redis的客户端的最大数量,默认为10000,超过了该数量,新连接会被关闭

6.memory-management内存管理配置

maxmemory 122000000  # 配置的最大内存容量,超过该容量会会配合maxmemory-policy策略进行处理

# 内存容量超过maxmemory后的处理策略
# volatile-lru:利用LRU算法移除设置过过期时间的key
# volatile-random:随机移除设置过过期时间的key
# volatile-ttl:移除即将过期的key,根据最近过期时间来删除(辅以TTL)
# allkeys-lru:利用LRU算法移除任何key
# allkeys-random:随机移除任何key
# noeviction:不移除任何key,只是返回一个写错误
# 上面的这些驱逐策略,如果redis没有合适的key驱逐,对于写命令,还是会返回错误。redis将不再接收写请求,只接收get请求
maxmemory-policy noeviction

maxsamples 6  # 当lru检测的样本数。使用lru或者ttl淘汰算法,从需要淘汰的列表中随机选择sample个key,选出闲置时间最长的key移除

replica-ignore-maxmemory yes  # 是否开启salve的最大内存

7.lazy-freeing懒释放配置

# 以非阻塞方式释放内存, 使用以下配置指令调用了
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no

8.append-only-mode,aof配置

appendonly yes  # 开启aof

appendfilename "appendonly.aof"  # 保存的数据库文件名称

# aof持久化策略的配置
# no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快
# always表示每次写入都执行fsync,以保证数据同步到磁盘
# everysec表示每秒执行一次fsync,可能会导致丢失这1s数据
appendfsync everysec

# 在aof重写或者写入rdb文件的时候,会执行大量IO,此时对于everysec和always的aof模式来说,执行fsync会造成阻塞过长时间,默认设置为no
# 对延迟要求较高的时候设置为yes,这样write期间对新的写操作不进行fsync,暂时存在内存中,等write完成之后再写入,默认fsync策略是30s,可能会丢失30s数据
no-appendfsync-on-write yes

auto-aof-rewrite-min-size 60Mb  # 允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写

# aof文件的尾部可能不完整,如果选择的是yes,当截断的aof文件被导入的时候,会自动发布一个log给客户端然后load
# 如果是no,用户必须手动redis-check-aof修复AOF文件才可以
aof-load-truncated yes

# 加载redis时,可以识别AOF文件以“redis”开头,字符串并加载带前缀的RDB文件,然后继续加载AOF尾巴
auto-use-rdb-preamble yes

9.lua scripting,lua脚本配置

# 如果达到最大时间限制(毫秒),redis会记个log,然后返回error
# 当一个脚本超过了最大时限。只有SCRIPT KILL和SHUTDOWN NOSAVE可以用。第一个可以杀没有调write命令的东西。要是已经调用了write,只能用第二个命令杀
lua-time-limit 5000

10.redis cluster,集群配置

cluster-enabled yes  # 集群模式开关,默认是关闭状态

# 集群配置文件的名称,每个结点都有一个集群相关的配置文件来持久化保存集群的信息,该配置文件由redis自动更新,不必手动配置
# 每个Redis集群节点需要一个单独的配置文件,请确保与实例运行的系统中配置文件名称不冲突
cluster-config-file nodes-6379.conf

cluster-node-timeout 15000  # 结点互连超时的阈值,单位为毫秒

# 故障转移时全部slave申请为master,但有些slave可能与master断开连接一段时间导致数据过于陈旧,则slave不应被提升为master。该参数判断slave与master断线时间是否过长
# 判断方法:比较slave断开连接的时间和(node-timeout * slave-validity-factor) + repl-ping-slave-period, 如果节点超时时间为三十秒, 并且slave-validity-factor为10,假设默认的repl-ping-slave-period是10秒,即如果超过310秒slave将不会尝试进行故障转移
cluster-replica-validity-factor 10

cluster-migration-barrier 1  # master的slave数量大于该值,slave才能迁移到其他孤立master上,若被设为2,只有当一个主节点拥有2个可工作的从节点时,它的一个从节点会尝试迁移


# 默认集群全部的slot有节点负责状态才为ok提供服务。设置为no可以在slot没有全部分配的时候提供服务
# 不建议打开该配置,这样会造成分区的时候,小分区的master一直在接受写请求,而造成很长时间数据不一致
cluster-require-full-coverage no

11.cluster docker/nat support,集群docker和网络配置

cluster-announce-ip 10.1.1.5  # 集群公告IP

cluster-announce-port 6379  # 集群公告端口

cluster-announce-bus-port 6380  # 集群公告总线端口

12.slow log,慢日志配置

# slog log是用来记录redis运行中执行比较慢的命令耗时。当命令的执行超过了指定时间,就记录在slow log中,slog log保存在内存中,所以没有IO操作

slowlog-log-slower-than 10000  # 执行时间比值大的请求记录到slowlog里面,单位是微秒,所以1000000就是1秒,负数时间会禁用慢查询日志,而0则会强制记录所有命令

slowlog-max-len 128  # 慢查询日志长度。当一个新的命令被写进日志的时候最老的那个被删掉。该长度没有限制。只要有足够的内存就行。可通过 SLOWLOG RESET 释放内存

13.latency monitor,延迟监控

# 延迟监控功能是用来监控redis中执行比较缓慢的一些操作,用LATENCY打印redis实例在跑命令时的耗时图表
# 只记录大于等于下边设置的值的操作。0的话,就是关闭监视。默认延迟监控功能是关闭的,如果你需要打开,也可以通过CONFIG SET命令动态设置
latency-monitor-threshold 0

14.event notification, 事件通知

# 键空间通知使得客户端可以通过订阅频道或模式,来接收那些以某种方式改动了 Redis 数据集的事件。因为开启键空间通知功能需要消耗一些 CPU ,所以在默认配置下,该功能处于关闭状态。
# notify-keyspace-events 的参数可以是以下字符的任意组合,它指定了服务器该发送哪些类型的通知:
# K 键空间通知,所有通知以 __keyspace@__ 为前缀
# E 键事件通知,所有通知以 __keyevent@__ 为前缀
# g DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知
# $ 字符串命令的通知
# l 列表命令的通知
# s 集合命令的通知
# h 哈希命令的通知
# z 有序集合命令的通知
# x 过期事件:每当有过期键被删除时发送
# e 驱逐(evict)事件:每当有键因为 maxmemory 政策而被删除时发送
# A 参数 g$lshzxe 的别名
# 输入的参数中至少要有一个 K 或者 E,否则的话,不管其余的参数是什么,都不会有任何通知被分发。详细使用可以参考http://redis.io/topics/notifications
notify-keyspace-events "Kg"

15.advanced config,高级配置

# 数据量小于等于hash-max-ziplist-entries的用ziplist,大于hash-max-ziplist-entries用hash
hash-max-ziplist-entries 512
 
# value大小小于等于hash-max-ziplist-value的用ziplist,大于hash-max-ziplist-value用hash
hash-max-ziplist-value 64

# -5:最大大小:64 KB<--不建议用于正常工作负载
# -4:最大大小:32 KB<--不推荐
# -3:最大大小:16 KB<--可能不推荐
# -2:最大大小:8kb<--良好
# -1:最大大小:4kb<--良好
list-max-ziplist-size -2

# 0: 禁用所有列表压缩
# 1: 深度1表示“在列表中的1个节点之后才开始压缩,从头部或尾部,所以:【head】->node->node->…->node->【tail】[头部],[尾部]将始终未压缩;内部节点将压缩。
# 2: [头部]->[下一步]->节点->节点->…->节点->[上一步]->[尾部], 为:不要压缩头部或头部->下一个或尾部->上一个或尾部,但是压缩它们之间的所有节点。
# 3: [头部]->[下一步]->[下一步]->节点->节点->…->节点->[上一步]->[上一步]->[尾部]
list-compress-depth 0

set-max-intset-entries 512  # 数据量小于等于set-max-intset-entries用iniset,大于set-max-intset-entries用set 

zset-max-ziplist-entries 128  #数据量小于等于zset-max-ziplist-entries用ziplist,大于zset-max-ziplist-entries用zset

zset-max-ziplist-value 64  #value大小小于等于zset-max-ziplist-value用ziplist,大于zset-max-ziplist-value用zset

# value大小小于等于hll-sparse-max-bytes使用稀疏数据结构(sparse),大于hll-sparse-max-bytes使用稠密的数据结构(dense)。一个比16000大的value是几乎没用的,建议的value大概为3000。如果对CPU要求不高,对空间要求较高的,建议设置到10000左右
hll-sparse-max-bytes 3000


stream-node-max-bytes 4096  # 修改Stream中每个宏节点(Macro Node)能够占用的最大内存
stream-node-max-entries 100  # 宏节点中可储存的Stream条目数
 
# Redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash以降低内存使用,当有非常严格的实时性需要而不能接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存
activerehashing yes
 
# 对客户端输出缓冲进行限制可以强迫那些不从服务器读取数据的客户端断开连接,用来强制关闭传输缓慢的客户端
# 对于normal client,第一个0表示取消hard limit,第二个0和第三个0表示取消soft limit,normal client默认取消限制,因为如果没有寻问,他们是不会接收数据的
client-output-buffer-limit normal 0 0 0
 
# 对于slave client和MONITER client,如果client-output-buffer一旦超过256mb,又或者超过64mb持续60秒,那么服务器就会立即断开客户端连接
client-output-buffer-limit replica 256mb 64mb 60
 
# 对于pubsub client,如果client-output-buffer一旦超过32mb,又或者超过8mb持续60秒,那么服务器就会立即断开客户端连接
client-output-buffer-limit pubsub 32mb 8mb 60
 
# 这是客户端查询的缓存极限值大小
client-query-buffer-limit 1gb
 
# 在redis协议中,批量请求,即表示单个字符串,通常限制为512 MB。但是您可以更改此限制
proto-max-bulk-len 512mb
 
#redis执行任务的频率为1s除以hz
hz 10
 
# 当启用动态赫兹时,实际配置的赫兹将用作作为基线,但实际配置的赫兹值的倍数
# 在连接更多客户端后根据需要使用。这样一个闲置的实例将占用很少的CPU时间,而繁忙的实例将反应更灵敏
dynamic-hz yes
 
# 在aof重写的时候,如果打开了aof-rewrite-incremental-fsync开关,系统会每32MB执行一次fsync。这对于把文件写入磁盘是有帮助的,可以避免过大的延迟峰值
aof-rewrite-incremental-fsync yes
 
# 在rdb保存的时候,如果打开了rdb-save-incremental-fsync开关,系统会每32MB执行一次fsync。这对于把文件写入磁盘是有帮助的,可以避免过大的延迟峰值
rdb-save-incremental-fsync yes

16.ACTIVE DEFRAGMENTATION,活动碎片整理

# 已启用活动碎片整理
activedefrag yes

# 启动活动碎片整理的最小碎片浪费量
active-defrag-ignore-bytes 100mb

# 启动活动碎片整理的最小碎片百分比
active-defrag-threshold-lower 10

# 我们使用最大努力的最大碎片百分比
active-defrag-threshold-upper 100

# 以CPU百分比表示的碎片整理的最小工作量
active-defrag-cycle-min 5

# 在CPU的百分比最大的努力和碎片整理
active-defrag-cycle-max 75

# 将从中处理的set/hash/zset/list字段的最大数目
# 主词典扫描
active-defrag-max-scan-fields 1000