Redis

Redis

五大基本数据类型

About Connection常用命令
Auth password							认证redis当前服务器的密码

ECHO message							返回message

Ping									测试当前连接是否还可用

Quit									请求服务器关闭连接,服务器会处理未完成的请求

Select index								选择一个数据库,默认库16,默认选择DB0

SwapDB index index						交换同一服务器上的两个DataBase
redis-key基本常用命令
keys pattern								查看所有匹配给定模式的key

exists key								判断当前key是否存在

del key[key...]							删除key

rename key newkey						将一个key重命名

renamenx key newkey					当newkey不存在时,才修改,key不存在则返回error

move key [db]							移除指定的key,或者移动到另一个库

expire key seconds						设置key的过期时间	

pexpire key milliseconds					和expire作用相同,不同的是以毫秒指定

expireat key timestrap					指定key在某一时间戳失效		

pexpireat key milliseconds-timestamp		以毫秒指定失效时间

ttl key									查看当前key的状态(key的过期时间)

pttl key									查看当前key的状态(key的过期时间)(毫秒)

type key									查看当前key的数据类型

dump key 								序列化给定key的值,key不存在返回nil

migrate	host port key|"" destination-db timeout COPY [AUTH password],[KEYS key [key ...]]
										移动key 到另一个server

object subcommand [arguments [arguments ...]]
		idletime 						获取key存在的时间,s单位
		encoded						获取key的编码方式

persist key								改变一个key的状态为持久的,不会过期的

randomkey								随机返回当前数据库的一个key

scan cursor [MATCH pattern],[COUNT count],[TYPE type]	增量迭代key

restore key ttl serialized-value [replace]	反序列化一个key

wait numslaves timeout					阻塞当前客户端,直到所有以前的写命令都成功的传输和指定的slaves确认.

String类型(字符串类型)

set (key name) (key value)					添加string 类型的key 和 value

get (key name)							获取string 类型对应的值

append (key name) (append value)			为key追加值

strlen (key name) 						获取key对应value的长度

incr (key name) 							为key++ 加一 

decr (key name) 							为key-- 加一 

incrby (key name) [step size]				为key++ 默认加一 可以设置步长

decrby (key name) [step size]				为key-- 默认加一 可以设置步长

getrange  (key name) (start) (end)			截取字符串 从start到end,(0 到 -1和get效果一样)

setrange  (key name) (start) (value)			替换指定位置的字符串

setex (key name) (seconds) (key value)		set with expire 设置一个string并附带过期时间

setnx (key name) (key value)				set if not exists 如果不存在key则设置

mset (key name) (key value) [key value .....]	同时设置多个值

mget (key name) [key....]					同时获取多个值

msetnx  (key name) (key value) [key value .....] 同时设置多个值(msetnx是一个原子性的操作 ,一起成功,或者失败)

getset (key name) (key value)				获取并设置,如果key存在则替换原来的值,不存在则创建并返回nil(null)

对象:

set user:{id} {name:zhangsan,age:18} 可以保存一个json对象

string 类型,可以是我们的字符串,也可以是数字。
List类型
在redis中可以把List设计成栈,队列,阻塞队列。

lpush (key name) (key value)				将一个值插入到list的头部(左)

rpush (key name) (key value)				将一个值插入到list的尾部(右)

lrange  (key name) (start) (end)				遍历list ,通过区间获取list值(start:0 end:-1输出list全部元素)

lpop (key name)							左边移除list中第一个值

rpop (key name)							右边移除list中第一个值

blpop (key name)[timeout]				阻塞式移除第一个值,另一线程放入值时,删除第一个

brpop (key name)[timeout]				阻塞式移除第一个值,另一线程放入值时,删除最后一个

lpos (key name)(value)[rank int],[count]		通过value获取下标,rank指定匹配第几个

lindex (key name) (index)					通过下标获取list中的值

llen (key name)							返回list的长度

lrem (key name) (rm number) (value)		移除指定list中确定数量的相同value,精确匹配

ltrim (key name)  (start) (end)				修剪,截取start-end区间的值,list会被改变

rpoplpush (source key) (destination key)		从source list尾部移除一个值添加到desitnation list中	

