redis配置(基于3.0版本整理)

单位统一: 加b-->1024  不加b-->1000,如1k=1000bytes 1kb=1024bytes  单位大小写不敏感

include /path/to/local.conf

include /path/to/other.conf

包含其他配置文件  可使用公共配置文件,并拥有自定义配置,include可以嵌套,include不能被config rewrite命令重写,有两种用法,自定义配置覆盖公共配置,将include命令放在文件头部,另一种,用include文件覆盖自定义配置,放于文件尾部。

redi是默认非后台运行,如果需要后台运行将值改为yes,后台运行时redis会记录下pid存储在/var/run/redis.pid文件中(默认情况),可通过pidfile参数设置自定义路径

daemonize no

pidfile /var/run/redis.pid

监听端口,默认6379,如果为0 redis将不会监听TCP socket

port 6379

积压TCP连接,在高并发场景下,需要有一个高积压的配置以避免慢请求连接问题,注意linux内核会默认把值截取为/proc/sys/net/core/somaxconn ,因此为了达到所需效果要加大somaxconn值和tcp_max_syn_backlog值

tcp-backlog 511

socket接收的所有连接都是存放在队列类型的数据结构中,关键问题是这种队列有两个,而且其长度都是可以设置的。
 
分别是下面两个内核参数:
 
/proc/sys/net/ipv4/tcp_max_syn_backlog
 
/proc/sys/net/core/somaxconn
 
其中:
 
 
tcp_max_syn_backlog是指定所能接受SYN同步包的最大客户端数量,即半连接上限;
 
somaxconn是指服务端所能accept即处理数据的最大客户端数量,即完成连接上限。
 
对于没有调优的新装的centOS6.5系统,这两个参数的值都是128。
View Code

redis默认对监听所有可用网络地址,但也可以使用bind只监听一个或多个地址 ,用于指定本机网卡对应的IP地址。可使用ifconfig查看网卡信息

bind 192.168.1.100 10.0.0.1

指定用来监听连接的unix socket值,没有默认,未指定时不监听unix socket

#unixsocket /tmp/redis.sock

#unixsocketperm 755

在n秒空闲后关闭客户端连接(0代表没有超时时间)

timeout 0

tcp心跳包 如果 非0,则在缺乏通讯时使用SO_KEEPALIVE发送TCP ACKs给客户端,用途有两个方面:

1、检测挂掉的peers,

2、通过中间网络设备检测连接是否存活,

在linux上,设定值(单位秒)用来作为发送ACKs的周期,注意要关闭连接,需要双倍时间,其他内核的周期以来与内核配置

推荐设置为60秒

tcp-keepalive 0

设置日志级别

1、debug 用于开发/测试  2、verbose 基本不用的级别.许多基本没用的信息,但不是像调试级别混乱

3、notice 适度,可用于生产环境 4、warning 仅记录important/critical级别信息

loglevel notice

日志文件,空指定redis输出日志到标准输出,注意如果在后台运行时输出的标准输出将输出到/dev/null

logfile ""

记录日志到系统日志中,设置为yes,或更新其他syslog参数达到目的

syslog-enabled no

指定syslog 的identity

syslog-ident redis

指定syslog的facility, 必须时USER或LOCAL0-LOCAL7

syslog-facility local0

设置数据库的数量,默认数据库是DB 0 ,通过select <dbid> 可选数据库

databases 16


 

快照,将数据存储在硬盘上

save <seconds> <changes>

当时间和写命令数量同时满足时保存rdb文件

注意可通过注释掉所有save行停用次功能,也可通过加一行save "" 停用此功能,

save 900 1

save  300 10

save 60 10000

默认情况如果启用了rdb快照功能(至少有一个保存点),当rdb快照不可用时redis会停止接收写命令,这样可以让用户知道持久化已经不准确,以防灾难发生

如果后台存储功能又开始工作,redis将自动重新允许写命令。

或者你安装了自己的监控服务,希望关闭此功能,置为no,这样即使有错误发生也会继续运行

