默认情况下 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`