lset (key name) (index) (new value)			设置指定下标list中的值,如index不存在,则报错

linsert (key name) (before or after) (value)(insertVal)	插入一个值到指定值的前面或者后面
Set类型
set中的值是不可以重复的!

sadd (key name) (value) 					向set集合中添加元素

smembers (key name)					查看set集合中所有元素

sismember (key name) (value)				查看set集合中是否存在value

scard (key name)							查看set集合的个数(size)

srem (key name) (value) 					移除set集合中指定的个数

srandmember (key name)	[size]			随机抽取set集合中的一个元素,可以指定抽取的个数

spop (key name)							随机删除set集合中的元素

smove (source key)(target key)(source value)	移动source集合中的value到target集合中去

sdiff (key1 name)(key2 name)				求两个集合的差集

sinter (key1name)(key2 name)				求两个集合的交集

sunion (key1name)(key2 name) 			求两个集合的并集

sinterstore  (destination) (keyname[key name]) 求两个集合的交集,并存储在目标set中

sunionstore  (destination) (keyname[key name]) 求两个集合的并集,并存储在目标set中

sdiff (key1 name)(key2 name)				求两个集合的差集
Hash类型
hset (key name)(field)(value)				向hash中添加一个key-value

hget (key name)(field)						向hash中获取一个key-value

hmset (key name)(field)(value)[field...value...]向hash中添加多个key-value

hmget (key name)(field)[field...]				向hash中添加多个key-value

hgetall (key name)						获取hash中所有的key-value

hdel (key name)(field)						删除hash指定的key字段

hlen (key name)							获取hash表中的字段数量

hexists (key name)(field)					判断hash中指定的字段是否存在

hkeys (key name)							获得hash中所有的keys

hvals (key name)							获得所有的value值

hincrby (key name)(field)(increment)		按increment增长

hsetnx  (key name)(field)(value)				存在field,则不设置
Zset(有序集合)
在set的基础上,增加了一个score值,实现了可排序集合

zadd (key)(scores...)(value...)				添加值到key中,可添加多个

zrange (key)(start)(end)					遍历zset,升序

zrevrange (key)(start)(end)					遍历zset,降序

zrangebyscore (key)(min)(max)[withscores],[limit min max]	以scores升序排序

zrevrangebyscore (key)(max)(min)[withscores],[limit min max]	以scores降序排序

zrem (key)(value)							移除元素

zremrangebyscore (key)(score min max)		移除元素

zremrangebylex

zremrangebyrank

zcard (key)								获取元素中的个数

zcount (key) (min max)					获取score指定区间的个数

zlexcount

zincrby (key) (increment menber)

zrank (key)(member)						获取元素的下标

zscore (key)(member)						获取元素的score

zpopmin (key)[count]						从最小的移除

zpopmmax (key)[count]					从最大的移除

bzpopmin (key)[count]					阻塞式的移除

bzpopmax (key)[count]					阻塞式的移除

zinterstore destination keysmember keys[key..],[weights...]

zuinonstore ....

三种特殊数据类型

geospatial
规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!
有效的经度从-180度到180度。
有效的纬度从-85.05112878度到85.05112878度。
当坐标位置超出上述指定范围时,该命令将会返回一个错误。 

geoadd (keyname)(经度)(纬度)(名称)				添加一个坐标

geopos (keyname)(名称....)						获取一个坐标,可以获取多个

geodist (keyname)(名称)(名称)(m米,km千米,mi英里,ft英尺)	获取两个坐标之间的直线距离

georadius (keyname)(经度)(纬度)(半径)			以一个坐标(给定的经度和纬度)查询其半径中所有的坐标
	withdist 									显示到中心坐标的位置
	withcoord								显示其他的坐标的经度和纬度
	count size								限制查询的个数

georadiusbymember (keyname)(名称)(半径)		以一个坐标(geo集合中的名称)查询其半径中所有的坐标

geohash (keyname)(名称...)					将二维的经纬度转换为一维的11位字符串

	ps:geospatial 的底层是zset,所以可以用zset中的API去操作geospatial.