stop-writes-on-bgsave-error yes

保存rbd文件时是否使用LZF算法压缩字符串对象,默认yes,如果想要子进程保存时节省cpu可置为no,但文件会很大。

rdbcompression yes

第五版以来rdb文件使用crc64校验和放于文件结尾,这使得格式更不容易损坏,但在保存和加载RDB文件时,性能会受到影响(大约10%),因此可以禁用它以获得最大性能。禁用时rdb文件创建会以0作为校验和以告诉代码跳过校验

rdbchecksum yes

文件保存名

dbfilename dump.rdb

工作目录

rdb文件和aof文件保存在这里,必须是个目录

dir ./


 

复制

主从复制:使用slaveof 命令可以使某个redis实例复制另一个redis服务器,注意从的配置是在本地的,因此它可以配置不一样的rdb保存间隔,不同的端口等等,

slaveof <masterip> <masterport>

如果master使用了秘钥(requirepass命令)从需要配置住的密码否则主将拒绝从请求

masterauth <master-password>

在从断开主的连接时或正在同步主的数据时,从有两种不同的表现:

当slave-serve-stale-data配置为 yes时(默认),从仍然会回复客户端请求,即使数据不准确或为空(第一次同步)时,

当设置为no时,从会返回“SYNC with master in progress”对于除了INFO和SLAVEOF以外的任何命令

slave-serve-stale-data yes

可以设置从是否接受写命令,可写命令有助于写入一些瞬时数据(再次从主resync时会删除这些数据),这也会导致一些问题使客户端向其写数据(配置错误时),

在2.6版本以后默认只读

注意:设计只读实例的初衷不是为了暴露给网络上不信任的客户端,它仅仅是为了防止实例的误用,此外只读从实力仍会响应一些管理命令,如config debug等,可以通过rename-command命令重命名一些管理类命令与危险的命令

slave-read-only yes

从每隔设定周期即发送一条ping命令,默认周期10秒,可改

repl-ping-slave-period 10

设置主从复制超时时间,用来:

1、从实例上计算SYNC期间大块的I/O传输,

2、从上计算master的超时时间(data,pings)

3、主上看从的超时时间(REPLCONF ACK pings)

此值一定要比repl-ping-slave-period值大否则每次都会检测到超时

repl-timeout 60

是否禁从上在SYNC之后socket的TCP_NODELAY功能

如果置为yes,REDIS将使用更少的TCP包以及带宽向从发送数据,然而这将增加数据同步到从上的延迟时间到40毫秒(在Linux内核使用默认配置时)

如果置为no数据出现在从上的延迟会小但用来同步复制的带宽会增多,

默认情况是为了达到低延迟,但是在有高流量或主从之间有很大不同时,设置为yes将是个好主意

repl-disable-tcp-nodelay no

TCP/IP协议中针对TCP默认开启了Nagle算法。Nagle算法通过减少需要传输的数据包,来优化网络。在内核实现中,数据包的发送和接受会先做缓存,分别对应于写缓存和读缓存。

启动TCP_NODELAY,就意味着禁用了Nagle算法,允许小包的发送。对于延时敏感型,同时数据传输量比较小的应用,开启TCP_NODELAY选项无疑是一个正确的选择。比如,对于SSH会话,用户在远程敲击键盘发出指令的速度相对于网络带宽能力来说,绝对不是在一个量级上的,所以数据传输非常少;而又要求用户的输入能够及时获得返回,有较低的延时。如果开启了Nagle算法,就很可能出现频繁的延时,导致用户体验极差。当然,你也可以选择在应用层进行buffer,比如使用java中的buffered stream,尽可能地将大包写入到内核的写缓存进行发送;vectored I/O(writev接口)也是个不错的选择。
 

对于关闭TCP_NODELAY,则是应用了Nagle算法。数据只有在写缓存中累积到一定量之后,才会被发送出去,这样明显提高了网络利用率(实际传输数据payload与协议头的比例大大提高)。但是这又不可避免地增加了延时;与TCP delayed ack这个特性结合,这个问题会更加显著,延时基本在40ms左右。当然这个问题只有在连续进行两次写操作的时候,才会暴露出来。

