# Redis
示例配置文件
# 注意单位问题:当需要设置内存大小的时候,可以使用类似 1k
、5GB
、4M
这样的常见格式:
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
# 当配置中需要配置内存大小时,可以使用 1k,5GB,4M 等类似的格式,其内存单位转换方式如下(不区分大小写,比如 1gb 1Gb 1GB 1gB 均可)
# 默认情况下,Redis
不是在后台模式运行的,如果需要在后台进程运行,把该项的值更改为 yes
,默认为 no
。
- daemonize no
# 如 Redis
服务以后台进程运行的时候,Redis
默认会把 pid 写入 /var/run/redis.pid
文件组,你可以配置到其他文件路径。
# 当运行多个 redis
服务时,需要指定不同的 pid
文件和端口
- pidfile /var/run/redis.pid
# 指定 redis
监听端口,默认为 6379。
# 如果端口设置为 0,Redis
就不会监听 TCP
套接字。
- port 6379
# 指定 redis
只接收来自于该 IP
地址的请求,如果不进行设置,默认将处理所有请求,
# 在生产环境中最好设置该项
- # bind 127.0.0.1
# 指定用来监听连接的unxi套接字的路径。这个没有默认值,所以如果不指定的话,Redis就不会通过unix套接字来监听。
- # unixsocket /tmp/redis.sock
- # unixsocketperm 755
# 设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接
# 默认值:0 代表禁用,永不关闭
- timeout 0
# 指定日志记录级别
# Redis
总共支持四个级别:debug
、verbose
、notice
、warning
,默认为 verbose
# debug
记录很多信息,用于开发和测试
# varbose
很多精简的有用信息,不像 debug
会记录那么多
# notice
普通的 verbose
,常用于生产环境
# warning
只有非常重要或者严重的信息会记录到日志
- loglevel verbose
# 配置 log
文件名称和全路径地址
# 默认值为 stdout
,使用“标准输出”,默认后台模式会输出到 /dev/null
- logfile stdout
# 要使用 linux
系统日志记录器很简单,只要设置"syslog-enabled=yes",并且需要设置其他 syslog
参数,默认是 no
- # syslog-enabled no
# 指定linux系统日志syslog的标示符,若是"syslog-enabled=no",则这个选项无效。
- # syslog-ident redis
# 指定 linux
系统日志 syslog
设备(facility), 必须是 USER
或者 LOCAL0
到 LOCAL7
之间
- # syslog-facility local0
# 可用数据库数,默认值为 16,默认数据库存储在 DB 0 号 ID 库中,无特殊需求,建议仅设置一个数据库 databases 1
# 查询数据库使用 SELECT <dbid>
# dbid 介于 0 到 'databases'-1 之间
- databases 16
# 把数据库存到磁盘上:
- # save <seconds> <changes>
# 会在指定秒数和数据变化次数之后把数据库写到磁盘上。
# 下面的例子将会进行把数据写入磁盘的操作:
# 900 秒(15 分钟)之后,且至少有 1 个 key(次)变更
# 300 秒(5 分钟)之后,且至少有 10 个 key(次)变更
# 60 秒之后,且至少有 10000 个 key (次)变更
# 注意:如果不需要写磁盘,则把所有 "save" 设置注释掉,即实现全内存服务器。
- save 900 1
save 300 10
save 60 10000
# 当导出到 .rdb
数据库时是否用 LZF
压缩字符串对象。
# 默认设置为 yes
,
# 如果想节省 CPU
的话,可以把这个设置为 no
,但是如果有可以压缩的 key
却没有压缩的话,那数据文件就会变得更大
- rdbcompression yes
# 数据库的文件名及存放路径
- dbfilename dump.rdb
# 工作目录
# 本地数据库会写到这个目录下,文件名就是上面的 dbfilename
的值。
# 累加文件也放这里。
# 注意你这里指定的必须是目录,不是文件名。
- dir ./
# 主从同步。通过 slaveof
配置来实现 Redis
实例的备份。
# 注意,这里是本地从远端复制数据。也就是说,本地可以有不同的数据库文件、绑定不同的 IP
、监听不同的端口。
# 当本机为从服务时,设置主服务的 IP
及端口,在 Redis
启动时,它会自动从主服务进行数据同步
- # slaveof <masterip> <masterport>
# 如果主服务 master
设置了密码(通过下面的 requirepass
选项来配置),slave
服务连接 master
的密码,那么 slave
在开始同步之前必须进行身份验证,否则它的同步请求会被拒绝。
#当本机为从服务时,设置主服务的连接密码
- # masterauth <master-password>
# 当一个 slave
失去和 master
的连接,或者同步正在进行中,slave
的行为有两种可能:
# 1) 如果 slave-serve-stale-data
设置为 yes
(默认值),slave
会继续响应客户端请求,可能是正常数据,也可能是还没获得值的空数据。
# 2) 如果 slave-serve-stale-data
设置为 no
,slave
会回复"正在从 master
同步(SYNC with master in progress)"来处理各种请求,除了 INFO
和 SLAVEOF
命令。
- slave-serve-stale-data yes
# slave
根据指定的时间间隔向服务器发送 ping
请求。
# 时间间隔可以通过 repl_ping_slave_period
来设置。
# 默认10 秒
- # repl-ping-slave-period 10
# 下面的选项设置了大块数据 I/O
、向 master
请求数据和 ping
响应的过期时间。
# 默认值 60 秒。
# 一个很重要的事情是:确保这个值比 repl-ping-slave-period
大,否则 master
和 slave
之间的传输过期时间比预想的要短。
- # repl-timeout 60
# 要求客户端在处理任何命令时都要验证身份和设置密码。
# 如果你不相信请求者,这个功能很有用。
# 为了向后兼容的话,这段应该注释掉。而且大多数人不需要身份验证(例如:它们运行在自己的服务器上)
# 警告:外部使用者可以每秒尝试 150k
的密码来试图破解密码,这意味着你需要一个*度的密码,否则破解太容易了。
# 设置连接密码
- # requirepass foobared
# 命令重命名,可设置多个
# 在共享环境下,可以为危险命令改变名字。比如,你可以为 CONFIG
改个其他不太容易猜到的名字,这样你自己仍然可以使用,而别人却没法知道它。
# 例如:
- # rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
# rename-command info info_biran
# rename-command set set_biran
# 甚至也可以通过给命令赋值一个空字符串来完全禁用这条命令:
- # rename-command CONFIG ""
# 设置最大同时连接客户端数量。
# 默认没有限制,这个关系到 Redis
进程能够打开的文件描述符数量。
# 特殊值 0 表示没有限制。
# 一旦达到这个限制,Redis
会关闭所有新连接并发送错误"达到最大用户数上限(max number of clients reached)"
- # maxclients 128
# 不要用比设置的上限更多的内存。一旦内存使用达到上限,Redis
会根据选定的回收策略(参见:maxmemmory-policy
:内存策略设置)删除 key
。
# 如果因为删除策略问题 Redis
无法删除 key
,或者策略设置为 noeviction
,Redis
会回复需要更多内存的错误信息给命令。
# 例如:SET
、LPUSH
等等。但是会继续合理响应只读命令,比如:GET
。
# 在使用 Redis
作为 LRU
缓存,或者为实例设置了硬性内存限制的时候(使用 noeviction
策略)的时候,这个选项还是满有用的。
# 警告:当一堆 slave
连上达到内存上限的实例的时候,响应 slave
需要的输出缓存所需内存不计算在使用内存当中。
# 这样当请求一个删除掉的 key
的时候就不会触发网络问题/重新同步的事件,然后 slave
就会收到一堆删除指令,直到数据库空了为止。
# 简而言之,如果你有 slave
连上一个 master
的话,那建议你把 master
内存限制设小点儿,确保有足够的系统内存用作输出缓存。
# (如果策略设置为 noeviction
的话就不无所谓了)
# 设置最大内存,达到最大内存设置后,Redis
会先尝试清除已到期或即将到期的 Key
,当此方法处理后,任到达最大内存设置,将无法再进行写入操作。
# maxmemory 256000000
分配 256M 内存
- # maxmemory <bytes>
# 内存策略:如果达到内存限制了,Redis
如何删除 key
。你可以在下面五个策略里面选:
# volatile-lru ->
根据 LRU
算法生成的过期时间来删除。
# allkeys-lru ->
根据 LRU
算法删除任何 key
。
# volatile-random ->
根据过期设置来随机删除 key
。
# allkeys->random ->
无差别随机删。
# volatile-ttl ->
根据最近过期时间来删除(辅以 TTL
)
# noeviction ->
谁也不删,直接在写操作时返回错误。
# 注意:对所有策略来说,如果 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 volatile-lru
# LRU
和最小 TTL
算法的实现都不是很精确,但是很接近(为了省内存),所以你可以用样例做测试。
# 例如:默认 Redis
会检查三个 key
然后取最旧的那个,你可以通过下面的配置项来设置样本的个数。
- # maxmemory-samples 3
# 默认情况下,Redis
是异步的把数据导出到磁盘上。因为 Redis
本身同步数据文件是按上面 save
条件来同步的,所以有的数据会在一段时间内只存在于内存中,这种情况下,当 Redis
宕机的时候,最新的数据就丢了。
# 如果不希望丢掉任何一条数据的话就该用纯累加模式:一旦开启这个模式,Redis
会把每次写入的数据在接收后都写入 appendonly.aof
文件。
# 每次启动时 Redis
都会把这个文件的数据读入内存里。
# 注意,异步导出的数据库文件和纯累加文件可以并存(此时需要把上面所有 save
设置都注释掉,关掉导出机制)。
# 如果纯累加模式开启了,那么 Redis
会在启动时载入日志文件而忽略导出的 dump.rdb
文件。
# 重要:查看 BGREWRITEAOF
来了解当累加日志文件太大了之后,怎么在后台重新处理这个日志文件。
# 设置:yes
为纯累加模式
- appendonly no
# 设置纯累加文件名字及保存路径,默认:appendonly.aof
- # appendfilename appendonly.aof
# fsync()
请求操作系统马上把数据写到磁盘上,不要再等了。
# 有些操作系统会真的把数据马上刷到磁盘上;有些则要磨蹭一下,但是会尽快去做。
# Redis
支持三种不同的模式:
# no
:不要立刻刷,只有在操作系统需要刷的时候再刷。比较快。
# always
:每次写操作都立刻写入到 aof
文件。慢,但是最安全。
# everysec
:每秒写一次。折衷方案。
# 默认的 everysec
通常来说能在速度和数据安全性之间取得比较好的平衡。
# 如果你真的理解了这个意味着什么,那么设置 no
可以获得更好的性能表现(如果丢数据的话,则只能拿到一个不是很新的快照)
# 或者相反的,你选择 always
来牺牲速度确保数据安全、完整。
# 如果不确定这些模式的使用,建议使用 everysec
- # appendfsync always
- appendfsync everysec
- # appendfsync no
# 如果 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
# Redis
慢查询日志可以记录超过指定时间的查询。运行时间不包括各种 I/O
时间。
# 例如:连接客户端,发送响应数据等。只计算命令运行的实际时间(这是唯一一种命令运行线程阻塞而无法同时为其他请求服务的场景)
# 你可以为慢查询日志配置两个参数:一个是超标时间,单位为微妙,记录超过个时间的命令。
# 另一个是慢查询日志长度。当一个新的命令被写进日志的时候,最老的那个记录会被删掉。
# 下面的时间单位是微秒,所以 1000000 就是 1 秒。注意,负数时间会禁用慢查询日志,而 0 则会强制记录所有命令。
- slowlog-log-slower-than 10000
# 这个长度没有限制。只要有足够的内存就行。你可以通过 SLOWLOG RESET
来释放内存。
- slowlog-max-len 128
### 警告!虚拟内存在 Redis 2.4
是反对的,因性能问题,2.4 版本 VM
机制彻底废弃,不建议使用此配置!!!!!!!!!!!
# 虚拟内存可以使 Redis
在内存不够的情况下仍然可以将所有数据序列保存在内存里。
# 为了做到这一点,高频 key
会调到内存里,而低频 key
会转到交换文件里,就像操作系统使用内存页一样。
# 要使用虚拟内存,只要把 vm-enabled
设置为 yes
,并根据需要设置下面三个虚拟内存参数就可以了。
- vm-enabled no
# 这是交换文件的路径。估计你猜到了,交换文件不能在多个 Redis
实例之间共享,所以确保每个 Redis
实例使用一个独立交换文件。
# 最好的保存交换文件(被随机访问)的介质是固态硬盘(SSD)。
# *** 警告 *** 如果你使用共享主机,那么默认的交换文件放到 /tmp
下是不安全的。
# 创建一个 Redis
用户可写的目录,并配置 Redis
在这里创建交换文件。
- vm-swap-file /tmp/redis.swap
# vm-max-memory
配置虚拟内存可用的最大内存容量。
# 如果交换文件还有空间的话,所有超标部分都会放到交换文件里。
# vm-max-memory
设置为 0 表示系统会用掉所有可用内存,建议设置为剩余内存的 60%-80%。
# 将所有大于 vm-max-memory
的数据存入虚拟内存,无论 vm-max-memory
设置多小,所有索引数据都是内存存储的(Redis
的索引数据就是 keys
),也就是说,当 vm-max-memory
设置为 0 的时候,其实是所有 value
都存在于磁盘。默认值为 0。
- vm-max-memory 0
# Redis
交换文件是分成多个数据页的。
# 一个可存储对象可以被保存在多个连续页里,但是一个数据页无法被多个对象共享。
# 所以,如果你的数据页太大,那么小对象就会浪费掉很多空间。
# 如果数据页太小,那用于存储的交换空间就会更少(假定你设置相同的数据页数量)
# 如果你使用很多小对象,建议分页尺寸为 64 或 32 个字节。
# 如果你使用很多大对象,那就用大一些的尺寸。
# 如果不确定,那就用默认值 :)
- vm-page-size 32
# 交换文件里数据页总数。
# 根据内存中分页表(已用/未用的数据页分布情况),磁盘上每 8 个数据页会消耗内存里 1 个字节。
# 交换区容量 = vm-page-size
* vm-pages
# 根据默认的 32 字节的数据页尺寸和 134217728 的数据页数来算,Redis
的数据页文件会占 4GB,而内存里的分页表会消耗 16MB 内存。
# 为你的应验程序设置最小且够用的数字比较好,下面这个默认值在大多数情况下都是偏大的。
- vm-pages 134217728
# 同时可运行的虚拟内存 I/O
线程数,即访问 swap
文件的线程数。
# 这些线程可以完成从交换文件进行数据读写的操作,也可以处理数据在内存与磁盘间的交互和编码/解码处理。
# 多一些线程可以一定程度上提高处理效率,虽然 I/O
操作本身依赖于物理设备的限制,不会因为更多的线程而提高单次读写操作的效率。
# 特殊值 0 会关闭线程级 I/O
,并会开启阻塞虚拟内存机制。
# 设置最好不要超过机器的核数,如果设置为 0,那么所有对 swap
文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证。
- vm-max-threads 4
# 当有大量数据时,适合用哈希编码(这会需要更多的内存),元素数量上限不能超过给定限制。
# Redis Hash
是 value
内部为一个 HashMap
,如果该 Map
的成员数比较少,则会采用类似一维线性的紧凑格式来存储该Map
,即省去了大量指针的内存开销,如下 2 个条件任意一个条件超过设置值都会转换成真正的 HashMap
。
# 当 value
这个 Map
内部不超过多少个成员时会采用线性紧凑格式存储,默认是 64,即 value
内部有 64 个以下的成员就是使用线性紧凑存储,超过该值自动转成真正的 HashMap
。
- hash-max-zipmap-entries 512
# 当 value
这个 Map
内部的每个成员值长度不超过多少字节就会采用线性紧凑存储来节省空间。
- hash-max-zipmap-value 64
# 与 hash-max-zipmap-entries
哈希相类似,数据元素较少的情况下,可以用另一种方式来编码从而节省大量空间。
# list
数据类型多少节点以下会采用去指针的紧凑存储格式
- list-max-ziplist-entries 512
# list
数据类型节点值大小小于多少字节会采用紧凑存储格式
- list-max-ziplist-value 64
# 还有这样一种特殊编码的情况:数据全是 64 位无符号整型数字构成的字符串。
# 下面这个配置项就是用来限制这种情况下使用这种编码的最大上限的。
- set-max-intset-entries 512
# 与第一、第二种情况相似,有序序列也可以用一种特别的编码方式来处理,可节省大量空间。
# 这种编码只适合长度和元素都符合下面限制的有序序列:
- zset-max-ziplist-entries 128
- zset-max-ziplist-value 64
# 哈希刷新,每 100 个 CPU
毫秒会拿出 1 个毫秒来刷新 Redis
的主哈希表(顶级键值映射表)。
# Redis
所用的哈希表实现采用延迟哈希刷新机制:你对一个哈希表操作越多,哈希刷新操作就越频繁;
# 反之,如果服务器非常不活跃那么也就是用点内存保存哈希表而已。
# 默认是每秒钟进行 10 次哈希表刷新,用来刷新字典,然后尽快释放内存。
# 建议:
# 如果你对延迟比较在意的话就用 activerehashing no
,每个请求延迟 2 毫秒不太好嘛。
# 如果你不太在意延迟而希望尽快释放内存的话就设置 activerehashing yes
。
- activerehashing yes