Hyperloglog

hyperloglog

pfadd (keyname)(value...)					创建(添加)一组数据

pfcount (keyname...)						统计元素的数量

pfmerge (distkey) (sourcekey...)				将sourcekey合并到一个新的distkey中

如果允许容错,就可以使用hyperloglog!
不允许,则可使用set或者自己的数据类型.

bitmap类型

bit

setbit (keyname)(offset(int)-value(0/1))				添加bitmap的offset 和 value

getbit (keyname)(offset)							获取bitmap中offset的value

bitcount (keyname)[start end]						统计全部或者offset的某一个区间为1的个数

bitop 

bitpos key bit [start],[end]							返回字符串中设置为1或0的第一个位的位置。start和end,代表开始字节和结束字节,不是bit.

bitfield key (set|get|incrby)[overflow]

Stream类型(5.0)

流是一个新的数据类型介绍了复述,5.0,模型一个日志数据结构以一种更抽象的方式,hovrever日志的本质仍然是完整的:像一个日志文件,通常实现为一个文件只在附加模式只复述,流主要是一个附加的数据结构。至少在概念上,因为Redis流化了在内存中表示的抽象数据类型,他们实现了更强大的操作,以克服日志文件本身的限制。

Id <millisecondsTime><sequenceNumber>
xadd key id field value[field value...]
xrange key start end [COUNT count]
xrevrange key start end [COUNT count]
xread [COUNT count],[BLOCK milliseconds] STREAMS key [key ...] id [id ...]
xlen key
xgroup [CREATE key groupname id-or-$] [SETID key id-or-$] DESTROY key groupname
xreadgroup 
xack key group ID [ID ...]
XCLAIM key group consumer min-idle-time ID [ID ...] [IDLE ms] [TIME ms-unix-time] [RETRYCOUNT count] [FORCE] [JUSTID]
xinfo [CONSUMERS key groupname] [GROUPS key] [STREAM key] [HELP]

事务

redis事务本质 : 一组命令的集合!一个事务的所有命令都会被序列化,在事务执行的过程中,会按照顺序执行!
redis事务的特性:一次性,顺序性,排他性!
redis事务中没有隔离级别的概念
所有的命令在事务中,并没有直接被执行!只有发起执行命令的时候才会执行!
Redis单条命令试保存原子性,但事务不保证原子性!

multi	开启事务
-------	命令队
exec	执行事务
discard	 取消事务
编译型异常(代码有问题!命令有错!)事务中所有命令都不会被执行。
运行时异常 如果事务中存在语法性或者其他错误!那么执行事务时,其他命令是可以正常执行的,错误命令抛异常。

redis可以用watch来实现乐观锁,unwatch释放对锁的监视,总是返回OK。

Redis.conf

单位

单位
配置文件unit单位,对大小写不敏感!

包含别的配置文件,组合成一个配置文件,好比java中的import

unit

网络配置

网络配置
bind 127.0.0.1 绑定的IP
protected-mode yes 保护模式
port 6379 端口

通用的配置

通用的配置
daemonize yes 以守护进程开启redis,默认是no,须手动配置为yes
supervised no 管理守护进程,默认为no

在这里插入图片描述
pidfile 如果服务以守护进程开启,则需指定一个pid文件,多个服务则指定多个pid

在这里插入图片描述
redis6之前有个属性loglevel日志的等级
logfile “” 日志的标准文件名
在这里插入图片描述
database 16 redis 默认16个库
always-show-logo yes 是否总是显示LOGO

快照
在这里插入图片描述

持久化的规则,在规定的时间内,执行了多少次操作,则会持久化到 .rdb .aof 文件中
redis是内存数据库,如果没有持久化,数据断电即失!

save 900 1 如果九百秒内,如果至少有一个key发生了修改,就进行持久化操作
save 300 10 如果三百秒内,如果至少有十个key发生了修改,就进行持久化操作
save 60 10000 如果六十秒内,如果至少有一万个key发生了修改,就进行持久化操作
之后,可以定义自己的持久化规则

在这里插入图片描述
stop-writes-on-bgsave-error yes 持久化出错,是否还要继续工作,yes为停止工作
rdbconpression yes 是否压缩rdb文件,!需要消耗一些cpu资源

