Redis配置文件详解

111 阅读12分钟

默认情况下 redis 不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成 y

Redis配置文件详解

一、基本配置

基本配置

`################################ 常用 #####################################`

`# 默认情况下 redis 不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成 yes。`

`# 当redis作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件里面。`

`daemonize no`

` ` 

`# 当redis作为守护进程运行的时候,它会把 pid 默认写到 /var/run/redis.pid 文件里面,`

`# 但是你可以在这里自己制定它的文件位置。`

`pidfile ``/var/run/redis``.pid`

` ` 

`# 监听端口号,默认为 6379,如果你设为 0 ,redis 将不在 socket 上监听任何客户端连接。`

`port 6379`

` ` 

`# TCP 监听的最大容纳数量`

`# 在高并发的环境下,你需要把这个值调高以避免客户端连接缓慢的问题。`

`# Linux 内核会一声不响的把这个值缩小成 /proc/sys/net/core/somaxconn 对应的值,`

`# 所以你要修改这两个值才能达到你的预期。`

`tcp-backlog 511`

` ` 

`# 默认情况下,redis 在 server 上所有有效的网络接口上监听客户端连接。`

`# 你如果只想让它在一个网络接口上监听,那你就绑定一个IP或者多个IP。`

`# bind 127.0.0.1`

` ` 

`# 指定 unix socket 的路径。`

`# unixsocket /tmp/redis.sock`

`# unixsocketperm 755`

` ` 

`# 指定在一个 client 空闲多少秒之后关闭连接(0 就是不管它)`

`timeout 0`

` ` 

`# tcp 心跳包。`

`# 如果设置为非零,则在与客户端缺乏通讯的时候使用 SO_KEEPALIVE 发送 tcp acks 给客户端。`

`# 1) 防止死的资源`

`# 2) 保持存活的链接.`

`# 推荐一个合理的值就是60秒`

`tcp-keepalive 0`

` ` 

`# 定义日志级别。`

`# 可以是下面的这些值:`

`# debug (适用于开发或测试阶段)`

`# verbose (类似info)`

`# notice (适用于生产环境)`

`# warning (仅仅一些重要的消息被记录)`

`loglevel notice`

` ` 

`# 指定日志文件的位置`

`logfile ``"/usr/local/redis-2.8.12/logs"`

` ` 

`# 要想把日志记录到系统日志,就把它改成 yes,`

`# 也可以可选择性的更新其他的syslog 参数以达到你的要求`

`# syslog-enabled no`

` ` 

`# 设置 syslog 的 identity。`

`# syslog-ident redis`

` ` 

`# 设置 syslog 的 facility,必须是 USER 或者是 LOCAL0-LOCAL7 之间的值。`

`# syslog-facility local0`

` ` 

`# 设置数据库的数目。cluster-slave-validity-factor`

`# 默认数据库是 DB 0,你可以在每个连接上使用 select <dbid> 命令选择一个不同的数据库,`

`# 但是 dbid 必须是一个介于 0 到 databasees - 1 之间的值`

`databases 16`

` ` 

`# 如果需要设置密码,那么把这个属性打开`

`# requirepass foobared`

二、持久化配置

持久化配置

`################################## rdb持久化 ################################`

`# rdb方式存储,可以注释掉所有的 save 行来停用保存功能`

`# 900 秒内如果至少有 1 个 key 的值变化,则保存`

`# 300 秒内如果至少有 10 个 key 的值变化,则保存`

`# 60 秒内如果至少有 10000 个 key 的值变化,则保存  `

`save 900 1`

`save 300 10`

`save 60 10000`

` ` 

`# 默认情况下,如果 redis 最后一次的后台保存失败,redis 将停止接受写操作,如果数据准确性要求较高,则设置为yes,如果较低,则设置为no`

`stop-writes-on-bgsave-error ``yes`

` ` 

`# 是否在持久化rdb文件时候使用 LZF 压缩字符串`

`# 默认都设为 yes`

`# 如果你希望保存子进程节省点 cpu ,你就设置它为 no,不过这个数据集可能就会比较大`

`rdbcompression ``yes`

