Redis定义:
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis的三个特点:
1、Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
2、Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
3、Redis支持数据的备份,即master-slave模式的数据备份。
Redis的优点
1、操作内存,读写速度快,读的速度能够达到110000次/s,写的速度能够达到81000次/s
2、所有的单操作都是原子性,如果是多个操作的话,和mysql一样支持事务
3、数据类型更加丰富,相比于传统的kv数据库memache,redis的数据类型更加丰富支持string,sort,hash等
4、可持久化,支持数据的恢复与备份。
Redis为什么这么快?
redis的读写速度之所以这么快,除了本身是内存操作以外,还有以下几个原因:
1、采用单线程,单线程的好处是,避免了一些上下文的切换和竞争,也不会有多进程直接相互切换和消耗CPU,既然是单进程,也就不用有线程锁。
2、使用多路I/O复用模型,非阻塞IO。(select/poll/epoll)
3、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
I/O复用模型,非阻塞IO
多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。
这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。
采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈
Redis集群
1、主从模式
2、Sentinel模式
3、Cluster模式
主从模式是三种模式中最简单的,类似于mysql的主从,一个master对应多个slave,设置主从模式后,启动slave,会主动向master发送SYNC命令,然后master收到会做RBD持久化,然后发送给slave。
这种模式有一个缺点,slave挂了没事,不会影响master和其余的slave的,如果master挂了,那整个系统的redis的写入服务就挂了,只能读不能写。
哨兵模式,这个是目前最常用的集群模式。我们具体讲讲哨兵模式。
Redis 哨兵的主要功能
1、监控
哨兵会不断的检查主服务器和从服务器是否正常运行
2、通知
当被监控的某个redis服务出现问题,Sentinel通过API脚本向其他slave发送通知
3、自动故障转移
如果master挂了,这个时候哨兵会通过一定的规则(至于什么规则,下面会讲到),从生下的slave中选举新的master
工作流程
哨兵进程的工作方式
1、每个Sentinel(哨兵)进程以每秒钟一次的频率向整个集群中的Master主服务器,Slave从服务器以及其他Sentinel(哨兵)进程发送一个 PING 命令。
2、如果回复哨兵的时间,超过配置文件中的设定值,那这个实例就会被哨兵标记位主观下线(SDOWN),如果master被标记为主观下线以后,其余的监控此master的哨兵也会不断的发出请求去确认这个事情
3、如果有足够数量的哨兵都标记次master不可用,那么master就会被标记位客观下线(ODOWN)。这个时候哨兵会改变info命令的发送频率,从每10S一次改成每1S一次。
哨兵模式的选举策略
如果master挂了?这个时候要怎么从余下的节点中选出新的master?
一、下面五个是备选节点的条件。
1、slave节点状态处于S_DOWN,O_DOWN,DISCONNECTED的除外
2、最近一次ping应答时间不超过5倍ping的间隔(假如ping的间隔为1秒,则最近一次应答延迟不应超过5秒,redis sentinel默认为1秒)
3、info_refresh应答不超过3倍info_refresh的间隔(原理同2,redis sentinel默认为10秒)
4、slave节点与master节点失去联系的时间不能超过( (now - master->s_down_since_time) + (master->down_after_period * 10))。总体意思是说,slave节点与master同步太不及时的(比如新启动的节点),不应该参与被选举。
5、Slave priority(优先级)不等于0(这个是在配置文件中指定,默认配置为100)
二、从备选node中,按照如下顺序选择新的master
1、较低的slave_priority(这个是在配置文件中指定,默认配置为100,优先级数字越小优先级越高)
2、较大的replication offset(每个slave在与master同步后offset自动增加)
3、较小的runid(每个redis实例,都会有一个runid,通常是一个40位的随机字符串,在redis启动时设置,重复概率非常小)
4、如果以上条件都不足以区别出唯一的节点,则会看哪个slave节点处理之前master发送的command多,就选谁。










网友评论