在这里插入图片描述
rdbchecksum yes 保存RDB文件时,是否进行错误的校验,需要消耗一些性能!
dbfilename dump.rdb 转储数据库的文件名

在这里插入图片描述
rdb-del-sync-files no
dir ./ rdb文件要保存的目录,文件名通过上面的dbfilename指定

REPLICATION 主从复制时的一些设置

在这里插入图片描述

SECURITY 安全设置

在这里插入图片描述
requirepass xxxxx 可以设置连接redis时需要的密码,默认没有密码
通过命令设置密码 config set requirepass “”
通过命令获取密码 config get requirepass
设置密码后,使用auth (password) 验证登录

CLIENTS 限制

在这里插入图片描述
maxclients 10000 能连接上redis最大连接的客户端数量

MEMORY MANGEMENT 内存管理

在这里插入图片描述
maxmemory 配置redis最大的内存容量

在这里插入图片描述
maxmemory-policy noeviction 内存达到上限之后的处理策略,六种

	1、volatile-lru:只对设置了过期时间的key进行LRU(默认值) 
	2、allkeys-lru : 删除lru算法的key   
	3、volatile-random:随机删除即将过期key   
	4、allkeys-random:随机删除   
	5、volatile-ttl : 删除即将过期的   
	6、noeviction : 永不过期,返回错误

可以通过命令设置策略

config set maxmemory-policy volatile-lru[...]

redis6的新特性,多线程
在这里插入图片描述

io-threads 4 线程的数量

APPEND ONLY 模式

在这里插入图片描述
appendonly on 默认是不开启aof模式的,默认使用rdb方式持久化,大部分情况下,rdb是够用的
appendfilename aof持久化文件的名字

Redis持久化

RDB(Redis DataBase)

在这里插入图片描述
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里.

Redis会单独创建(fork )一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何I0操作的。这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。我们默认的就是RDB,一般情况下不需要修改这个配置!

生产环境中,有时会对rdb文件进行备份。

触发机制

1.save 的规则满足了,会自动触发 rdb规则!
2.执行 flushall 命令,也会触发我们的rdb规则!
3.退出redis,也会产生一个rdb文件!

如何恢复rdb文件

只需要将rdb文件放在我们redis的启动目录下,redis启动时会自动检查dump.rdb恢复其中的数据。

查看文件存在的位置

在这里插入图片描述
/usr/local/bin 下存在dump.rdb文件,启动就会自动恢复其中的文件

rdb优点

1.适合大规模数据恢复
2.对数据完整性要求不搞!

rdb缺点

1.需要一定的时间间隔去操作!如果redis服务器意外宕机了,那么最后一次修改的数据就没了;
2.fork进程的时候,会占用一定的内存空间;

命令

save 手动保存当前机器数据到rdb文件中

AOF(Append Only File)

将我们的所有命令都记录下来,history,恢复的时候就把这个文件全部在执行一遍!

以日志的形式来记录每个写操作,将Redis执行过的所有指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作

配置文件
appendonly on 默认是不开启aof模式的,默认使用rdb方式持久化
appendfilename aof持久化文件的名字
appendfsync always 每一次都写入aof文件
appendfsync everysec 每一秒中向aof文件中写入
appendfsync no 默认

如果aof文件有错误,启动redis是启动不起来的,可以使用命令修复这个文件
redis提供的一个工具redis-check-aof --fix (文件位置+名称)
如果文件正常,重启就可以恢复了.

优点和缺点

优点:
1.每一次修改都同步,文件的完整性会更加好;
2.每秒同步一次,可能会丢失一秒的数据;
3.从不同步,效率最高;

缺点:
1.相对于数据文件来说,aof 远远大于rdb,修复的速度也比rdb慢!
2.aof 运行效率也要比rdb慢,所以我们redis默认为rdb持久化。

重写规则说明

aof默认是无限追加的,文件会约来约大,这个时候就可以定义自己的重写规则。
在这里插入图片描述
no-appendfsync-on-rewrite no 是否开启重写
auto-aof-rewrite-percentage 100 当前增长的百分比达到多少开始重写
auto-aof-rewrite-min-size 64mb 大于64mb重写文件