` ` 

`# 是否校验rdb文件`

`rdbchecksum ``yes`

` ` 

`# 设置 dump 的文件位置`

`dbfilename dump.rdb`

` ` 

`# 工作目录`

`# 例如上面的 dbfilename 只指定了文件名,`

`# 但是它会写入到这个目录下。这个配置项一定是个目录,而不能是文件名。`

`dir` `./`

` ` 

`############################## aof持久化 ###############################`

`#如果需要开启aof日志,则打开此配置`

`appendonly no`

` ` 

`#aof文件名称`

`appendfilename ``"appendonly.aof"`

` ` 

`#aof同步命令频率,always为每次命令都写入且同步,everysec为每次写入,每秒同步,no为每次写入,何时同步由操作系统判定`

` ` 

`# appendfsync always`

`# appendfsync everysec`

`# appendfsync no`

` ` 

`# 在默认情况下 当aof进行重写的时候,aof的同步信息不是关闭的`

`# 在这种情况下 。子进程rewrite在写硬盘 主进程 aof也在写硬盘。在rewrite的过程中 子进程对主进程造成了磁盘阻塞(disk io冲突),会造成系统CPU和负载过高问题。`

`# 将no-appendfsync-on-rewrite的配置设为yes可以缓解这个问题,设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入`

`no-appendfsync-on-rewrite no`

` ` 

`# 当 AOF 文件增长到一定大小的时候 Redis 能够调用 BGREWRITEAOF 对日志文件进行重写`

`# 它是这样工作的: Redis 会记住上次进行些日志后文件的大小 ( 如果从开机以来还没进行过重写,那日子大小在开机的时候确定 )`

`# 基础大小会同现在的大小进行比较。如果现在的大小比基础大小大制定的百分比,重写功能将启动`

`# 同时需要指定一个最小大小用于 AOF 重写,这个用于阻止即使文件很小但是增长幅度很大也去重写 AOF 文件的情况`

`# 设置 percentage 为 0 就关闭这个特性`

`auto-aof-rewrite-percentage 100`

` ` 

`#aof重写的大小`

`auto-aof-rewrite-min-size 64mb`

` ` 

`# 当子进程重写AOF文件的时候,以下选项将会允许等到存在32MB数据的时候才调用强制同步`

`# 这样可以降低IO上的延迟`

`aof-rewrite-incremental-fsync ``yes`

三、主从配置

主从复制

`# 主从复制。使用 slaveof 来让一个 redis 实例成为另一个reids 实例的副本。`

`# 注意这个只需要在 slave 上配置。`

`#`

`# slaveof <masterip> <masterport>`

` ` 

`# 如果 master 需要密码认证,就在这里设置`

`# masterauth <master-password>`

` ` 

`# 当一个 slave 与 master 失去联系,或者复制正在进行的时候,`

`# slave 可能会有两种表现:`

`# 1) 如果为 yes ,slave 仍然会应答客户端请求,但返回的数据可能是脏数据或者可能是空的`

`# 2) 如果为 no ,在你执行除了 info he salveof 之外的其他命令时,slave 都将返回一个 "SYNC with master in progress" 的错误,`

`slave-serve-stale-data ``yes`

` ` 

`# 你可以配置一个 slave 实体是否接受写入操作。`

`# 通过写入操作来存储一些短暂的数据对于一个 slave 实例来说可能是有用的,`

`# 因为相对从 master 重新同步数而言,据数据写入到 slave 会更容易被删除。`

`# 但是如果客户端因为一个错误的配置写入,也可能会导致一些问题。`

`# 从 redis 2.6 版起,默认 slaves 都是只读的。`

`slave-``read``-only ``yes`

` ` 

`# Slaves 在一个预定义的时间间隔内发送 ping 命令到 server 。`

`# 你可以改变这个时间间隔。默认为 10 秒。`

`# repl-ping-slave-period 10`

` ` 

`# The following option sets the replication timeout for:`

`# 设置主从复制过期时间`

`# 这个值一定要比 repl-ping-slave-period 大`

`# repl-timeout 60`

` ` 