连续进行多次对小数据包的写操作,然后进行读操作,本身就不是一个好的网络编程模式;在应用层就应该进行优化。
 
View Code

 设置复制积压缓冲区大小,此缓冲区用来在从节点断开重连接时的部分重同步,当未同步的数据在都还在缓冲区中时

缓冲区越大,能支持从节点断开的时间越长,此缓冲区只会分配一次当有至少一个从节点时

repl-backlog-size 1mb

主节点释放复制积压缓冲区的超时时间,从最后一个从节点断开连接开始计时,经过所配时长后,缓冲区将被释放,单位秒

repl-backlog-ttl 3600

从节点优先级用来哨兵选主,数字越小,优先级越高,特殊数字0代表此从节点不参与选主,默认值100

slave-priority 100

设置主节点当少于N个延迟小于M秒的从节点连接时拒绝写命令,此N个从节点必须是“online”状态,延迟时间从最后一次接收到ping(每秒一次)返回值算起,此选项不保证n个从节点接收写命令,只是限制当没有足够延迟在限定时间内的可连从节点时可能会丢失写命令的时间窗口;

min-slaves-to-write 3

min-slaves-max-lag 10

设置其中一个为0禁用此特性,默认min-slaves-to-write 为0 min-slaves-max-lag 为10


安全

设置客户端连接密码,必须先输AUTH <PASSWORD>命令才能执行其他命令,大多数人不需要此密码(在本机上运行)或为了向后兼容可以把此配置注释掉

注意:由于redis十分快,因此外部用户每秒可以试验150000个密码,意味着密码必须十分复杂以防暴力破解

requirepass foobared

命令重命名

可以在开放网络中将一些高危命令重命名,例如重命名config命令可以只自己使用,而外部客户端无法执行

rename-name CONFIG ljhuhljkferioarhiofrjekgr

也可以将命令重命名为空禁用命令

rename-name CONFIG ""

注意重命名命令将记录在AOF文件中并传播到从节点上,这可能会产生一些问题


 

限制

设置客户端最大并发量,默认10000,当服务器打开文件数不够大时,此值将限制为文件数减32(用来内部使用)

达到限制后,将返回“max number of clients reached”错误

maxclients 10000

设置最大使用内存,当达到限制将根据淘汰策略移除key(见 maxmemory-policy)

如果redis根据淘汰策略已不能移除key,或策略是‘noeviction’,redis将对使用内存的命令返回错误,如set,lpush等对只读命令继续正常返回,如get

警告:当主节点有最大内存限制时,需要预留一些内存作为output buffer ,否则由于网络问题或resyncs时,会导致淘汰命令占用内存从而触发更多淘汰命令,从而清空数据库;当noeviction时无需考虑

maxmemory <bytes>

淘汰策略:(如何挑选过期键)

#volatile-lru 使用LRU算法移除代用过期时间的key

#allkeys-lru 使用LRU算法在所有key中进行淘汰

#volatile-random 随机、带有过期时间的

#allkeys-random 随机、所有key

#volatile-ttl 淘汰最接近淘汰时间的key

#noeviction 不淘汰

对于以上策略,redis只有没有可淘汰命令是即返回错误对于写命令,现有版本写命令包括: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

默认策略不淘汰

maxmeory-policy noeviction

lru与ttl都是近似算法(以节省内存),默认将挑选5个从中选出一个进行淘汰,默认5已经可以提供很好的结果,10将更精确但耗cpu,3更快但不精确

maxmeory-samples 5


 

追加模式

默认下redis会异步保存文件到硬盘,在很多应用中已足够满足要求,但当突然断电时,还是会损失几分钟的写命令

append only文件提供了更好的持久化属性,例如redis将只损失一秒的写命令在突然断电时,或只损失一条命令在应用挂掉但系统运行良好时(默认的fsync配置)

