[TOC]
文档/链接
Redis 中文文档
如同只到 3.* 版本
- Redis 丑但更新的中文文档
图片来自: https://segmentfault.com/a/11...
高性能
官网数据: 10W+ QPS
- 数据存储在内存
- 单线程: 防止上下文切换和锁
- 多路I/O复用
数据类型及利用场景
String 字符串
- 单个 String 最大可存储 512 MB
- 二进制平安.
外部实现采纳 SDS(Simple Dynamic String)
相似 Go 的切片, 通过额定调配空间防止频繁内存调配.
应用场景
- 简略的 K-V 缓存性能
- 计数器
- 共享用户 Session
分布式锁
联合 lua
限速器
联合 lua
并发控制器
联合 lua
比方管制热点行更新之类的, 可参考 Laravel 6.x 的
Illuminate\Redis\Limiters\ConcurrencyLimiter
Set 汇合
- 无序汇合, 主动去重
- 反对交加, 并集, 差集操作
应用场景
- 排重
- 独特XX(独特好友....)
ZSet 有序汇合
应用场景
Top N 排行榜
复合排序
List 列表
应用场景
- New Top N
音讯队列
lpush, rbpop
Laravel的异步队列
- List
queues:default
期待执行的队列工作, rpush 和 lpop - Sorted Set
queues:default:delayed
提早工作队列(包含失败重试) - Sorted Set
queue:default:reserved
保留工作队列(执行中的队列, 防止脚本解体)
取工作:
- 从
queues:default
取出工作执行时会原子性地将其退出queue:default:reserved
队列(score为过期工夫), 同时减少其 attempts 次数. - 工作执行结束, 移除
queue:default:reserved
中该工作. 若失败且失败次数未达到限度则插入到queues:default:delayed
期待重试
- List
Hash 哈希表
- 适宜寄存相干的一组数据, 节俭内存占用.
HyperLogLog 基数统计
应用大量固定大小的内存(12kb+)来存储汇合中的惟一元素.
计数较小时采纳稠密矩阵, 较大时会主动转为浓密矩阵(此时占用12KB), 标准误差: 0.81%
大数据量下的近似基数统计
若要齐全准确的, 则思考 set 或 bitmap
应用场景
UV 统计
UV: 独立访客.
可通过 PFMERGE 合并统计所有页面的 UV 统计
Bitmap 位图
其实也是 String, 反对按位操作.
应用场景
节俭空间的统计
准确的数量统计
布隆过滤器
反复断定.
比方爬虫在对URL去重时, 数亿的 URL, 应用布隆过滤器能够大幅升高去重存储耗费, 代价仅仅是一小部分页面错过而已.
垃圾邮件过滤性能.
Geo 地理位置
应用场景
- 左近的人
Pub/Sub 公布订阅
应用场景
音讯播送
之前用 Go 写了一个短链接利用, 多个节点之间利用 redis 的公布订阅性能来异步移除已创立的短链在各个节点的本地缓存.
Stream
Redis 5.0 新增该类型: 长久化的公布/订阅零碎
集体临时理论去应用.
Stream 特点
音讯 ack 后仅标记删除, 需自行管制最大音讯队列长度
对于音讯量大且需长久保留, 还是倡议 Kafka
反对消费者组(Consumer Group)
保障每个音讯只会被消费者组内的其中一个消费者生产一次.
相干链接:
- Redis(8)——公布/订阅与Stream
CAS, Check And Set
了解为乐观锁
Check And Set, CAS 机制
CAS 是一种乐观锁机制
WATCH 键
此时能够读取键值, 若不合乎逻辑要求, 则可 UNWATCH 键, 并勾销后续操作
- MULTI 开启事务
- ... 批改键值
EXEC 执行事务
此时若 watch 的键有任意一个在 WATCH 之后, EXEC 之前 值发生变化, 则事务勾销.
伪代码
WATCH mykeyval = GET mykeyif (val <= 0) { return;}MULTIINCRBY mykey -1EXEC
若在 WATCH 之后, EXEC 之前, 其余客户端批改了键 mykey
, 则以后客户端事务会被勾销. 此时须要做的就是一直反复下面步骤, 直到不满足条件 或 事务胜利.
题外话: 其实用Lua脚本来实现更给力, 如下:
eval 'if redis.call("get", KEYS[1]) >= ARGV[1] then redis.call("incrby", KEYS[1], -ARGV[1]) return 1 else return 0 end' 1 mykey 1
外部数据结构
sdshdr
struct sdshdr{ int len; int free; char buf[];}
ziplist 和 quicklist
内存淘汰策略
Redis 在内存不足时的淘汰策略:
- volatile-lru:从设置了过期工夫的数据集中,抉择最近最久未应用的数据开释
- allkeys-lru:从数据集中(包含设置过期工夫以及未设置过期工夫的数据集中),抉择最近最久未应用的数据开释
- volatile-random:从设置了过期工夫的数据集中,随机抉择一个数据进行开释
- allkeys-random:从数据集中(包含了设置过期工夫以及未设置过期工夫)随机抉择一个数据进行入开释
- volatile-ttl:从设置了过期工夫的数据集中,抉择马上就要过期的数据进行开释操作
- noeviction(默认):返回谬误当内存限度达到并且客户端尝试执行会让更多内存被应用的命令(大部分的写入指令,但DEL和几个例外)
在Redis中LRU算法是一个近似 LRU 算法. 默认状况下,Redis随机筛选5个键,并且从中选取一个最近最久未应用的key进行淘汰,在配置文件中能够通过maxmemory-samples的值来设置redis须要查看key的个数,然而栓查的越多,消耗的工夫也就越久,然而构造越准确(也就是Redis从内存中淘汰的对象未应用的工夫也就越久~).
Redis 3.0 在应用 10 个采样键时成果靠近原始 LRU 算法.
数据过期删除策略
个别的策略:
定时删除: 在设置键过期的工夫同时,创立一个定时器,让定时器在键过期工夫降临,立刻执行对键的删除操作。
对CPU不敌对, 性能影响
惰性删除: 放任键过期不论,然而每次从键空间获取键时,都会查看该键是否过期,如果过期的话,就删除该键。
对内存不敌对
- 定期删除: 每隔一段时间,程序都要对数据库进行一次查看,删除外面的过期键,至于要删除多少过期键,由算法而定。
Redis 的实现是 惰性删除 和 定期删除 同时应用.
长久化
参考
- 面试中常常被问到的 Redis 长久化与复原
Redis 提供了两种长久化形式:
- RDB 长久化: 生成某个工夫点的快照文件
- AOF 长久化(append only file): 日志追加模式(Redis协定格局保留)
Redis能够同时应用以上两种长久化, 但在启动时会优先应用 AOF 文件复原.
Redis 4.0 之后存在一种新的长久化模式: 混合长久化将rdb的文件和部分增量的aof文件相结合,rdb能够应用相隔较长的工夫保留策略,aof不须要是全量日志,只须要保留前一次rdb存储开始到这段时间增量aof日志即可,一般来说,这个日志量是十分小的.
RDB
RDB 长久化(快照)
Redis 会 fork 一个子过程, 主过程持续解决申请.
对于 fork: fork的子过程占用内存大小等同于父过程, 实践须要2倍内存来实现长久化, 但 Linux 的 copy on write 机制能够让子过程共享父过程内存快照.仅当父过程做内存批改操作时, 才会创立所批改内存页的正本.
子过程将内存中数据写入到一个紧凑的文件中
它保留的是某个工夫点的残缺数据
备份策略
- 能够对 rdb 文件备份, 比方保留最近24小时的每小时备份文件,每个月每天的备份文件,便于遇到问题时复原。
Redis 启动时会从 rdb 文件中复原数据到内存, 因而复原数据时只需将redis敞开后,将备份的rdb文件替换以后的rdb文件,再启动Redis即可。
留神移除 aof 文件, 否则会优先从 aof 复原.
长处
- rdb文件体积比拟小, 适宜备份及传输
- 性能会比 aof 好(aof 须要写入日志到文件中)
- rdb 复原比 aof 要更快
毛病
- 服务器故障时会失落最初一次备份之后的数据
- Redis 保留rdb时, fork子过程的这个操作期间, Redis服务会进行响应(个别是毫秒级),但如果数据量大且cpu工夫缓和,则进行响应的工夫可能长达1秒
相干配置
################################ SNAPSHOTTING ################################# 快照配置# 正文掉“save”这一行配置项就能够让保留数据库性能生效# 设置redis进行数据库镜像的频率。# 900秒(15分钟)内至多1个key值扭转(则进行数据库保留--长久化) # 300秒(5分钟)内至多10个key值扭转(则进行数据库保留--长久化) # 60秒(1分钟)内至多10000个key值扭转(则进行数据库保留--长久化)save 900 1save 300 10save 60 10000#当RDB长久化呈现谬误后,是否进行,yes:进行工作,no:能够持续进行工作,能够通过info中的rdb_last_bgsave_status理解RDB长久化是否有谬误stop-writes-on-bgsave-error yes#应用压缩rdb文件,rdb文件压缩应用LZF压缩算法,yes:压缩,然而须要一些cpu的耗费。no:不压缩,须要更多的磁盘空间rdbcompression yes#是否校验rdb文件。从rdb格局的第五个版本开始,在rdb文件的开端会带上CRC64的校验和。这跟有利于文件的容错性,然而在保留rdb文件的时候,会有大略10%的性能损耗,所以如果你谋求高性能,能够敞开该配置。rdbchecksum yes#rdb文件的名称dbfilename dump.rdb#数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录dir /var/lib/redis
AOF
AOF 其实就是将客户端每一次操作记录追加到指定的aof(日志)文件中,在aof文件体积多大时能够主动在后盾重写aof文件(期间不影响失常服务,中途磁盘写满或停机等导致失败也不会失落数据)
aof 长久化的 fsync 策略:
- no : 不执行 fsync, 由操作系统保证数据同步到磁盘(linux 默认30秒), 速度最快
- always : 每次写入都执行 fsync, 保证数据同步到磁盘(最影响性能)
- everysec : 每秒执行一次 fsync, 最多失落最近1s的数据(举荐)
fsync:同步内存中所有已批改的文件数据到贮存设施
长处:
- 充分保证数据的长久化,正确的配置个别最多失落1秒的数据
- aof 文件内容是以Redis协定格局保留, 易读
- 日志是追加程序写入.
毛病:
- aof 文件比 rdb 快照大
- 应用 aof 文件复原比 rdb 慢
- aof 重写会造成短暂阻塞, 并耗费大量磁盘 IO
AOF 重写(bgrewriteaof)
- fork 子过程
子过程通过读取服务器以后的数据库状态, 并将其转化为操作命令写入 aof 临时文件
会复制主过程的空间内存页表, 对于 10GB 的 Redis 过程,须要复制大概 20MB 的内存页表
- 在此期间主过程会将新的命令同时写到 AOF缓冲区 和 AOF重写缓冲区.
- 子过程写入结束后, 主过程将 AOF 重写缓冲区的内容写入 aof 临时文件, 并原子笼罩原 aof 文件.
何时会触发 AOF 重写
- 以后没有 BGSAVE(RDB长久化)
- 以后没有 BGREWRITEAOF进行
- 用户调用 BGREWRITEAOF 手动触发
依据条件主动触发
- aof 文件大小大于
auto-aof-rewrite-min-size
, 且大于增长比率(绝对上一次重写后的aof文件大小)大于auto-aof-rewrite-percentage
- aof 文件大小大于
相干配置参数
############################## APPEND ONLY MODE ################################默认redis应用的是rdb形式长久化,这种形式在许多利用中曾经足够用了。然而redis如果中途宕机,会导致可能有几分钟的数据失落,依据save来策略进行长久化,Append Only File是另一种长久化形式,能够提供更好的长久化个性。Redis会把每次写入的数据在接管后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里,先疏忽RDB文件。appendonly yes#aof文件名, 保留目录由 dir 参数决定appendfilename "appendonly.aof"#aof长久化策略的配置#no示意不执行fsync,由操作系统保证数据同步到磁盘,速度最快。#always示意每次写入都执行fsync,以保证数据同步到磁盘。#everysec示意每秒执行一次fsync,可能会导致失落这1s数据。appendfsync everysec# 在aof重写或者写入rdb文件的时候,会执行大量IO,此时对于everysec和always的aof模式来说,执行fsync会造成阻塞过长时间,no-appendfsync-on-rewrite字段设置为默认设置为no。如果对提早要求很高的利用,这个字段能够设置为yes,否则还是设置为no,这样对长久化个性来说这是更平安的抉择。设置为yes示意rewrite期间对新写操作不fsync,临时存在内存中,等rewrite实现后再写入,默认为no,倡议yes。Linux的默认fsync策略是30秒。可能失落30秒数据。no-appendfsync-on-rewrite no#aof主动重写配置。当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,即当aof文件增长到肯定大小的时候Redis可能调用bgrewriteaof对日志文件进行重写。以后AOF文件大小是上次日志重写失去AOF文件大小的二倍(设置为100)时,主动启动新的日志重写过程。auto-aof-rewrite-percentage 100#设置容许重写的最小aof文件大小,防止了达到约定百分比但尺寸依然很小的状况还要重写auto-aof-rewrite-min-size 64mb#aof文件可能在尾部是不残缺的,当redis启动的时候,aof文件的数据被载入内存。重启可能产生在redis所在的主机操作系统宕机后,尤其在ext4文件系统没有加上data=ordered选项(redis宕机或者异样终止不会造成尾部不残缺景象。)呈现这种景象,能够抉择让redis退出,或者导入尽可能多的数据。如果抉择的是yes,当截断的aof文件被导入的时候,会主动公布一个log给客户端而后load。如果是no,用户必须手动redis-check-aof修复AOF文件才能够。aof-load-truncated yes
RESP 通信协定
RESP 是redis客户端和服务端之前应用的一种文本通信协定
RESP 的特点:实现简略、疾速解析、可读性好
距离符号: \r\n
简略字符串 Simple Strings
+ <字符串>\r\n
字符串不能蕴含 CR或者 LF(不容许换行)
若要发送二进制平安的字符串, 举荐应用 Bulk Strings
eg. +OK\r\n
谬误 Errors
-<谬误前缀> <错误信息> \r\n
eg. -Error unknow command 'foobar'\r\n
错误信息不能蕴含 CR或者 LF(不容许换行),Errors与Simple Strings很类似,不同的是Erros会被当作异样来对待
整数型 Integer
:数字+r+n
eg. :1000\r\n
大字符串类型 Bulk Strings
$<字符串的长度>\r\n<字符串>\r\n
字符串不能蕴含 CR或者 LF(不容许换行);
eg. $6\r\nfoobar\r\n
, 空字符串 $0\r\n\r\n
, null $-1\r\n
数组类型 Arrays
*<数组元素个数>\r\n<其余所有类型>
(结尾不须要rn)
留神:只有元素个数前面的rn是属于该数组的,结尾的rn个别是元素的
eg.
空数组"*0\r\n" 数组蕴含2个元素,别离是字符串foo和bar"*2\r\n$2\r\nfoo\r\n$3\r\nbar\r\n" 数组蕴含3个整数:1、2、3"*3\r\n:1\r\n:2\r\n:3\r\n" 蕴含混合类型的数组"*5\r\n:1\r\n:2\r\n:3\r\n:4\r\n$6\r\nfoobar\r\n" Null数组"*-1\r\n" 数组嵌套,外层数组蕴含2个数组,"*2\r\n*3\r\n:1\r\n:2\r\n:3\r\n*2\r\n+Foo\r\n-Bar\r\n" 整顿后如下:*2\r\n*3\r\n:1\r\n:2\r\n:3\r\n*2\r\n+Foo\r\n-Bar\r\n
Lua
参考链接
- Lua: A Guide for Redis Users
- Redis Lua编程与调试工具应用
Redis自3.2版本开始蕴含LDB,用于调试Lua脚本, LDB反对设置断点,逐行执行等。
- 像调试java一样来调试Redis lua
↑ 暂未测试
执行 Lua
redis-cli --eval xxx.lua key1 key2 , argv1 argv2
留神:
- key 和 argv 之间要用逗号分隔
示例
每分钟统计信息
-- KEYS 每分钟总负载, ZSET-- KEYS 期待队列, LIST-- ARGV[1] worker序号-- ARGV[2] 本分钟的工夫戳-- ARGV[3] 本分钟的工夫戳对应的字符串 y-m-d H:i:s-- ARGV[4] 本分钟内的总战斗耗时-- ARGV[5] 本分钟内的战斗次数-- ARGV[6] 本分钟内的战斗抛弃次数(已蕴含在下面), 指的是战斗提早过久, worker被动摈弃-- ARGV[7] 本分钟内的战斗出错次数(已蕴含在下面), 指的是战斗在lua层面上出错-- ARGV[8] worker过程内存占用-- ARGV[9] worker启动次数-- ARGV[10] 以后工夫, 秒(携带小数局部)local key_load_all = KEYS[1]local key_wait_list = KEYS[2]local worker = ARGV[1]local cur_time = tonumber(ARGV[2])local cur_time_str = ARGV[3]local battle_time = tonumber(ARGV[4])local battle_cnt = tonumber(ARGV[5])local battle_discard_cnt = tonumber(ARGV[6])local battle_error_cnt = tonumber(ARGV[7])local worker_res = tonumber(ARGV[8])local worker_start_cnt = tonumber(ARGV[9])local time_now = ARGV[10]local to_del-- 每分钟的总体负载local load_all = redis.call('ZRANGEBYSCORE', key_load_all, cur_time, cur_time);if next(load_all) ~= nil then to_del = load_all[1] load_all = cjson.decode(load_all[1])else load_all = {t = cur_time, ts = cur_time_str, battle_cost_time = 0, battle_cnt = 0, battle_error_cnt = 0, battle_discard_cnt = 0, wait_list = 0, worker_list = {}}end-- 总的累计, 不便查看load_all["battle_cost_time"] = load_all["battle_cost_time"] + battle_timeload_all["battle_cnt"] = load_all["battle_cnt"] + battle_cntload_all["battle_error_cnt"] = load_all["battle_error_cnt"] + battle_error_cntload_all["battle_discard_cnt"] = load_all["battle_discard_cnt"] + battle_discard_cnt-- 累计各个workerif load_all["worker_list"][worker] == nil then load_all["worker_list"][worker] = {battle_cost_time = 0, battle_cnt = 0, battle_error_cnt = 0, battle_discard_cnt = 0, process_res = 0, start_cnt = 0}endload_all["worker_list"][worker]["battle_cost_time"] = load_all["worker_list"][worker]["battle_cost_time"] + battle_timeload_all["worker_list"][worker]["battle_cnt"] = load_all["worker_list"][worker]["battle_cnt"] + battle_cntload_all["worker_list"][worker]["battle_error_cnt"] = load_all["worker_list"][worker]["battle_error_cnt"] + battle_error_cntload_all["worker_list"][worker]["battle_discard_cnt"] = load_all["worker_list"][worker]["battle_discard_cnt"] + battle_discard_cnt-- load_all["worker_list"][worker]["process_res"] = math.max(worker_res, load_all["worker_list"][worker]["process_res"])load_all["worker_list"][worker]["process_res"] = worker_resload_all["worker_list"][worker]["start_cnt"] = load_all["worker_list"][worker]["start_cnt"] + worker_start_cnt-- 工作队列长度local wait_list = tonumber(redis.call("LLEN", key_wait_list))load_all["wait_list"] = math.max(load_all["wait_list"], wait_list)if wait_list > 0 then local wait_list_item = redis.call("LINDEX", key_wait_list, -1) load_all["wait_longest"] = time_now - cjson.decode(wait_list_item)["BattleStartMicoTime"]endredis.call("ZADD", key_load_all, cur_time, cjson.encode(load_all))if to_del then redis.call("ZREM", key_load_all, to_del) to_del = nilendreturn 1
redis-cli 命令行客户端
# 查看以后有哪些 big keyredis-cli --bigkeys -i 0.1
big key 会导致集群中拜访 big key 时压力歪斜向对应的实例.
除了应用
redis-cli
外, 还能够应用其余工具(rdbtools)对 rdb 文件剖析查找 big key.优化准则
- hash: 对 field 取模, 进行哈希, 分成多个小的 hash
# 查看与Redis 的提早(基于PING指令), 单位: 毫秒redis-cli --latency
# 查看简略状态redis-cli --stat# 输入如下# ------- data ------ --------------------- load -------------------- - child -#keys mem clients blocked requests connections#133 3.59M 15 0 115095975 (+0) 15035835
Redis 3.* 默认配置文件中文解释
#redis.conf# Redis configuration file example.# ./redis-server /path/to/redis.conf################################## INCLUDES ####################################这在你有标准配置模板然而每个redis服务器又须要共性设置的时候很有用。# include /path/to/local.conf# include /path/to/other.conf################################ GENERAL ######################################是否在后盾执行,yes:后盾运行;no:不是后盾运行(老版本默认)daemonize yes #3.2里的参数,是否开启保护模式,默认开启。要是配置里没有指定bind和明码。开启该参数后,redis只会本地进行拜访,回绝内部拜访。要是开启了明码 和bind,能够开启。否 则最好敞开,设置为no。 protected-mode yes#redis的过程文件pidfile /var/run/redis/redis-server.pid#redis监听的端口号。port 6379#此参数确定了TCP连贯中已实现队列(实现三次握手之后)的长度, 当然此值必须不大于Linux零碎定义的/proc/sys/net/core/somaxconn值,默认是511,而Linux的默认参数值是128。当零碎并发量大并且客户端速度迟缓的时候,能够将这二个参数一起参考设定。该内核参数默认值个别是128,对于负载很大的服务程序来说大大的不够。个别会将它批改为2048或者更大。在/etc/sysctl.conf中增加:net.core.somaxconn = 2048,而后在终端中执行sysctl -p。tcp-backlog 511#指定 redis 只接管来自于该 IP 地址的申请,如果不进行设置,那么将解决所有申请bind 127.0.0.1#配置unix socket来让redis反对监听本地连接。# unixsocket /var/run/redis/redis.sock#配置unix socket应用文件的权限# unixsocketperm 700# 此参数为设置客户端闲暇超过timeout,服务端会断开连接,为0则服务端不会被动断开连接,不能小于0。timeout 0#tcp keepalive参数。如果设置不为0,就应用配置tcp的SO_KEEPALIVE值,应用keepalive有两个益处:检测挂掉的对端。升高中间设备出问题而导致网络看似连贯却曾经与对端端口的问题。在Linux内核中,设置了keepalive,redis会定时给对端发送ack。检测到对端敞开须要两倍的设置值。tcp-keepalive 0#指定了服务端日志的级别。级别包含:debug(很多信息,不便开发、测试),verbose(许多有用的信息,然而没有debug级别信息多),notice(适当的日志级别,适宜生产环境),warn(只有十分重要的信息)loglevel notice#指定了记录日志的文件。空字符串的话,日志会打印到规范输出设备。后盾运行的redis规范输入是/dev/null。logfile /var/log/redis/redis-server.log#是否关上记录syslog性能# syslog-enabled no#syslog的标识符。# syslog-ident redis#日志的起源、设施# syslog-facility local0#数据库的数量,默认应用的数据库是DB 0。能够通过”SELECT “命令抉择一个dbdatabases 16################################ SNAPSHOTTING ################################# 快照配置# 正文掉“save”这一行配置项就能够让保留数据库性能生效# 设置sedis进行数据库镜像的频率。# 900秒(15分钟)内至多1个key值扭转(则进行数据库保留--长久化) # 300秒(5分钟)内至多10个key值扭转(则进行数据库保留--长久化) # 60秒(1分钟)内至多10000个key值扭转(则进行数据库保留--长久化)save 900 1save 300 10save 60 10000#当RDB长久化呈现谬误后,是否仍然进行持续进行工作,yes:不能进行工作,no:能够持续进行工作,能够通过info中的rdb_last_bgsave_status理解RDB长久化是否有谬误stop-writes-on-bgsave-error yes#应用压缩rdb文件,rdb文件压缩应用LZF压缩算法,yes:压缩,然而须要一些cpu的耗费。no:不压缩,须要更多的磁盘空间rdbcompression yes#是否校验rdb文件。从rdb格局的第五个版本开始,在rdb文件的开端会带上CRC64的校验和。这跟有利于文件的容错性,然而在保留rdb文件的时候,会有大略10%的性能损耗,所以如果你谋求高性能,能够敞开该配置。rdbchecksum yes#rdb文件的名称dbfilename dump.rdb#数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录dir /var/lib/redis################################# REPLICATION ##################################复制选项,slave复制对应的master。# slaveof <masterip> <masterport>#如果master设置了requirepass,那么slave要连上master,须要有master的明码才行。masterauth就是用来配置master的明码,这样能够在连上master后进行认证。# masterauth <master-password>#当从库同主机失去连贯或者复制正在进行,从机库有两种运行形式:1) 如果slave-serve-stale-data设置为yes(默认设置),从库会持续响应客户端的申请。2) 如果slave-serve-stale-data设置为no,除去INFO和SLAVOF命令之外的任何申请都会返回一个谬误”SYNC with master in progress”。slave-serve-stale-data yes#作为从服务器,默认状况下是只读的(yes),能够批改成NO,用于写(不倡议)。slave-read-only yes#是否应用socket形式复制数据。目前redis复制提供两种形式,disk和socket。如果新的slave连上来或者重连的slave无奈局部同步,就会执行全量同步,master会生成rdb文件。有2种形式:disk形式是master创立一个新的过程把rdb文件保留到磁盘,再把磁盘上的rdb文件传递给slave。socket是master创立一个新的过程,间接把rdb文件以socket的形式发给slave。disk形式的时候,当一个rdb保留的过程中,多个slave都能共享这个rdb文件。socket的形式就的一个个slave程序复制。在磁盘速度迟缓,网速快的状况下举荐用socket形式。repl-diskless-sync no#diskless复制的延迟时间,避免设置为0。一旦复制开始,节点不会再接管新slave的复制申请直到下一个rdb传输。所以最好期待一段时间,等更多的slave连上来。repl-diskless-sync-delay 5#slave依据指定的工夫距离向服务器发送ping申请。工夫距离能够通过 repl_ping_slave_period 来设置,默认10秒。# repl-ping-slave-period 10#复制连贯超时工夫。master和slave都有超时工夫的设置。master检测到slave上次发送的工夫超过repl-timeout,即认为slave离线,革除该slave信息。slave检测到上次和master交互的工夫超过repl-timeout,则认为master离线。须要留神的是repl-timeout须要设置一个比repl-ping-slave-period更大的值,不然会常常检测到超时。# repl-timeout 60#是否禁止复制tcp链接的tcp nodelay参数,可传递yes或者no。默认是no,即应用tcp nodelay。如果master设置了yes来禁止tcp nodelay设置,在把数据复制给slave的时候,会缩小包的数量和更小的网络带宽。然而这也可能带来数据的提早。默认咱们举荐更小的提早,然而在数据量传输很大的场景下,倡议抉择yes。repl-disable-tcp-nodelay no#复制缓冲区大小,这是一个环形复制缓冲区,用来保留最新复制的命令。这样在slave离线的时候,不须要齐全复制master的数据,如果能够执行局部同步,只须要把缓冲区的局部数据复制给slave,就能恢复正常复制状态。缓冲区的大小越大,slave离线的工夫能够更长,复制缓冲区只有在有slave连贯的时候才分配内存。没有slave的一段时间,内存会被释放出来,默认1m。# repl-backlog-size 5mb#master没有slave一段时间会开释复制缓冲区的内存,repl-backlog-ttl用来设置该工夫长度。单位为秒。# repl-backlog-ttl 3600#当master不可用,Sentinel会依据slave的优先级选举一个master。最低的优先级的slave,入选master。而配置成0,永远不会被选举。slave-priority 100#redis提供了能够让master进行写入的形式,如果配置了min-slaves-to-write,衰弱的slave的个数小于N,mater就禁止写入。master起码得有多少个衰弱的slave存活能力执行写命令。这个配置尽管不能保障N个slave都肯定能接管到master的写操作,然而能防止没有足够衰弱的slave的时候,master不能写入来防止数据失落。设置为0是敞开该性能。# min-slaves-to-write 0#提早小于min-slaves-max-lag秒的slave才认为是衰弱的slave。# min-slaves-max-lag 10# 设置1或另一个设置为0禁用这个个性。# Setting one or the other to 0 disables the feature.# By default min-slaves-to-write is set to 0 (feature disabled) and# min-slaves-max-lag is set to 10.################################## SECURITY ####################################requirepass配置能够让用户应用AUTH命令来认证明码,能力应用其余命令。这让redis能够应用在不受信赖的网络中。为了放弃向后的兼容性,能够正文该命令,因为大部分用户也不须要认证。应用requirepass的时候须要留神,因为redis太快了,每秒能够认证15w次明码,简略的明码很容易被攻破,所以最好应用一个更简单的明码。# requirepass foobared#把危险的命令给批改成其余名称。比方CONFIG命令能够重命名为一个很难被猜到的命令,这样用户不能应用,而外部工具还能接着应用。# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52#设置成一个空的值,能够禁止一个命令# rename-command CONFIG ""################################### LIMITS ##################################### 设置能连上redis的最大客户端连贯数量。默认是10000个客户端连贯。因为redis不辨别连贯是客户端连贯还是外部关上文件或者和slave连贯等,所以maxclients最小倡议设置到32。如果超过了maxclients,redis会给新的连贯发送’max number of clients reached’,并敞开连贯。# maxclients 10000#redis配置的最大内存容量。当内存满了,须要配合maxmemory-policy策略进行解决。留神slave的输入缓冲区是不计算在maxmemory内的。所以为了避免主机内存应用完,倡议设置的maxmemory须要更小一些。# maxmemory <bytes>#内存容量超过maxmemory后的解决策略。#volatile-lru:利用LRU算法移除设置过过期工夫的key。#volatile-random:随机移除设置过过期工夫的key。#volatile-ttl:移除行将过期的key,依据最近过期工夫来删除(辅以TTL)#allkeys-lru:利用LRU算法移除任何key。#allkeys-random:随机移除任何key。#noeviction:不移除任何key,只是返回一个写谬误。#下面的这些驱赶策略,如果redis没有适合的key驱赶,对于写命令,还是会返回谬误。redis将不再接管写申请,只接管get申请。写命令包含: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 noeviction#lru检测的样本数。应用lru或者ttl淘汰算法,从须要淘汰的列表中随机抉择sample个key,选出闲置工夫最长的key移除。# maxmemory-samples 5############################## APPEND ONLY MODE ################################默认redis应用的是rdb形式长久化,这种形式在许多利用中曾经足够用了。然而redis如果中途宕机,会导致可能有几分钟的数据失落,依据save来策略进行长久化,Append Only File是另一种长久化形式,能够提供更好的长久化个性。Redis会把每次写入的数据在接管后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里,先疏忽RDB文件。appendonly no#aof文件名appendfilename "appendonly.aof"#aof长久化策略的配置#no示意不执行fsync,由操作系统保证数据同步到磁盘,速度最快。#always示意每次写入都执行fsync,以保证数据同步到磁盘。#everysec示意每秒执行一次fsync,可能会导致失落这1s数据。appendfsync everysec# 在aof重写或者写入rdb文件的时候,会执行大量IO,此时对于everysec和always的aof模式来说,执行fsync会造成阻塞过长时间,no-appendfsync-on-rewrite字段设置为默认设置为no。如果对提早要求很高的利用,这个字段能够设置为yes,否则还是设置为no,这样对长久化个性来说这是更平安的抉择。设置为yes示意rewrite期间对新写操作不fsync,临时存在内存中,等rewrite实现后再写入,默认为no,倡议yes。Linux的默认fsync策略是30秒。可能失落30秒数据。no-appendfsync-on-rewrite no#aof主动重写配置。当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,即当aof文件增长到肯定大小的时候Redis可能调用bgrewriteaof对日志文件进行重写。以后AOF文件大小是上次日志重写失去AOF文件大小的二倍(设置为100)时,主动启动新的日志重写过程。auto-aof-rewrite-percentage 100#设置容许重写的最小aof文件大小,防止了达到约定百分比但尺寸依然很小的状况还要重写auto-aof-rewrite-min-size 64mb#aof文件可能在尾部是不残缺的,当redis启动的时候,aof文件的数据被载入内存。重启可能产生在redis所在的主机操作系统宕机后,尤其在ext4文件系统没有加上data=ordered选项(redis宕机或者异样终止不会造成尾部不残缺景象。)呈现这种景象,能够抉择让redis退出,或者导入尽可能多的数据。如果抉择的是yes,当截断的aof文件被导入的时候,会主动公布一个log给客户端而后load。如果是no,用户必须手动redis-check-aof修复AOF文件才能够。aof-load-truncated yes################################ LUA SCRIPTING ################################ 如果达到最大工夫限度(毫秒),redis会记个log,而后返回error。当一个脚本超过了最大时限。只有SCRIPT KILL和SHUTDOWN NOSAVE能够用。第一个能够杀没有调write命令的货色。要是曾经调用了write,只能用第二个命令杀。lua-time-limit 5000################################ REDIS CLUSTER ################################集群开关,默认是不开启集群模式。# cluster-enabled yes#集群配置文件的名称,每个节点都有一个集群相干的配置文件,长久化保留集群的信息。这个文件并不需要手动配置,这个配置文件有Redis生成并更新,每个Redis集群节点须要一个独自的配置文件,请确保与实例运行的零碎中配置文件名称不抵触# cluster-config-file nodes-6379.conf#节点互连超时的阀值。集群节点超时毫秒数# cluster-node-timeout 15000#在进行故障转移的时候,全副slave都会申请申请为master,然而有些slave可能与master断开连接一段时间了,导致数据过于古老,这样的slave不应该被晋升为master。该参数就是用来判断slave节点与master断线的工夫是否过长。判断办法是:#比拟slave断开连接的工夫和(node-timeout * slave-validity-factor) + repl-ping-slave-period#如果节点超时工夫为三十秒, 并且slave-validity-factor为10,假如默认的repl-ping-slave-period是10秒,即如果超过310秒slave将不会尝试进行故障转移 # cluster-slave-validity-factor 10#master的slave数量大于该值,slave能力迁徙到其余孤立master上,如这个参数若被设为2,那么只有当一个主节点领有2 个可工作的从节点时,它的一个从节点会尝试迁徙。# cluster-migration-barrier 1#默认状况下,集群全副的slot有节点负责,集群状态才为ok,能力提供服务。设置为no,能够在slot没有全副调配的时候提供服务。不倡议关上该配置,这样会造成分区的时候,小分区的master始终在承受写申请,而造成很长时间数据不统一。# cluster-require-full-coverage yes################################## 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################################ LATENCY MONITOR ###############################提早监控性能是用来监控redis中执行比拟迟缓的一些操作,用LATENCY打印redis实例在跑命令时的耗时图表。只记录大于等于下边设置的值的操作。0的话,就是敞开监督。默认提早监控性能是敞开的,如果你须要关上,也能够通过CONFIG SET命令动静设置。latency-monitor-threshold 0############################# EVENT NOTIFICATION ###############################键空间告诉使得客户端能够通过订阅频道或模式,来接管那些以某种形式改变了 Redis 数据集的事件。因为开启键空间告诉性能须要耗费一些 CPU ,所以在默认配置下,该性能处于敞开状态。#notify-keyspace-events 的参数能够是以下字符的任意组合,它指定了服务器该发送哪些类型的告诉:##K 键空间告诉,所有告诉以 __keyspace@__ 为前缀##E 键事件告诉,所有告诉以 __keyevent@__ 为前缀##g DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的告诉##$ 字符串命令的告诉##l 列表命令的告诉##s 汇合命令的告诉##h 哈希命令的告诉##z 有序汇合命令的告诉##x 过期事件:每当有过期键被删除时发送##e 驱赶(evict)事件:每当有键因为 maxmemory 政策而被删除时发送##A 参数 g$lshzxe 的别名#输出的参数中至多要有一个 K 或者 E,否则的话,不论其余的参数是什么,都不会有任何 告诉被散发。具体应用能够参考http://redis.io/topics/notificationsnotify-keyspace-events ""############################### ADVANCED CONFIG ################################数据量小于等于hash-max-ziplist-entries的用ziplist,大于hash-max-ziplist-entries用hashhash-max-ziplist-entries 512#value大小小于等于hash-max-ziplist-value的用ziplist,大于hash-max-ziplist-value用hash。hash-max-ziplist-value 64#数据量小于等于list-max-ziplist-entries用ziplist,大于list-max-ziplist-entries用list。list-max-ziplist-entries 512#value大小小于等于list-max-ziplist-value的用ziplist,大于list-max-ziplist-value用list。list-max-ziplist-value 64#数据量小于等于set-max-intset-entries用iniset,大于set-max-intset-entries用set。set-max-intset-entries 512#数据量小于等于zset-max-ziplist-entries用ziplist,大于zset-max-ziplist-entries用zset。zset-max-ziplist-entries 128#value大小小于等于zset-max-ziplist-value用ziplist,大于zset-max-ziplist-value用zset。zset-max-ziplist-value 64#value大小小于等于hll-sparse-max-bytes应用稠密数据结构(sparse),大于hll-sparse-max-bytes应用浓密的数据结构(dense)。一个比16000大的value是简直没用的,倡议的value大略为3000。如果对CPU要求不高,对空间要求较高的,倡议设置到10000左右。hll-sparse-max-bytes 3000#Redis将在每100毫秒时应用1毫秒的CPU工夫来对redis的hash表进行从新hash,能够升高内存的应用。当你的应用场景中,有十分严格的实时性须要,不可能承受Redis时不时的对申请有2毫秒的提早的话,把这项配置为no。如果没有这么严格的实时性要求,能够设置为yes,以便可能尽可能快的开释内存。activerehashing yes##对客户端输入缓冲进行限度能够强制那些不从服务器读取数据的客户端断开连接,用来强制敞开传输迟缓的客户端。#对于normal client,第一个0示意勾销hard limit,第二个0和第三个0示意勾销soft limit,normal client默认勾销限度,因为如果没有寻问,他们是不会接收数据的。client-output-buffer-limit normal 0 0 0#对于slave client和MONITER client,如果client-output-buffer一旦超过256mb,又或者超过64mb继续60秒,那么服务器就会立刻断开客户端连贯。client-output-buffer-limit slave 256mb 64mb 60#对于pubsub client,如果client-output-buffer一旦超过32mb,又或者超过8mb继续60秒,那么服务器就会立刻断开客户端连贯。client-output-buffer-limit pubsub 32mb 8mb 60#redis执行工作的频率为1s除以hz。hz 10#在aof重写的时候,如果关上了aof-rewrite-incremental-fsync开关,零碎会每32MB执行一次fsync。这对于把文件写入磁盘是有帮忙的,能够防止过大的提早峰值。aof-rewrite-incremental-fsync yes