`#是否会合并主服务器向从服务器同步的数据包,如果设置为yes会减少带宽,但代价是从服务器会有一定延迟与主服务器同步,默认设置为no,主从数据实时同步`

`repl-disable-tcp-nodelay no`

` ` 

`# 设置主从复制缓冲区大小。这个 backlog 是一个用来在 slaves 被断开连接时`

`# 存放 slave 数据的 buffer,所以当一个 slave 想要重新连接,通常不希望全部重新同步,`

`# 只是部分同步就够了,仅仅传递 slave 在断开连接时丢失的这部分数据。`

`# repl-backlog-size 1mb`

` ` 

`# 超过此参数规定时间,则释放复制缓存区内存`

`# repl-backlog-ttl 3600`

` ` 

`# 当 master 不能正常工作的时候,Redis Sentinel 会从 slaves 中选出一个新的 master,`

`# 这个值越小,就越会被优先选中,但是如果是 0 , 那是意味着这个 slave 不可能被选中。`

`# 默认优先级为 100。`

`slave-priority 100`

` ` 

`# 下面的值用来设置主服务器停止接受写入事件的情况`

`# 比如少于3个从实例,延迟大于十秒情况下停止主服务器写入`

`# 默认min-slaves-to-write 设置为0(关闭这个特性)`

`# min-slaves-to-write 3`

`# min-slaves-max-lag 10`

四、内存、连接数限制配置

内存、客户端连接数

`################################### 内存、客户端连接数 ####################################`

` ` 

`# 一旦达到最大限制,redis 将关闭所有的新连接`

`# 并发送一个'max number of clients reached'的错误。`

`# maxclients 10000`

` ` 

`# 最大使用内存`

`# maxmemory <bytes>`

` ` 

`# 内存淘汰策略,默认值如下`

`# maxmemory-policy volatile-lru`

`# 备选项如下`

`# volatile-lru -> 使用 LRU 算法移除包含过期设置的 key 。`

`# allkeys-lru -> 根据 LRU 算法移除所有的 key (当业务没有设置过期时间时候,服务端可以设置此参数保证redis能够继续正常使用)。`

`# volatile-random -> 随机删除一个过期的key`

`# allkeys-random -> 随机删除任意一个key`

`# volatile-ttl -> 删除最长超时时间的key`

`# noeviction -> 不让任何 key 过期,只是给写入操作返回一个错误`

 

`# LRU和最小TTL算法都不是精确的算法,但是是近似的算法,`

`# 因此你可以选择一些样本大小来进行测试,对于一个默认的redis实例`

`# 将会选选择5个key,并且挑选其中之一作为最近最少的Key,你可以使用如下参数修改例子的数量大小`

`# maxmemory-samples 3`

 

五、集群配置

集群配置

`################################## REDIS 集群  ###############################`

`# 启用或停用集群`

`# cluster-enabled yes`

` ` 

`# 集群文件`

`# cluster-config-file nodes-6379.conf`

` ` 

`# 集群节点超时时间`

`# cluster-node-timeout 15000`

` ` 

`# 控制从节点FailOver相关的设置,设置为0,从节点一直试启动FailOver.`

`# cluster-slave-validity-factor 10`

` ` 

`# 最小从节点连接数`

`# cluster-migration-barrier 1`

 

六、LUA脚本、慢日志配置

LUA脚本、慢日志配置

`################################ LUA脚本 ###############################`

`lua-``time``-limit 5000`

`################################## 慢日志 ###################################`

`#慢日志的最小时间,超过此单位数量会认定为慢查询,单位为微妙`

`slowlog-log-slower-than 10000`

` ` 

`#记录的列表长度`

`slowlog-max-len 128`

`############################# key变化事件通知 ##############################`

`#对于一个实例,如果键空间事件通知是启用状态,当一个客户端执行在一个`

`#存储在Database 0名为"foo"的key的DEL(删除)操作时,`

`#有如下两条信息将会通过发布订阅系统产生`

`#`

`# PUBLISH __keyspace@0__:foo del`

`# PUBLISH __keyevent@0__:del foo`

`#`