aof和rdb可以同时开启,启动时将优先读取aof文件,以提供更好的持久化;

appendonly no

配置aof文件名称

appendfilename "appendonly.aof"

fsync()函数强制刷新操作系统输出缓冲区到硬盘上,

支持三种模式:

no:不调用fsync,以来操作系统刷新数据,更快

always:每一条写命令都刷新,更慢,更安全

everysec:每秒一次,均衡

默认每秒,是否置为no或everysec取决于个人需求

appendfsync everysec

 当aof刷新策略为always或everysec,且有后台保存程序(save或aof重写)正执行大量i/o操作时,在某些linux配置中,redis将阻塞fsync调用很长时间,从而阻塞redis进程,注意当前还没有很好的解决,即使fsync与我们的写命令在不同的线程里(在同一事件循环中)

为了减轻此问题,可使用下面配置阻止在bgsave或bgrewriteaof时进行fsync调用,这意味着在持久化时相当于“appendfsync none”配置,这可能在极端情况下丢失30秒数据(linux默认配置),如果有特殊情况可以置为yes,否则为了安全考虑还是置为no吧

no-appendfsync-on-rewrite no

自动重写aof文件

redis可以在文件变大到一定程度时自动调用bgrewriteaof命令进行重写。工作原理:记录上一次文件大小,如果没有重写过,即为启动时大小,与当前大小比较,如果大于一定比例,则触发重写,另外需要是指最小触发大小,避免在文件很小时频繁触发,比例置为0禁用此功能

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb


 

lua 脚本

脚本超时时间 单位milliseconds

超时以后,redis 将记录下来脚本仍在执行并返回错误

当一个脚本执行了很长时间,这时只有script kill 和shutdown nosave命令可用,第一个用来停止还未执行写命令的脚本,第二个是脚本已经执行了写命令但用户不想等其执行完了情况下唯一一个关闭服务的命令

置为0或负值无限制的执行,没有警告

lua-time-limit 5000


redis集群

普通模式实例不能成为集群的一部分,必须得集群模式节点才可以,设置集群模式如下:

cluster-enabled yes

每个集群节点有一个集群配置文件,此文件由reids节点自动创建并更新,每个reids节点都需要一个不同的配置文件,要确保在同一系统中运行的集群节点不要有相同的配置文件名

cluster-config-file nodes-6379.conf

集群节点超时时间,超过此时间,被认为是failure状态,大多数其他内部超时时长是节点超时时长的倍数

cluster-node-timeout 15000

如果有多于配置的从节点,可以分配给没有从的主,例如设置为1,只有从多余1个,才可以往外分配,如果不想分配,设置此值为一个很大的值,可以置为0,但只可用于调试

cluster-migration-barrier 1

详细文档见http://redis.io


 

 

慢日志

redis慢日志记录执行时间超过配置的查询,不包括与客户端的I/O操作、回复等,只是执行命令的时间(阻塞并不能接受其他请求的时间),可以配置两个参数:

一个是执行时间,单位微秒,设置为1000000代表一秒,负值禁用,0值代表记录所有命令,另一个是慢日志的长度,新的记录会把最老的一条干掉。

slowlog-log-slower-than 1000

长度没限制但注意会占内存,可以通过Slowlog reset重置

slowlog-max-len 128


事件通知

redis可以通知PUB/SUb客户端关于key的操作,详情见http://redis.io/topic/keyspace-events

例如:当开启此功能时: 在客户端在数据库0号key "foo"上执行DEL操作时,两个消息被通过PUB/sub发布:

PUBLISH __keyspace@0__:foo del

PUBLISH __keyevent@0__:del foo

可以通过一系列类来选择相应的事件,每个类用一个字母代替:

K key空间事件,发布到以__keyspace@<db>__为前缀的频道

E  key操作事件,发布到以__keyevent@<db>__为前缀的频道

g  通用命令(非特定类型),如DEL、EXPIRE、RENAME。。。

$ 字符串命令

l list命令

s set命令

h hash命令

z sorted set命令