扩展:

1、RDB持久化方式能够在指定的时间间隔内对你的数据进行快照存储

2、AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以Redis协议追加保存每次写的操作到文件末尾,Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。

3、只做缓存,如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化

4、同时开启两种持久化方式
·在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。
·RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件,那要不要只使用AOF呢?作者建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份),快速重启,而且不会有AOF可能潜在的Bug,留着作为一个万一的手段。

5、性能建议
·因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 9001这条规则。
·如果Enable AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了,代价一是带来了持续的IO,二是AOFrewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少AOFrewrite的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上,默认超过原大小100%大小重写可以改到适当的数值。
·如果不Enable AOF,仅靠Master-Slave Repllcation实现高可用性也可以,能省掉一大笔IO,也减少了rewrite时带来的系统波动。代价是如果Master/Slave同时倒掉,会丢失十几分钟的数据,启动脚本也要比较两个Master/Slave中的RDB文件,载入较新的那个,微博就是这种架构。

Redis发布/订阅

Redis 发布订阅(pub/sub)是一种消息通信模式︰发送者(pub)发送消息,订阅者(sub)接收消息。微信、微博、关注系统!
Redis客户端可以订阅任意数量的频道。

subscribe channel [channel...] 						订阅一个或多个频道

publish channel message							在一个频道发布一个消息

unsubscribe channel [channel...] 					取消订阅指定的频道

psubscribe pattern [pattern ...]						订阅给定模式的频道

punsubscribe [pattern [pattern ...]]				     	取消订阅给定模式的频道

pubsub subcommand[argument [argument ...]]		检查pub/sub的状态
	subcommand 	channals [pattern]			列出当前active channels.active是指信道含有一个或多个订阅者(不包括从模式接收订阅的客户端) ,如果pattern未提供,所有的信道都被列出,否则只列出匹配上指定全局-类型模式的信道被列出.
	subcommand 	numsub[channel-1 ... channel-N]	列出指定信道的订阅者个数(不包括订阅模式的客户端订阅者)
	subcommand 	numpat						返回订阅模式的数量(使用命令PSUBSCRIBE实现).注意, 这个命令返回的不是订阅模式的客户端的数量, 而是客户端订阅的所有模式的数量总和。

原理

Redis是使用C实现的,通过分析Redis源码里的pubsub.c文件,了解发布和订阅机制的底层实现,籍此加深对Redis 的理解。

Redis通过PUBLISH、SUBSCRIBE 和PSUBSCRIBE等命令实现发布和订阅功能。

通过SUBSCRIBE命令订阅某频道后,redis-server里维护了一个字典,字典的键就是一个个频道!,而字典的值则是一个链表,链表中保存了所有订阅这个channel的客户端。SUBSCRIBE命令的关键,就是将客户端添加到给定channel的订阅链表中。

通过PUBLISH命令向订阅者发送消息,redis-server会使用给定的频道作为键,在它所维护的channel字典中查找记录了订阅这个频道的所有客户端的链表,遍历这个链表,将消息发布给所有订阅者。Pub/Sub从字面上理解就是发布(Publish )与订阅(Subscribe ),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。

主从复制

主从复制

一般来说,要将Redis运用于工程项目中,只使用一台Redis是万万不能的,原因如下:

1、从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大;

2、从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量为256G,也不能将所有内存用作Redis存储内存,

一般来说,单台Redis最大使用内存不应该超过20G。

电商网站上的商品,一般都是一次上传,无数次浏览的,说专业点也就是"多读少写""。

对于这种场景,我们可以使如下这种架构∶
在这里插入图片描述
主从复制,读写分离!80%的情况下都是在进行读操作!减缓服务器的压力!架构中经常使用!一主二从!
只要在公司中,主从复制就是必须要使用的,因为在真实的项目中不可能单机使用Redis !

环境配置

只配置从机,不用配置主机(redis默认就是主机)!

命令 info replication 查看当前库信息

