Redis实际上就是个key-value的存储系统,和Memcached比较类似。它支持的数据类型相对较多,例如:string,list,set,zset(有序集合)和hash类型。并且这些数据类型都支持push/pop,add/remove等原子性操作。
与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis集群设计包括:
- 哈希slot
- 节点主从
一、节点主从
节点主从原理图:
1.除了每个master可以有多个slave,slave也可以有自己的slave,这点有利于redis的扩容。与zookeeper的选举机制大不相同。
2.读写分离。master负责写和同步数据,slave负责读取数据,可以减轻数据库压力。
3.slave将从master获取到的数据先压入磁盘,再写进内存。client直接从内存中读取信息,所以redis是内存数据库。
Master的写能力是redis存储能力的瓶颈
二、Hash
Object保存到Redis之前需要确定保存到哪个节点上。将CRC16(key)mod 16384的得到的数值所在的slot段,就对应哪个节点。
slot平均分配给nodes。一旦有节点加入或者退出,slot段进行迁移。例如node1挂掉了,它的slot段会被其他节点瓜分,其他节点原本的slot段还是保持不懂,这种机制有效降低迁移成本。
node之间也会互相监听。
三、主从+Hash
这样一来redis的集群不用手master容量的限制,可以随时扩容。而且,任何一个master或者slave挂掉,都不会发生灾难性故障,系统的稳定性增强了。