x 超时命令(每次有key超时时)

e 淘汰命令(每当有key因为内存淘汰时)

A g$lshzxe的别名,所以AKE代表所有事件

“notify-keyspace-events”将零个或多个字符组成的字符串作为参数。空字符串表示通知完全被禁用。

例子:如果记录通用事件和list事件使用notify-keyspace-events Elg

记录过期操作到__keyevent@0__:expired 使用notify-keyspace-events Ex

默认禁用状态,因为有额外的开销且大多数用户用不到,注意如果K和E最少选一个,否则相当于没起作用

notify-keyspace-events ""


高级配置

hash键使用压缩表数据结构的阈值:ziplist与hashtable转化条件

hash-max-ziplist-entries 512  (键值对数量小于512)

hash-max-ziplist-value 64  (每个键值对的key与value都要小于64字节)

 

list对象使用压缩表阈值:ziplist与linkedlist转化条件

list-max-ziplist-entries 512(数量小于512)

list-max-ziplist-value 64 (每个长度小于64字节)

set集合键转化条件  (intset与hashtable)只有所有元素都是整数且数量小于下面配置使用intset

set-max-intset-entries 512

sorted set使用ziplist阈值(ziplist与skiplist转化条件)skiplist编码使用zset结构(包含一个跳跃表与一个hashtable)

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

# HyperLogLog sparse representation bytes limit. The limit includes the
16 bytes header. When an HyperLogLog using the sparse representation crosses
this limit, it is converted into the dense representation.
#
# A value greater than 16000 is totally useless, since at that point the
# dense representation is more memory efficient.
#
# The suggested value is ~ 3000 in order to have the benefits of
# the space efficient encoding without slowing down too much PFADD,
# which is O(N) with the sparse encoding. The value can be raised to
# ~ 10000 when CPU is not a concern, but space is, and the data set is
# composed of many HyperLogLogs with cardinality in the 0 15000 range.
hll-sparse-max-bytes 3000
rehash期间是否每一100毫秒中使用一毫秒cpu时间用来rehash,reids实现中,rehash是一个渐进的过程:只用当你往字典中写数据,才会促进rehash,如果不写,rehash永远不会结束,会占用内存
默认yes代表每一秒会有10毫秒用来rehash,释放更多内存
不确定时:如果对延迟要求高,置为no ,没有特别高的延迟要求且想尽快释放内存置为yes
activerehashing yes
客户端输出缓冲区限制去强制断开读取数据不够快的客户端(常见情况:客户端读取PUb/sub速度跟不上生产速度)
此限制可以对三种不同类型客户端设置
normal --》普通
slave --》从节点
pubsub --》至少订阅一个频道或模式的客户端
语法如下:client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>
hard limit 一到,客户端立马被断开连接,持续超过soft limit指定时间也断开 连接
默认情况普通客户端没有限制,因为他们在没请求时不接收(以push的方式)数据,但在请求发生后,只有异步场景会出现读取速度跟不上请求速度的情况
pubsub和slave客户端默认情况有限制,因为他们通过push的方式接受数据
硬限制和软限制 都可以通过置为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订阅客户端订阅buffer超过32M或持续60秒超过8M,订阅立即被关闭!

并非所有任务都以相同的频率执行,但Redis会根据指定的“hz”值检查要执行的任务。

默认情况下,“hz”设置为10。当Redis空闲时,提高这个值将使用更多的CPU,但同时当有许多密钥同时过期时,Redis将更具响应性,并且可以更精确地处理超时。

范围在1到500之间,但是值超过100通常不是一个好主意。大多数用户应该使用默认值10,并且仅在需要非常低延迟的环境中才将此值提高到100。

hz 10

当子进程重写aof文件时,如果启用了下面选项,每产生32mb文件将被fsync,这用来增量保存文件到硬盘,避免较大的延迟峰值

aof-rewrite-incremental-fsync yes

 

posted @ 2020-04-14 23:34  菜鸟在行动  阅读(259)  评论(0)    收藏  举报