role:master					#角色master
connected_slaves:0 			#没有从机
master_replid:b63c90e6c501143759cb0e7f450bd1eb0c70882a
master_replid2:00000000000000000000000000000000000000000
master_rep1_offset:0
second_rep1_offset:-1
rep1_backlog_active:0
rep1_backlog_size:1048576
rep1_backlog_first_byte_offset:0
rep1_backlog_histlen :0

复制3个配置文件,然后修改对应的信息
1.端口
2.pid文件的名字
3.log文件名字
4.dump.rdb名字
5.replicaof host post(也可以手动指定replicaof host post)

无磁盘复制(Diskless replication)

正常情况下,一个全量重同步要求在磁盘上创建一个 RDB 文件,然后将它从磁盘加载进内存,然后 slave以此进行数据同步。

如果磁盘性能很低的话,这对 master 是一个压力很大的操作。Redis 2.8.18 是第一个支持无磁盘复制的版本。在此设置中,子进程直接发送 RDB 文件给 slave,无需使用磁盘作为中间储存介质。

无磁盘复制可以使用 repl-diskless-sync 配置参数。

repl-diskless-sync-delay 参数可以延迟启动数据传输,目的可以在第一个 slave就绪后,等待更多的 slave就绪。

一主二从

默认情况下,每台redis服务器都是主机。

测试︰主机断开连接,从机依旧连接到主机的,但是没有写操作,这个时候,主机如果回来了,从机依旧可 以直接获取到主机写的信息!

如果是使用命令行,来配置的主从,这个时候如果重启了,就会变回主机!只要变为从机,立马就会从主机中获取值!

复制原理

Slave启动成功连接到master后会发送一个sync同步命令,Master接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,并完成一次完全同步。

全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。

增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步

但是只要是重新连接master,一次完全同步(全量复制)将被自动执行

哨兵模式(Sentinel)

Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:

  • 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
  • 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
  • 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
  • 配置提供者(Configuration provider)。哨兵充当客户端服务发现的权威来源:客户端连接到哨兵,以询问负责给定服务的当前Redis主服务器的地址。如果发生故障转移,哨兵将报告新地址。
配置哨兵

Redis源码发行版包含一个名为sentinel的文件。这是一个自文档化的配置文件,你可以用它来配置Sentinel,但是一个典型的最小配置文件看起来像这样:

sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1

sentinel monitor resque 192.168.1.3 6380 4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5

需要指定要监视的主服务器,给每个独立的主服务器(可能有任意数量的副本)一个不同的名称。不需要指定自动发现的副本。Sentinel会自动使用关于副本的附加信息更新配置(以便在重新启动时保留这些信息)。在故障转移期间,每次将副本提升为主服务器时以及每次发现新的哨兵时,都要重写配置。

示例配置主要监视两组Redis实例,每个实例由一个主实例和一个未定义数量的副本组成。一组实例称为mymaster,另一组称为resque。哨点监视语句的参数含义如下:

sentinel monitor master-group-name ip port quorum

第一行是告诉redis sentinel监视名为mymaster,ip为127.0.0.1,端口为6379的主机,quorum为裁决人数。

quorum是需要就主服务器不可访问这一事实达成一致的哨兵的数量,以便真正将主服务器标记为失败,并在可能的情况下最终启动故障转移过程。

然而,仲裁仅用于检测故障。为了实际执行故障转移,需要将其中一个哨兵选为故障转移的领导者,并授权其继续执行。这只发生在大多数哨兵过程的投票。

其他选项都是这样的形式:sentinel option_name master_name option_value

down-after-milliseconds是指以毫秒为单位,一个实例不应该被到达(没有响应我们的ping或者响应了一个错误),因为一个哨兵开始认为它已经关闭了。

parallel-syncs设置可以在故障转移后同时重新配置以使用新主服务器的副本数量。数量越少,完成故障转移过程所需的时间就越多,但是,如果将副本配置为服务旧数据,您可能不希望所有副本同时与主服务器重新同步。虽然复制过程对副本基本上是非阻塞的,但在某个时刻,它会停止从主服务器加载大容量数据。您可能希望通过将此选项设置为1来确保一次只能访问一个副本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值