一、Redis编译:
1.问题:make gcc error
yum –y install gcc
2.问题:安装报错 error: jemalloc/jemalloc.h: No such file or directory
解决:make MALLOC=libc
3问题:
You need tcl 8.5 or newer in order to run the Redis test
make: * [test] 错误 1
解决:
wget http://downloads.sourceforge.net/tcl/tcl8.6.0-src.tar.gz
cd tcl8.6.0/
cd unix &&
./configure --prefix=/usr \
--mandir=/usr/share/man \
--without-tzdata \
$([ $(uname -m) = x86_64 ] && echo --enable-64bit) &&
make &&
sed -e "s@^\(TCL_SRC_DIR='\).*@\1/usr/include'@" \
-e "/TCL_B/s@='\(-L\)\?.*unix@='\1/usr/lib@" \
-i tclConfig.sh
make install &&
make install-private-headers &&
ln -v -sf tclsh8.6 /usr/bin/tclsh &&
chmod -v 755 /usr/lib/libtcl8.6.so
二、配置
参数说明
redis.conf 配置项说明如下:
1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
daemonize no
2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
pidfile /var/run/redis.pid
3. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
port 6379
4. 绑定的主机地址
bind 127.0.0.1
5.当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
timeout 300
6. 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
loglevel verbose
7. 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
logfile stdout
8. 设置数据库的数量,默认数据库为0,可以使用SELECT
databases 16
9. 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save
Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
10. 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
11. 指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
12. 指定本地数据库存放目录
dir ./
13. 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
slaveof
14. 当master服务设置了密码保护时,slav服务连接master的密码
masterauth
15. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH
requirepass foobared
16. 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
maxclients 128
17. 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory
18. 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendonly no
19. 指定更新日志文件名,默认为appendonly.aof
appendfilename appendonly.aof
20. 指定更新日志条件,共有3个可选值: no:表示等操作系统进行数据缓存同步到磁盘(快) always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec
21. 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)
vm-enabled no
22. 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
vm-swap-file /tmp/redis.swap
23. 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0
vm-max-memory 0
24. Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值
vm-page-size 32
25. 设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。
vm-pages 134217728
26. 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4
vm-max-threads 4
27. 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
glueoutputbuf yes
28. 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
29. 指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)
activerehashing yes
30. 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
include /path/to/local.conf
redis.conf文件英译版:
#Redis配置文件示例。 # #注意,为了读取配置文件,Redis必须是 #以文件路径作为第一个参数开始: # #./redis-server /path/to/redis.conf #注意单位:当需要内存大小时,可以指定 #以通常形式的1k 5GB 4M等等: ## #1k => 1000字节 #1kb => 1024字节 #1m => 1000000字节 #1mb => 1024 * 1024个字节 #1g => 1000000000字节 #1gb => 1024 * 1024 * 1024字节 ## #单位不区分大小写,所以1GB 1Gb 1gB都是一样的。 ################################# INCLUDES ################################### #在此处包含一个或多个其他配置文件。这是有用的,如果你 #有一个标准模板,所有Redis服务器,但也需要 #自定义几个每服务器设置。包括文件可以包括 #其他文件,所以使用这个明智。 # #注意选项“include”不会被命令“CONFIG REWRITE”重写, #from admin或Redis Sentinel。因为Redis总是使用最后处理的 #line作为配置指令的值,你最好把includes #在此文件的开头,以避免覆盖配置更改在运行时。 # #如果相反,您有兴趣使用包括覆盖配置 #选项,最好使用include作为最后一行。 # #include /path/to/local.conf #include /path/to/other.conf ################################ 一般 ##################################### #默认情况下,Redis不作为守护程序运行。如果需要,使用“yes”。 #注意,Redis在守护进程时会在/var/run/redis.pid中写一个pid文件。 daemonize yes #当运行守护进程时,Redis在/var/run/redis.pid中写入一个pid文件 #default。您可以在此处指定自定义pid文件位置。 pidfile /apps/app/redis3.0.6/redis.pid #接受指定端口的连接,默认值为6379。 #如果指定端口0,Redis将不会侦听TCP套接字。 port 6379 #TCP listen()backlog。 # #在高请求每秒的环境中,您需要高顺序的积压 #避免缓慢的客户端连接问题。注意Linux内核 #将默认截断它到/ proc / sys / net / core / somaxconn的值 #确保提高somaxconn和tcp_max_syn_backlog的值 #以获得所需的效果。 tcp-backlog 511 #默认情况下,Redis侦听来自所有网络接口的连接 #在服务器上可用。它可以只听一个或多个 #接口使用“bind”配置指令,后跟一个或 #more IP addresses。 # # 例子: # #bind 192.168.1.100 10.0.0.1 #bind 127.0.0.1 #指定将用于侦听的Unix套接字的路径 #传入连接。没有默认值,所以Redis不会监听 #未指定时在unix套接字上。 # #unixsocket /tmp/redis.sock #unixsocketperm 700 #客户端空闲N秒后关闭连接(0禁用) timeout 0 #TCP keepalive。 # #如果非零,使用SO_KEEPALIVE发送TCP ACK到客户端缺席 通信的数量。这有两个原因: # #1)检测死对等体。 #2)从网络的角度来看连接是活着的 #设备在中间。 # #在Linux上,指定的值(以秒为单位)是用于发送ACK的时间段。 #注意,要关闭连接,需要两倍的时间。 #在其他内核上,周期取决于内核配置。 # #此选项的合理值为60秒。 tcp-keepalive 60 #指定服务器详细程度级别。 #这可以是以下之一: #debug(很多信息,对开发/测试有用) #verbose(很少有用的信息,但不像调试级别的混乱) #notice(适度冗长,你想在生产中可能) #warning(仅记录非常重要/关键的消息) loglevel debug #指定日志文件名。也可以使用空字符串强制 #Redis登录标准输出。注意,如果你使用标准 #输出用于日志,但是守护进程,日志将发送到/ dev / null logfile "/apps/app/redis3.0.6/logs/log" #要启用日志记录到系统记录器,只需将'syslog-enabled'设置为yes, #并可选择更新其他syslog参数以满足您的需要。 #syslog-enabled no #指定syslog标识。 #syslog-ident redis #指定syslog设施。必须是USER或LOCAL0-LOCAL7之间。 #syslog-facility local0 #设置数据库的数量。默认数据库是DB 0,可以选择 #一个不同的在每个连接基础上使用SELECT其中 #dbid是0和'databases'-1之间的一个数字 databases 16 ################################ SNAPSHOTTING ################# ############### # #将磁盘上的数据块保存: # #save # #将保存DB如果给定的秒数和给定的 #发生对数据库的写操作数。 # #在下面的示例中,行为将保存: #900秒(15分钟)后,如果至少1个键更改 #300秒(5分钟)后至少10个键更改 #after 60 seconds if至少10000 keys changed # #注意:您可以通过注释掉所有“保存”行来完全禁用保存。 # #也可以删除所有以前配置的保存 #points通过添加一个具有单个空字符串参数的save指令 #像下面的例子: # # save "" save 900 1 save 300 10 save 60 10000 #默认情况下,如果启用了RDB快照,Redis将停止接受写入 #(至少一个保存点)和最近的后台保存失败。 #这将使用户意识到(以硬的方式)数据不持久 #在磁盘上正确,否则可能是没有人会注意到一些 #灾难会发生。 ## #如果后台保存过程将再次开始工作Redis将 #自动允许再次写入。 ## #但是,如果您已经设置了对Redis服务器的正确监视 #和持久性,您可能想要禁用此功能,以便Redis将 #继续照常工作,即使有磁盘的问题, #权限,等等。 stop-writes-on-bgsave-error yes #转储.rdb数据库时,使用LZF压缩字符串对象? #对于默认设置为'yes',因为它几乎总是一个胜利。 #如果你想保存一些CPU在保存子项设置为'no',但 #数据集可能会更大,如果你有可压缩的值或键。 rdbcompression yes #从RDB的版本5开始,CRC64校验和放在文件的末尾。 #这使得格式更加抗腐败,但有一个性能 #命中支付(约10%),当保存和加载RDB文件,所以你可以禁用它 #最大性能。 ## #禁用校验和创建的RDB文件的校验和为零 #告诉加载代码跳过检查。 rdbchecksum yes #转储DB的文件名 dbfilename dump.rdb #工作目录。 # #DB将被写入此目录,并指定文件名 #上面使用'dbfilename'配置指令。 # #仅附加文件也将在此目录中创建。 # #请注意,您必须在此指定目录,而不是文件名。 dir ./ ################################# REPLICATION ################ ################# #主从复制。使用slaveof使Redis实例成为副本 #另一个Redis服务器。关于Redis复制的几个事情。 ## #1)Redis复制是异步的,但您可以配置一个主机 #停止接受写入,如果它似乎至少没有连接 #给定数量的从属。 #2)Redis从设备能够执行部分重新同步 #master如果复制链路丢失了相对较少的数量 # 时间。您可能需要配置复制积压大小(请参阅下一页 #这个文件的部分)根据你的需要一个合理的价值。 #3)复制是自动的,不需要用户干预。之后 #网络分区从设备自动尝试重新连接到主设备 #并与他们重新同步。 ## #slaveof #如果主密码保护(使用“requirepass”配置 #directive下面)可以告诉从设备之前进行验证 #启动复制同步过程,否则master会 #拒绝从属请求。 ## #masterauth masterauth loong #当从服务器失去与主服务器的连接或复制时 #仍在进行中,从属可以采取两种不同的方式: ## #1)如果slave-serve-stale-data设置为“yes”(默认),则从属将 #仍然回复客户请求,可能使用过期数据,或 #data set可能只是空如果这是第一次同步。 ## #2)如果slave-serve-stale-data设置为“no”,从设备将回复 #一个错误“SYNC与主进程”到所有类型的命令 #但是INFO和SLAVEOF。 ## slave-serve-stale-data yes #您可以配置从实例以接受写或不。写作 #一个从实例可能用于存储一些短暂的数据(因为数据 #写在从站上将很容易删除后再同步与主),但是 #也可能会导致问题,如果客户端写它,因为 #misconfiguration。 ## #由于Redis 2.6默认从机是只读的。 ## #注意:只读从站不是设计为暴露给不受信任的客户端 # 在网上。它只是一个防止实例滥用的保护层。 #仍然是只读slave默认情况下导出所有管理命令 #,如CONFIG,DEBUG等。在有限的程度上你可以改善 #security of read only slaves using'rename-command'to shadow all #administrative / danger命令。 slave-read-only yes #Replication SYNC策略:磁盘或套接字。 ## #------------------------------------------- ------ #警告:无条件复制是目前的实验 #------------------------------------------- ------ ## #新从站和重新连接从站,无法继续复制 #进程只是收到差异,需要做的就是所谓的"full #synchronization"。一个RDB文件从主机发送到从机。 #传输可以以两种不同的方式进行: ## #1)磁盘备份:Redis主机创建一个写入RDB的新进程 #文件。稍后,文件由父级传输 #过程递增到从站。 #2)无盘:Redis主机创建一个新的进程,直接写入 #RDB文件到从插座,而不触及磁盘。 ## #使用磁盘备份复制,同时生成RDB文件,有更多的从属 #可以在当前子节点生成后立即排队并与RDB文件一起提供 #RDB文件完成其工作。而使用无盘复制一次 #传输开始,新从站到达将排队和新的传输 #将在当前终止时启动。 ## #当使用无盘复制时,主服务器等待可配置的量 #时间(以秒为单位)开始传输之前希望多个从机 #将到达并且传输可以并行化。 ## #使用慢磁盘和快速(大带宽)网络,无盘复制 #工作更好。 repl-diskless-sync no #启用无磁盘复制时,可以配置延迟 #服务器等待以便生成通过套接字传输RDB的子进程 #到奴隶。 ## #这很重要,因为一旦传输开始,它是不可能服务 #新奴隶到达,这将被排队等待下一次RDB传输,所以服务器 #等待延迟,以便让更多的奴隶到达。 ## #延迟时间以秒为单位,默认值为5秒。禁用 #完全只是设置为0秒,传输将尽快启动。 repl-diskless-sync-delay 5 #从设备以预定义的时间间隔向服务器发送PING。这是可能改变 #此间隔与repl_ping_slave_period选项。默认值为10 #秒。 ## #repl-ping-slave-period 10 #以下选项设置以下项的复制超时: ## #1)SYNC期间的批量传输I / O,从从机的角度。 #2)主站从从站(数据,ping)的角度看超时。 #3)从主机(REPLCONF ACK ping)的角度看,从机超时。 ## #确保此值大于该值很重要 #指定为repl-ping-slave-period,否则将检测到超时 #每次在主机和从机之间有低流量。 ## #repl-timeout 60 #在SYNC之后在从槽上禁用TCP_NODELAY? ## #如果选择“是”,Redis将使用较少数量的TCP数据包和 #减少带宽以向从设备发送数据。但这可以增加一个延迟 #数据出现在从机端,最多40毫秒 #Linux内核使用默认配置。 ## #如果选择“否”,从机侧显示的数据延迟 #减少,但更多的带宽将用于复制。 ## #默认情况下,我们优化低延迟,但在非常高的流量条件 #或当主机和从机有很多跳时,将此设置为“yes”可能 #是一个好主意。 repl-disable-tcp-nodelay no #设置复制积压大小。积压是一个积累的缓冲区 #从数据,当从机断开一段时间时,使得当从机时 #想要重新连接,通常不需要完全重新同步,但是部分 #resync就足够了,只是传递从器件错过的数据部分 #disconnect。 ## #复制待办事项越大,从属节点的时间就越长 #断开连接,以后能够执行部分重新同步。 ## #仅在至少有一个从站连接时才分配积压。 ## #repl-backlog-size 1mb #在主机已经不再连接从机一段时间后,积压 #将被释放。以下选项配置秒数 #需要经过,从最后一个slave断开的时间,for #待清空缓冲区被释放。 ## #值为0表示永不释放积压。 ## #repl-backlog-ttl 3600 #从属优先级是由Redis在INFO输出中发布的整数。 #它被Redis Sentinel使用,以便选择一个从服务器升级到一个 #master如果主机不再正常工作。 ## #优先级数字低的从设备被认为是更好的促销,所以 #例如,如果有三个从属有优先级10,100,25 Sentinel将 #选择优先级为10,即最低的那个。 ## #然而,0的特殊优先级标记从设备不能执行 #角色为主,所以优先级为0的从站将永远不会被选择 #Redis Sentinel进行宣传。 ## #默认情况下优先级为100。 slave-priority 100 #如果主数据小于,则可以停止接受写入 #N从站连接,具有小于或等于M秒的滞后。 ## #N个从站需要处于“在线”状态。 ## #以秒为单位的滞后,必须小于指定值,由计算 #从从设备接收的最后一个ping,通常每秒发送一次。 ## #此选项不保证N个副本将接受写入,但是 #将限制在没有足够的从设备的情况下丢失写入的暴露窗口 #可用,到指定的秒数。 ## #例如,要求至少3个滞后<= 10秒的从站使用: ## #min-slaves-to-write 3 #min-slaves-max-lag 10 ## #将一个或另一个设置为0将禁用该功能。 ## #默认情况下,min-slaves-to-write设置为0(禁用功能)和 #min-slaves-max-lag设置为10。 ################################## SECURITY ############### ##################### #要求客户端在处理任何其他文件之前发出AUTH #命令。这在您不信任的环境中可能很有用 #其他用户可以访问运行redis-server的主机。 ## #这应该保持注释掉向后兼容性,因为大多数 #个人不需要身份验证(例如他们运行自己的服务器)。 ## #警告:因为Redis是相当快的外部用户可以尝试 #150k密码每秒对一个好的盒子。这意味着你应该 #使用非常强的密码否则会很容易破解。 ## #requirepass foobared #命令重命名。 ## #可以更改共享中的危险命令的名称 # 环境。例如,CONFIG命令可以重命名为某物 #难以猜测,所以它仍然可用于内部使用工具 #但不适用于一般客户。 ## #示例: ## #rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 ## #也可以通过将命令重命名为完全杀死命令 #一个空字符串: ## #rename-command CONFIG"" ## #请注意,更改已登录到的命令的名称 #AOF文件或传输到从站可能会导致问题。 ################################### LIMITS ############## ###################### #同时设置连接的客户端的最大数量。默认 #此限制设置为10000个客户端,但如果Redis服务器不是 #能够配置进程文件限制以允许指定的限制 #允许的最大客户端数被设置为当前文件限制 #minus 32(因为Redis为内部使用保留了几个文件描述符)。 ## #一旦达到限制,Redis将关闭所有新连接发送 #an error'max number of clients reached'。 ## #maxclients 10000 #不要使用比指定字节数更多的内存。 #当达到内存限制时,Redis将尝试删除密钥 #根据选择的逐出策略(请参阅maxmemory-policy)。 ## #如果Redis无法根据策略删除密钥,或者策略是 #set to'noeviction',Redis will start to reply with errors to commands #将使用更多的内存,如SET,LPUSH等,并将继续 #来回复只读命令,如GET。 ## #当使用Redis作为LRU缓存或设置时,此选项通常很有用 #一个实例的硬内存限制(使用'noeviction'策略)。 ## #警告:如果有从属设备连接到具有maxmemory的实例, #减去馈送从器件所需的输出缓冲器的大小 #从使用的内存计数,使网络问题/ resyncs将 #不触发按键被逐出的循环,反过来输出 #缓冲区的奴隶满了DEL的键被逐出触发删除 #个更多的键,依此类推,直到数据库完全清空。 ## #简而言之...如果你有奴隶附加它建议你设置一个较低 #limit for maxmemory,以便系统上有一些可用的RAM用于从属 #output buffers(但是如果策略是'noeviction',则不需要)。 ## #maxmemory maxmemory 1.5GB #MAXMEMORY POLICY:Redis如何选择maxmemory时要删除的内容 #到达。您可以选择五种行为: ## #volatile-lru - >使用LRU算法删除带有过期集的密钥 #allkeys-lru - >根据LRU算法删除任何密钥 #volatile-random - >删除带有过期集的随机密钥 #allkeys-random - >删除随机密钥,任意密钥 #volatile-ttl - >删除具有最近过期时间的密钥(次要TTL) #noeviction - >不要过期,只是写操作返回一个错误 ## #注意:使用任何上述策略,Redis将在写入时返回错误 #操作,当没有合适的驱逐键时。 ## #在编写日期这些命令是:set setnx setex append #incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd #烧结烧结料sion #zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby #getset mset msetnx exec sort ## #默认值为: ## #maxmemory-policy noeviction #LRU和最小TTL算法不是精确的算法,而是近似的 #算法(为了节省内存),所以你可以调整它的速度或 # 准确性。对于默认Redis将检查五个键,并选择一个 #最近使用较少,您可以使用以下更改样本大小 #configuration指令。 ## #默认值为5产生足够好的结果。 10非常接近 #true LRU但是成本多一点CPU。 3是非常快,但不是很准确。 ## #maxmemory-samples 5 ############################## APPEND ONLY MODE ################# ############## #默认情况下,Redis异步地转储磁盘上的数据集。这种模式是 #足够好在许多应用程序,但是一个问题与Redis进程或 #断电可能导致几分钟的写丢失(取决于 #配置的保存点)。 ## #仅附加文件是提供的替代持久性模式 #更好的耐用性。例如使用默认数据fsync策略 #(见后面的配置文件)Redis可以在a中丢失只有一秒的写入 #戏剧性事件,如服务器断电,或单个写如果有 #错误的Redis进程本身发生,但操作系统是 #仍然正常运行。 ## #AOF和RDB持久性可以同时启用而没有问题。 #如果在启动时启用AOF,Redis将加载AOF,即文件 #更好的耐用性保证。 ## #请检查http://redis.io/topics/persistence以获取更多信息。 appendonly no #附加文件的名称(默认:"appendonly.aof") appendfilename "appendonly.aof" #fsync()调用告诉操作系统在磁盘上实际写入数据 #而不是在输出缓冲区中等待更多的数据。有些操作系统会真的刷新 #数据在磁盘上,一些其他操作系统将只尝试尽快做到。 ## #Redis支持三种不同的模式: ## #no:do not fsync,只是让操作系统在需要时刷新数据。更快。 #always:fsync之后每次写入只追加日志。慢,最安全。 #everysec:fsync每秒只有一次。妥协。 ## #默认是“everysec”,因为它通常是正确的折中 #速度和数据安全。这是由你来了解,如果你可以放松这 #“no”,它将让操作系统在刷新输出缓冲区的时候 #想要,为了更好的表现(但如果你能生存的想法 #一些数据丢失考虑默认持久性模式的快照), #或相反,使用“总是”,这是非常缓慢,但比一点安全 #everysec。 ## #更多详情请查看以下文章: #http://antirez.com/post/redis-persistence-demystified.html ## #如果不确定,请使用“everysec”。 #appendfsync always appendfsync everysec #appendfsync no #当AOF fsync策略设置为always或everysec和背景时 #保存过程(后台保存或AOF日志背景重写)是 #在一些Linux配置中对磁盘执行大量I / O #Redis可能在fsync()调用时阻塞太长时间。请注意,没有修复 #this目前,因为即使在不同的线程执行fsync也会阻塞 #我们的同步写(2)调用。 ## #为了缓解这个问题,可以使用以下选项 #将阻止fsync()在主进程中被调用 正在进行#BGSAVE或BGREWRITEAOF。 ## #这意味着当另一个孩子保存时,Redis的持久性是 #与“appendfsync none”相同。实际上,这意味着它 #可能丢失最多30秒的日志在最糟糕的情况下(与 #default Linux settings)。 ## #如果您有延迟问题,请将其设置为“yes”。否则保留为 #“no”这是从耐用性的角度来看最安全的选择。 no-appendfsync-on-rewrite no #自动重写追加文件。 #Redis能够自动重写日志文件隐式调用 #BGREWRITEAOF当AOF日志大小增加指定的百分比时。 ## #这是它的工作原理:Redis记住AOF文件的大小之后 #latest rewrite(如果没有重写,自重启以来,大小 #使用启动时的AOF)。 ## #此基本大小与当前大小进行比较。如果当前大小为 #大于指定的百分比,则重写被触发。也 #需要指定要重写的AOF文件的最小大小,这 #用于避免重写AOF文件,即使百分比增加 #已达到,但它仍然相当小。 ## #指定一个百分比零为了禁用自动AOF #重写功能。 auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb #AOD文件可能会在Redis结束时被截断 #启动过程,当AOF数据被加载回内存。 #这可能发生在Redis运行的系统上 #崩溃,特别是当一个ext4文件系统没有安装 #data = ordered选项(但是这不会发生在Redis本身 #崩溃或中止,但操作系统仍然正常工作)。 ## #Redis可以在出现这种情况时退出并返回错误,或者加载尽可能多的内容 #数据(默认为现在),如果找到AOF文件,则启动 #在末尾被截断。以下选项控制此行为。 ## #如果aof-load-truncated设置为yes,则加载截断的AOF文件 #Redis服务器开始发出日志以通知用户事件。 #否则,如果该选项设置为no,服务器将中止并显示错误 #并拒绝启动。当该选项设置为no时,用户需要 #重新启动之前使用“redis-check-aof”实用程序修复AOF文件 #服务器。 ## #注意,如果AOF文件被发现在中间被损坏 #服务器仍将退出并显示错误。此选项仅适用于 #Redis将尝试从AOF文件读取更多数据,但没有足够的字节 #将被找到。 aof-load-truncated yes ################################ LUA SCRIPTING ################ ############### #Lua脚本的最大执行时间(毫秒)。 ## #如果达到最大执行时间,Redis将记录一个脚本 #在最大允许时间后仍然在执行,并将开始 #回复包含错误的查询。 ## #当长时间运行的脚本超过最大执行时间时 #SCRIPT KILL和SHUTDOWN NOSAVE命令可用。第一个可以 #用于停止尚未调用写入命令的脚本。第二 #是在写命令的情况下关闭服务器的唯一方法 #已经由脚本发出,但用户不想等待自然 #终止脚本。 ## #将其设置为0或负值,无限制执行,不带警告。 lua-time-limit 5000 ################################ REDIS 集群 ################ ############### ## #+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++ #警告实验:但是Redis群集被认为是稳定的代码 #为了将其标记为"成熟",我们需要等待一个不重要的百分比 #个用户在生产环境中部署。 #+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++ ## #正常Redis实例不能是Redis集群的一部分;只有节点 #作为集群节点启动。为了启动一个Redis实例 #cluster node启用集群支持取消注释以下内容: ## #cluster-enabled yes #每个集群节点都有一个集群配置文件。这个文件不是 #旨在手动编辑。它由Redis节点创建和更新。 #每个Redis群集节点需要一个不同的群集配置文件。 #确保在同一系统中运行的实例没有 #重叠群集配置文件名。 ## #cluster-config-file nodes-6379.conf #集群节点超时是节点必须无法访问的毫秒数 #,以便它被认为处于故障状态。 #大多数其他内部时间限制是节点超时的倍数。 ## #cluster-node-timeout 15000 #发生故障的主设备的从设备将避免在其数据时启动故障转移 #看起来太旧了。 ## #没有简单的方法让从属实际上有一个精确的度量 #其“数据年龄”,因此执行以下两个检查: ## #1)如果有多个从设备可以进行故障转移,则它们会交换消息 #为了试图给奴隶带来最好的优势 #replication offset(来自主处理器的更多数据)。 #Slaves将尝试通过偏移获得它们的排名,并应用于开始 #故障切换延迟与他们的排名成比例。 ## #2)每个从属计算最后一次交互的时间 #它的主人。这可以是接收的最后一次ping或命令(如果主机 #仍然处于“连接”状态),或自从之后经过的时间 #断开与主机的连接(如果复制链接当前关闭)。 #如果最后一次交互太旧,从设备将不会尝试故障转移 #at all。 ## #点“2”可以由用户调节。具体来说,从站将不执行 #failover if,自从上次与master交互后,时间 #elapsed大于: ## #(node-timeout * slave-validity-factor)+ repl-ping-slave-period ## #例如,如果node-timeout为30秒,并且slave-validity-factor #为10,并且假设默认的repling-slave-period为10秒 #slave不会尝试故障转移,如果它不能与主机谈话 #长于310秒。 ## #大的从有效性因子可能允许具有太旧数据的从设备进行故障转移 #a master,而太小的值可能会阻止群集 #选择一个从属。 ## #为了实现最大可用性,可以设置从属有效因子 #到值为0,这意味着,奴隶将总是试图故障转移 #master,而不管他们最后一次与master交互的时间。 #(但是他们总是试图应用与他们成比例的延迟 #offset rank)。 ## #Zero是唯一能够保证当所有分区恢复时的值 #集群将永远能够继续。 ## #cluster-slave-validity-factor 10 #集群从属设备能够迁移到孤立的主设备,即主设备 #没有工作的奴隶。这提高了集群能力 #抵抗失败,否则孤立的主人不能失败 #如果没有工作从设备,则发生故障。 ## #奴隶迁移到孤立的主人,只有至少还有一个 #给他们的老主人的其他工作从站。这个数字 #是“迁移障碍”。迁移障碍为1意味着一个奴隶 #将迁移,只有当至少有一个其他工作从站为其主站 #等。它通常反映你想要的每一个奴隶的数量 #master。 ## #默认值为1(从机迁移只有当他们的主人至少保持 #一个从站)。要禁用迁移,只需将其设置为非常大的值。 #可以设置值0,但仅对调试和危险有用 #在生产中。 ## #cluster-migration-barrier 1 #默认情况下,如果Redis集群节点检测到,则停止接受查询 #是至少一个散列槽未覆盖(没有可用的节点服务它)。 #这种方式如果集群部分关闭(例如一个散列槽的范围 #不再被覆盖),所有的集群变为,最终不可用。 #一旦所有插槽再次覆盖,它将自动返回可用。 ## #但是有时候你想要的集群的子集是工作, #继续接受仍为关键字空间部分的查询 #覆盖。为了这样做,只需设置cluster-require-full-coverage #选项为no。 ## #cluster-require-full-coverage yes #为了设置集群,请务必阅读文档 #可在http://redis.io网站上获得。 ################################# SLOW LOG ############## ##################### #Redis Slow Log是一个系统,用于记录超过指定的查询 # 执行时间处理时间。执行时间不包括I / O操作 #喜欢和客户交谈,发送回复等等, #但只是实际执行命令所需的时间(这是唯一的 #命令执行阶段,其中线程被阻塞并且无法服务 #其他请求在此期间)。 ## #您可以使用两个参数配置慢日志:一个告诉Redis #什么是执行时间,以微秒为单位,超过为了 #命令获取日志,另一个参数是长度 #slow log。 当记录新命令时,最旧的命令从中删除 #日志命令队列。 #以下时间以微秒表示,因此1000000是等效的 #到一秒。 请注意,负数将禁用慢日志,而 #一个零值强制记录每个命令。 slowlog-log-slow-than 10000 #这个长度没有限制。 只是要注意它会消耗内存。 #您可以使用SLOWLOG RESET来回收慢速日志使用的内存。 slowlog-max-len 128 ################################ 延迟监视器 ############################## #Redis延迟监控子系统对不同的操作进行采样 #在运行时为了收集与可能的源有关的数据 #latency的Redis实例。 ## #通过LATENCY命令,此信息可供用户使用 #打印图形并获取报告。 ## #系统只记录在等于或的时间执行的操作 #大于通过指定的毫秒数 #latency-monitor-threshold配置指令。当其值设置时 #置零,延迟监视器关闭。 ## #默认情况下,延迟监控被禁用,因为它大多不需要 #如果没有延迟问题,并且收集数据有性能 #影响,虽然非常小,可以在大负载下测量 #监视可以在运行时使用命令轻松启用 #“CONFIG SET latency-monitor-threshold ”(如果需要)。 latency-monitor-threshold 0 ############################# EVENT NOTIFICATION ################### ########### #Redis可以通知Pub / Sub客户端关键空间中发生的事件。 #此功能在http://redis.io/topics/notifications中进行了说明 ## #例如,如果启用了键空间事件通知和客户端 #对存储在数据库0中的键“foo”执行DEL操作,两个 #邮件将通过Pub / Sub发布: ## #PUBLISH __keyspace @ 0 __:foo del #PUBLISH __keyevent @ 0 __:del foo ## #可以选择Redis在集合中通知的事件 #类。每个类由单个字符标识: ## #K 键空间事件,使用__keyspace @ __前缀发布。 #E Keyevent事件,使用__keyevent @ __前缀发布。 #g 通用命令(非特定类型),如DEL,EXPIRE,RENAME,... #$ String命令 #l 列出命令 #s 设置命令 #h 哈希命令 #z 排序set命令 #x 过期事件(每次密钥过期时生成的事件) #e 驱逐事件(当maxmemory驱逐某个键时生成的事件) #A g $ lshzxe的别名,因此“AKE”字符串表示所有事件。 ## #“notify-keyspace-events”接受一个作为参数的字符串 #为零或多个字符。空字符串表示通知 #已禁用。 ## #示例:启用列表和通用事件,从的角度来看 #event name,use: ## #notify-keyspace-events Elg ## #示例2:获取订阅频道的过期密钥的流 #name __keyevent @ 0 __:expired use: ## #notify-keyspace-events Ex ## #默认情况下,所有通知都被禁用,因为大多数用户不需要 #此功能和功能有一些开销。注意,如果你不 #指定K或E中的至少一个,不会传送任何事件。 notify-keyspace-events "" ############################### ADVANCED CONFIG ################# ############# #哈希编码使用内存高效的数据结构,当他们有 #少数条目,并且最大条目不超过给定 #threshold。这些阈值可以使用以下指令进行配置。 hash-max-ziplist-entries 512 hash-max-ziplist-value 64 #类似于哈希,小列表也按照特殊的方式编码 #为了节省大量的空间。特殊表示仅在何时使用 #您符合以下限制: list-max-ziplist-entries 512 list-max-ziplist-value 64 #集合在一种情况下有一个特殊的编码:当组合时 #的只是正好是范围内的10的整数的字符串 64位有符号整数。 #以下配置设置设置大小的限制 #设置为了使用这种特殊的内存保存编码。 set-max-intset-entries 512 #类似于散列和列表,排序集也是专门编码的 #为了节省大量的空间。此编码仅用于长度和 排序集合的#元素低于以下限制: zset-max-ziplist-entries 128 zset-max-ziplist-value 64 #HyperLogLog稀疏表示字节数限制。限制包括 #16字节标头。当使用稀疏表示的HyperLogLog交叉时 #这个限制,它被转换成密集表示。 ## #大于16000的值是完全无用的,因为那时候 #密集表示更有内存效率。 ## #建议的值是~3000以便有好处 #空间高效编码,而不会减慢太多的PFADD, #是具有稀疏编码的O(N)。该值可以提高到 #~10000当CPU不是一个关注,但空间是,并且数据集是 #由许多HyperLogLogs组成,基数在0 - 15000范围内。 hll-sparse-max-bytes 3000 #active rehashing每100毫秒的CPU时间使用1毫秒 #order以帮助重新散列主Redis散列表(一个映射顶层 #keys to values)。 Redis使用的哈希表实现(见dict.c) #执行延迟重新散列:运行到散列表中的操作越多 #是重新散列,执行更多的重新散列“步骤”,所以如果 #server is idle the rehashing is never complete and some more memory is used #由散列表。 ## #默认是每秒使用这个毫秒10次 #主动重写主要的字典,尽可能释放内存。 ## #如果不确定: #use“activerehashing no”如果你有硬的延迟要求,它是 #在Redis可以不时回复的环境中不是一件好事 #到2毫秒延迟的查询。 ## #use“activerehashing yes”如果你没有这么严格的要求,但 #想尽可能释放内存空间。 activerehashing yes #客户端输出缓冲区限制可用于强制断开客户端 #没有从服务器读取数据足够快,出于某种原因(a #常见的原因是发布/订阅客户端不能消耗消息的速度 #publisher可以产生它们)。 ## #对于三种不同类别的客户端,可以设置不同的限制: ## #normal - >正常客户端,包括MONITOR客户端 #slave - >从客户端 #pubsub - >客户端订阅至少一个pubsub通道或模式 ## #每个client-output-buffer-limit伪指令的语法如下: ## #client-output-buffer-limit <class> ## #客户端在达到硬限制后立即断开连接,或者 #达到软限制并达到指定数量的软限制 #秒(持续)。 #例如,如果硬限制为32 MB,软限制为 #16兆字节/ 10秒,客户端将立即断开连接 #如果输出缓冲区的大小达到32兆字节,但也会得到 #断开连接,如果客户端达到16兆字节并持续克服 #限制10秒。 ## #默认情况下,正常客户端不受限制,因为它们不接收数据 #没有询问(推送方式),但只是在请求后,所以只 #异步客户端可以创建更快地请求数据的场景 #比它可以读。 ## #改为对pubsub和从属客户端有一个默认限制 #用户和从设备以推送方式接收数据。 ## #通过将硬限制或软限制设置为零可以禁用。 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调用内部函数执行许多后台任务,如 #关闭客户端的连接超时,清除过期的密钥 #从未请求,等等。 ## #并非所有任务都以相同的频率执行,但Redis会检查 #任务根据指定的“hz”值执行。 ## #默认情况下,“hz”设置为10.提高值将使用更多的CPU时间 #Redis是空闲的,但同时会使Redis更灵敏 #有许多键同时到期,并且超时可能 #处理更精确。 ## #范围在1到500之间,但是超过100的值通常不是 # 一个好主意。大多数用户应该使用默认值10,并将其升高到 #100仅在需要非常低延迟的环境中。 hz 10 #当子代重写AOF文件时,如果启用以下选项 #该文件将每隔32 MB的数据生成fsync-ed。这是有用的 #为了更加渐进地提交文件到磁盘并避免 #大延迟尖峰。 aof-rewrite-incremental-fsync yes