作家
登录

同为分布式缓存,为何Redis更胜一筹?

作者: 来源: 2018-03-26 15:24:22 阅读 我要评论

Redis官方推出了一个集群治理对象,叫作尖兵(Sentinel),负责在节点中选出主节点,按照分布式集群的治理办法来操作集群节点的上线、下线、监控、提示、主动故障切换(主备切换),且实现了有名的RAFT选主协定,大年夜而包管了体系选主的一致性。

一个常见的JSON数据的Java对象定义如下:

在海量请求的前提下,在Redis中每次更新一?字段,比如销量字段,都邑产生较大年夜的流量。在实际情况下,JSON字符串往往异常复杂,体积达到数百KB都是有可能的,导致在频繁更新数据时使收集I/O跑满,甚至导致体系超时、崩溃。

  1. public class Commodity {  
  2. private long price;  
  3. private String title;  
  4. ……  

是以,Redis官方推荐采取哈希来保存对象,比如有3个商品对象,ID分别是123、124和12345,我们经由过程哈希把它们保存在Redis中,在更新个中的字段时可以如许做:

  1. HSET commodity:123 price 100  
  2. HSET commodity:124 price 101  
  3. HSET commodity:12345 price 101  
  4.  
  5. HSET commodity:123 title banana  
  6. HSET commodity:124 title apple  
  7. HSET commodity:12345 title orange 

也就是说,用商品的类型名和ID构成一个Redis哈希对象的KEY。在获取某一属性时只需如许做就可以获取零丁的属性:HGET commodity: 12345。

2.Redis的高可用筹划:尖兵

这里给出一个尖兵的通用安排筹划。尖兵节点一般至少要安排3份,可以和被监控的节点放在一个虚拟机中,常见的尖兵安排如图所示。

在这个体系中,初始状况下的机械A是主节点,机械B和机械C是大年夜节点。

因为有3个尖兵节点,每个机械运行1个尖兵节点,所以这里设置quorum = 2,也就是在主节点无响应后,有至少两个尖兵无法与主节点通信,则认为主节点宕机,然后在大年夜节点中选举新的主节点来应用。

在产生收集分区时,若机械A地点的主机收集弗采取,则机械B和机械C上的两个Sentinel实例会启动failover并把机械B选举为主节点。

Sentinel集群的特点包管了机械B和机械C上的两个Sentinel实例获得了关于主节点的最新设备。但机械A上的Sentinel节点依然持有旧的设备,因为它与外界隔离了。

在收集恢复后,我们知道机械A上的Sentinel实例将会更新它的设备。然则,如不雅客户端所连接的主机节点也被收集隔离,则客户端将依然可以向机械A的Redis节点写数据,但在收集恢复后,机械A的Redis节点就会变成一个大年夜节点,那么在收集隔离时代,客户端向机械A的Redis节点写入的数据将会损掉,这是弗成避免的。

如不雅把Redis算作缓存来应用,那么我们也许能容忍这部分数据的损掉,但若把Redis算作一个存储体系来应用,就无法容忍这部分数据的损掉了,因为Redis采取的是异步复制,在如许的场景下无法避免数据的损掉。

在这里,我们可以经由过程以下设备来设备每个Redis实例,使得数据不会损掉:

  1. min-slaves-to-write 1  
  2. min-slaves-max-lag 10 

我们知道,壅塞I/O不须要额外的线程,非浊宣I/O会开启额外的请求线程(在Boss线程池里)监听端口,一个请求在处理后就释下班作者线程(在Worker线程池中),请求线程在监听到有返回结不雅时,一旦有I/O返回结不雅就被唤醒,然后开端处理响应数据并写回收集Socket连接,所以大年夜理论上来讲,非浊宣I/O的吞吐量和响应才能会更高。

Redis为了樊篱不合平台之间的差别及统计内存占用量等,对内存分派函数进行了一层封装,在法度榜样中同一应用zmalloc、zfree系列函数,这些函数位于zmalloc.h/zmalloc.c文件中。封装就是为了樊篱底层平台的差别,同时便利本身实现相干的统计函数。具体的实现方法如下:

  • 若体系中存在Google的TC_MALLOC库,则应用tc_malloc一族的函数代替本来的malloc一族的函数。
  • 若当前体系是Mac体系,则应用体系的内存分派函数。
  • 对于其它情况,在每一段分派好的空间前面同时多分派一个定长的字段,用来记录分派的空间大年夜小,经由过程这种方法来实现简荡竽暌剐效的内存分派。

经由过程膳绫擎的设备,当一个Redis是主节点时,如不雅它不克不及向至少一个大年夜节点写数据(膳绫擎的min-slaves-to-write指定了slave的数量),则它将会拒绝接收客户端的写请求。因为复制是异步的,所以主节点无法向大年夜节点写数据就意味着大年夜节点要么断开了连接,要么没在指定的时光内向主节点发送同步数据的请求。

所以,采取如许的设备可清除收集分区后主节点被孤立但仍然写入数据,大年夜而导致数据损掉的场景。


  推荐阅读

  binlog2sql实现MySQL误操作的恢复

沙龙晃荡 | 3月31日 京东、微博、华为拭魅战专家与你合营商量容器技巧实践! 对于MySQL数据库中的误操作删除数据的恢复问题,可以应用基于MySQL中binlog做到类似于闪回或者生成反向操作的S>>>详细阅读


本文标题:同为分布式缓存,为何Redis更胜一筹?

地址:http://www.17bianji.com/lsqh/40888.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)