`# 以下是可选的redis事件通知,每个类别的事件可以由一个字符进行描述`

`#`

`#  K     Keyspace events, published with __keyspace@<db>__ prefix.`

`#  E     Keyevent events, published with __keyevent@<db>__ prefix.`

`#  g     Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...`

`#  $     String commands`

`#  l     List commands`

`#  s     Set commands`

`#  h     Hash commands`

`#  z     Sorted set commands`

`#  x     Expired events (events generated every time a key expires)`

`#  e     Evicted events (events generated when a key is evicted for maxmemory)`

`#  A     Alias for g$lshzxe, so that the "AKE" string means all the events.`

`#`

`# 启用 list 和 generic 事件,`

`# notify-keyspace-events Elg`

`#`

`# 要想订阅通道名为__keyevent@0__:expired 上expired keys的事件:`

`# notify-keyspace-events Ex`

`#`

`# 默认不启用所有的通知,因为大部分的用户不需要这些功能,而且这些功能会带来一些开销`

`#`

`# 如果你没有指定 K 或者 E,没有事件会被传递`

`#`

`notify-keyspace-events ``""`

 

七、高级配置

高级配置

`############################### ADVANCED CONFIG ###############################`

` ` 

`#创建空白哈希表时,程序默认使用 REDIS_ENCODING_ZIPLIST 编码,当以下任何一个条件被满足时,程序将编码从切换为 REDIS_ENCODING_HT`

`#哈希表中某个键或某个值的长度大于 server.hash_max_ziplist_value (默认值为 64)。`

`#压缩列表中的节点数量大于 server.hash_max_ziplist_entries (默认值为 512 )。`

`hash``-max-ziplist-entries 512`

`hash``-max-ziplist-value 64`

` ` 

`#同哈希表一样,默认使用REDIS_ENCODING_ZIPLIST 编码,当以下任何一个条件被满足时,程序将编码从切换为REDIS_ENCODING_LINKDELIST`

`list-max-ziplist-entries 512`

`list-max-ziplist-value 64`

` ` 

`# 当一个set仅仅由一个基数为10最大位数为64位的有符号整形的字符串构成的时候`

`# 以下配置设置了set的限制大小,当小于这个值的时候将会使用一个更紧凑的数据结构来保存,以期减少内存占用`

`set``-max-intset-entries 512`

` ` 

`# 同哈希和list,如果不满足则切换至REDIS_ENCODING_SKIPLIST编码`

`zset-max-ziplist-entries 128`

`zset-max-ziplist-value 64`

` ` 

`# HyperLogLog 稀疏表示字节限制`

`# 这个限制包含了16个字节的头部,当一个HyperLogLog使用sparse representation`

`# 超过了这个显示,它就会转换到dense representation上`

`hll-sparse-max-bytes 3000`

` ` 

`# 是否启用渐进rehash,默认为启用`

`activerehashing ``yes`

` ` 

`# 在两种情况下服务器认为客户端不是意外临时掉线`

`# 1.缓冲区的数据达到硬限制`

`# 2.缓冲区的数据达到软限制,同时时间超过了指定值`

`# 因为一个客户离线,有可能是临时性的网络故障,或者传输问题`

`# 也有可能是永久性离线 或者强制性离线,此时服务器将不会保留他的缓存数据`

`# 以下的设置就是为了判断这一情况的,硬限制和软限制都可以通过将其设置为0来关闭掉`

`client-output-buffer-limit normal 0 0 0`

`client-output-buffer-limit slave 256mb 64mb 60`

`client-output-buffer-limit pubsub 32mb 8mb 60`

` ` 

`# redis会按照一定的频率来处理诸如关闭超时连接,清理没有被使用的过期key等等此类后台任务`

`# 并不是所有的任务都以相同的频率来执行的,redis通过一个hz的值来决定处理这些(如上所述的后台任务)任务的频率`

`# 提高这个值会使用更多的cpu时间来在redis闲置的时候处理以上的,但是以此同时超时的连接的处理和过期key的清理则会更精确`

`# hz的取值范围在1到500,不建议设置为超过100的值,默认是10`

`hz 10`