初识Redis(三)
redis.windows.conf配置文件
# Redis 配置文件示例 # 注意单位:当需要配置内存大小是,可能需要制定像1K,5G,4M等常见格式 # # 1k => 1000 bytes # 1kb => 1024 bytes # 1m => 1000000 bytes # 1mb => 1024*1024 bytes # 1g => 1000000000 bytes # 1gb => 1024*1024*1024 bytes # # 单位是对大小写不敏感的 1GB 1Gb 1gB 的写法都是完全一样的. # Redis默认不会作为守护进程来运行。如果需要的话可以配置成'yes' # 注意:配置成守护进程后,Redis会将进程写入文件 /var/run/redis.pid. daemonize no # 当以守护进程方式运行时,默认Redis会把进程ID默认写到 /var/run/redis.pid # 你可以在这里修改路径 pidfile /var/run/redis.pid # 接受连接的特定端口,默认 6379. # 如果端口设置为0,Redis就不会监听TCP套接字 port 6479 # 默认Redis监听服务器上所有可用网络接口的连接,可以用“bind”配置指令跟一个或多个ip地址来实现 # 监听一个或多个网络接口. # # bind 127.0.0.1 # 指定用来监听Unix套接字的路径,没有默认值,如果没有指定的情况下,Redis不会监听Unix套接字 # # unixsocket /tmp/redis.sock # unixsocketperm 755 # 一个客户端空闲多少秒后关闭连接(0代表禁用,永不关闭) timeout 0 # 指定服务器调试等级 # 可能值: # debug (大量数据,对开发/测试有用) # verbose (很多精简的有用信息,但是不像debug等级那么多) # notice (适量的信息,基本上是你生产环境中需要的) # warning (只有很重要/严重的信息会记录下来) loglevel notice # 指明日志文件名。也可以使用“stdout”来强制让Redis把日志信息写到标准输出上。 # 注意:如果Redis以守护进程方式运行,而设置日志显示到标准输出的话, # 那么日志会发送到 /dev/null logfile stdout # 要使用系统日志记录器很简单,只要设置 'syslog-enabled' 为“yes”就可以了。 # 然后根据需要设置其他一些syslog参数就可以了. # syslog-enabled no # 指明syslog身份 # syslog-ident redis # 指明syslog的设备. 必须是一个用户或者“LOCAL0-LOCAL7”之一 # syslog-facility local0 # 设置数据库个数。默认数据库是 DB 0 # 可以通过select<dbid> where dbid(0~'databases'-1)来为每个连接使用不同的数据库。 databases 16 ################################ SNAPSHOTTING ################################# # # 把数据保存到磁盘上: # # save <seconds> <changes> # # 会在指定秒数和数据变化次数之后把数据库写在磁盘上。 # # 下面的例子将会进行把数据写入磁盘的操作: # 900 秒 (15 分钟) 之后,且至少1次变更 # 300 秒 (5 分钟) 之后,且只好10次变更 # 60秒之后,且至少10000次变更 # # 注意:你要想不写磁盘的话就把所有的“save”设置注销掉就行了 # # 通过添加一条带空字符串参数的save执行也能移除之前所有配置的save指令 # 像下面的例子: # # save "" save 900 1 save 300 10 save 60 10000 # 默认如果开启RBD快照(至少一条save指令)并且最新的后台保存失败,Redis将会停止接受写操作 # 这将使用户知道数据没有正确的持久化到硬盘,否则可能没有人注意到并且造成一些灾难。 # # 如果后台保存进程能重新开始工作,Redis将自动允许写操作 # # 然而如果你已经部署了适当的Redis服务器和持久化监控,你可能想关掉这个功能以便于及即使是硬盘, # 权限等出问题了Redis也能够像平时一样正常工作。 stop-writes-on-bgsave-error yes # 当导出到.rdb数据库时是否用LZF压缩字符串对象。 # 默认设置为'yes',因为几乎总是生效的. # 如果你想节省CPU的话,可以把这个设置为“no”,但是如果你有可压缩的key和value的话,那数据文件就会更大了. rdbcompression yes # 因为版本5的RDB有一个CRC64算法的效验和放在文件的最后,这将使文件格式更加可靠,但是在生产和加载RDB文件时候, # 这有一个性能消耗(大约10%),所以你可以关掉它来获取最大性能。 # # 生成的关闭效验的RDB文件有一个0的效验和,它将告诉加载代码跳过检查。 rdbchecksum yes # 持久化数据库的文件名 dbfilename dump.rdb # 工作目录 # # 数据库会写在这个目录下,文件名就是上面的 'dbfilename'的值. # # 累加文件也放这里 # # 注意你指定的必须是目录,不是文件名。 dir ./ ################################# REPLICATION ################################# # 主从同步。通过slaveof指令来实现Redis实例的备份。 # 注意,这里是本地从远程复制数据,也就是说本地可以有不同的数据库文件,绑定不同的IP, # 监听不同的端口 # # slaveof <masterip> <masterport> # 如果master设置了密码保护(通过 "requirepass" 选项来配置),那么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实例是否接受写操作。可写的slave实例可能对存储临时数据比较有用 # (因为写入slave的数据在同master同步之后将很容易被删除)但是如果客户端由于配置 # 错误在写入时也可能产生一些问题。 # # 从 Redis 2.6默认所有的slave为只读. # # 注意:只读的slave不是为了暴露给互联网上不可信的客户端设计的。它只是一个防止实例误用的保护层。 # 一个只读的slave支持所有的管理命令。比如config,debug等。为了限制你可以用“rename-command”来 # 隐藏所有的管理和危险命令来增强只读slave的安全性。 slave-read-only yes # Slaves 根据指定的时间间隔想master发送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 # Slave的优先级是一个整体展示的Redis的Info输出中。如果master不在正常工作了, # 哨兵将用它来选择一个slave提升为master。 # # 优先级数字小的slave会优先考虑提升为master,所以例如有三个优先级分别为10, 100, 25 # 哨兵将挑选优先级最小数字为的10的slave. # # 0作为一个特殊的优先级,标识这个slave不能作为master,所以一个优先级的slave永远不会 # 提升为master. # # 默认优先级 100. slave-priority 100 ################################## 安全性 ################################### # 要求客户端在处理任何命令的时候都需要验证身份和密码 # 在这你信不过来访者时候很有用. # # 为了向后兼容,这段话应该注释掉。并且大多数人不需要身份验证(例如:它们运行在自己的服务器上). # # 警告: 因为Redis太快了,所以居心不良的人可以每秒尝试150k的密码来试图破解密码 # 这意味着你需要高强度的密码,否则破解太容易了. # requirepass ztredis(*)134&^%xswed # 命令重命名 # # 在共享环境下,可以为危险命令改变名字。比如,你可以为CONFIG改个其他不太容易猜到的名字,这样你 # 自己仍然可以使用,而别人却没法做坏事了. # # 例如: # # rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 # # 甚至也可以通过命令赋值一个空字符串来完全禁用这条命令: # # rename-command CONFIG "" ################################### 限制 #################################### # 设置最多同时连接的客户端数量。默认限制是10000个客户端,然后如果Redis服务器不能配置 # 处理文件的限制数来满足指定的值,那么最大的客户端连接数就会被设置成当前文件限制数减32 # (因为Redis服务器保留了一些文件描述符作为内部使用). # # 一旦达到这个限制,Redis会关闭所有的新连接并发送错误“max number of clients reached”. # # maxclients 10000 # 不要用笔设置的上限更多的内存,一旦内存使用达到上限,Redis会根据选定的回收策略. # (参见: maxmemmory-policy)删除key # # 如果因为删除策略问题Redis无法删除key,或者策略设置为 'noeviction', Redis 会回复 # 需要更多的内存的错误信息给命令。例如,SET, LPUSH 等等。但是会继续合理响应只读命令. # 比如:GET. # # 在使用Redis作为LRU缓存或者为实例设置了硬性内存限制的时候(使用 'noeviction'策略)的时候, # 这个选项挺有用的。 # # 警告: 当一堆slave连上达到内存上限的实例的时候,响应slave需要的输出缓存所需内存不 # 计算在使用内存中。 # 这样当请求一个删除掉的key的时候就不会触发网络问题/重新同步的事件,然后slave就会收到 # 一堆删除指令,知道数据库空了为止。 # # 简而言之,如果你有slave连上一个master的话,那么建议你把master内存限制设小一点,确保 # 有足够的系统内存用作输出缓存, (如果策略设置为 'noeviction'的话就不无所谓了). # # maxmemory <bytes> # 内存策略: 如果达到内存限制了,Redis如果删除key,你可以在下面5个策略里面选择: # # 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指令) # # AOF是一种提供了更可靠的替代持久化模式,例如使用默认的数据写入文件策略(参见后面配置) # 在遇到像服务器断电活单写情况下redis自身进程出问题,但操作系统仍正常运行等突发事件时, # Redis能之丢失1秒的写操作 # # AOF 和 RDB 持久化能同时启动并且不会有问题. # 如果AOF开启,那么在启动Redis将加载AOF文件,塔更能保证数据的可靠性. # appendonly no # 纯累加文件名字 (默认: "appendonly.aof") # appendfilename appendonly.aof # fsync() 请求操作系统马上把数据写到磁盘上,不要在等了。 # 有些操作系统会真的把数据马上刷到磁盘上,有的则要磨蹭一下,但是会尽快去做。 # # Redis 支持三种不同的模式: # # no: 不要立刻刷,只有在操作系统需要刷的时候刷,比较快. # always: 每次写操作都要写入aof文件,慢,但是最安全. # everysec: 每秒写一次,折中方案. # # 默认的"everysec"通常来说能在速度和数据安全性之间取得比较好的平衡。 # 如果你真的理解了,那么设置“no”可以获得更好的性能表现(如果丢数据 # 的话,则只能拿到一个不是很新的快照) # 或者相反的,你选择“wlways”来牺牲速度确保数据安全、完整。 # # 如果拿不准就用"everysec". # appendfsync always appendfsync everysec # appendfsync no # 如果AOF的同步策略设置成“always”或者“everysec”,那么后台的存储进程 # (后台存储或写入AOF日志) 会产生很多磁盘I/O开销。 # 某些Linux的配置下会使Redis因为fsync()而阻塞很久。 # 注意,目前对这个情况还没有完美修正,甚至不同线程的fsync()会阻塞完美的wirte(2)的请求. # # 为了缓解这个问题,可以用下面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 ################################ LUA脚本处理 ############################### # 执行一个最大Lua脚本以毫秒为单位 # #如果达到最大的时间限制(毫秒),redi会记个log,然后返回error。 #当一个脚本超过最大型限制,只有SCRIPTKILL和SHUTDOWN NOSAVE可以用。第一个可以 #杀没有调Write命令的东西。要是已经调用了Write,只能用第二个命令杀。 # # 将其设为0或负值,执行无警告的无限执行。 lua-time-limit 5000 ################################## SLOW LOG ################################### #slog log是用来记录redis运行中执行比较慢的命令耗时。当命令的执行超过了指定时间, #就记录在slow log中,slog log保存在内存中,所以没有IO操作。 #执行时间比slowlog-log-slower-than大的请求记录到slowlog里面,单位是微秒, #所以1000000就是1秒。注意,负数时间会禁用慢查询日志,而0则会强制记录所有命令。 slowlog-log-slower-than 10000 #慢查询日志长度。当一个新的命令被写进日志的时候,最老的那个记录会被删掉。 #这个长度没有限制。只要有足够的内存就行。你可以通过 SLOWLOG RESET 来释放内存。 slowlog-max-len 128 ############################### ADVANCED CONFIG ############################### # 当hash只有少量的entry时,并且最大的entry所占空间没有超过指定的限制时,会用一种节省内存的 # 数据结构来编码。可以通过下面的指令来设定限制 hash-max-ziplist-entries 512 hash-max-ziplist-value 64 # 与hash似,数据元素较少的list,可以用另一种方式来编码从而节省大量空间。 # 这种特殊的方式只有在符合下面限制时才可以用: list-max-ziplist-entries 512 list-max-ziplist-value 64 # set有一种特殊编码的情况:当set数据全是十进制64位有符号整型数字构成的字符串时。 # 下面这个配置项就是用来设置set使用这种编码来节省内存的最大长度。 set-max-intset-entries 512 # 与hash和list相似,有序集合也可以用一种特别的编码方式来节省大量空间。 # 这种编码只适合长度和元素都小于下面限制的有序集合: zset-max-ziplist-entries 128 zset-max-ziplist-value 64 # 启用哈希刷新,每100个CPU毫秒会拿出1个毫秒来刷新Redis的主哈希表(顶级键值映射表)。 # redis所用的哈希表实现(见dict.c)采用延迟哈希刷新机制:你对一个哈希表操作越多,哈希刷新 # 操作就越频繁;反之,如果服务器是空闲的,那么哈希刷新就不会完成,哈希表就会占用更多的一些 # 内存而已。 # # 默认是每秒钟进行10次哈希表刷新,用来刷新字典,然后尽快释放内存。 # # 建议: # 如果你对延迟比较在意,不能够接受Redis时不时的对请求有2毫秒的延迟的话,就用 # "activerehashing no",如果不太在意延迟而希望尽快释放内存就设置"activerehashing yes" activerehashing yes # 客户端的输出缓冲区的限制,可用于强制断开那些因为某种原因从服务器读取数据的速度不够快的客户端, # (一个常见的原因是一个发布/订阅客户端消费消息的速度无法赶上生产它们的速度) # # 可以对三种不同的客户端设置不同的限制: # normal -> 正常客户端 # slave -> slave和 MONITOR 客户端 # pubsub -> 至少订阅了一个pubsub channel或pattern的客户端 # 下面是每个client-output-buffer-limit语法: # client-output-buffer-limit <class><hard limit> <soft limit> <soft seconds> # # 一旦达到硬限制客户端会立即被断开,或者达到软限制并持续达到指定的秒数(连续的)。 # 例如,如果硬限制为32兆字节和软限制为16兆字节/10秒,客户端将会立即断开 # 如果输出缓冲区的大小达到32兆字节,或客户端达到16兆字节并连续超过了限制10秒,就将断开连接。 # # 默认normal客户端不做限制,因为他们在不主动请求时不接收数据(以推的方式),只有异步客户端 # 可能会出现请求数据的速度比它可以读取的速度快的场景。 # # pubsub和slave客户端会有一个默认值,因为订阅者和slaves以推的方式来接收数据 # # 把硬限制和软限制都设置为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 ################################## INCLUDES ################################### # 可以在这里包含一个或多个其他的配置文件。如果你有一个适用于所有Redis服务器的标准配置模板 # 但也需要一些每个服务器自定义的设置,这个功能将很有用。被包含的配置文件也可以包含其他配置文件, # 所以需要谨慎的使用这个功能。 # # 注意“inclue”选项不能被admin或Redis哨兵的"CONFIG REWRITE"命令重写。 # 因为Redis总是使用最后解析的配置行最为配置指令的值, 你最好在这个文件的开头配置includes来 # 避免它在运行时重写配置。 # 如果相反你想用includes的配置覆盖原来的配置,你最好在该文件的最后使用include # # include /path/to/local.conf # include /path/to/other.conf