为什么要做Redis集群?
    1.高可用。避免出现单点故障的问题
    2.处理高并发读写,提高redis处理的效率
    3.处理大量数据

    Redis的集群可以分为三种
    1.主从同步
    主从同步可以用来实现读写分离的功能。即一个节点发生了写操作,像其他节点进行同步,前者是主节点,后者是从节点。
    其好处是在于
    1.数据存在多个节点中,方便备份
    2.且读写分离,有利于提高读的效率

    缺点则是
    1.不能分担写的压力
    2.主从之间不能自动切换,需要我们手动操作
    3.存储得不到扩容,数据总量就是主节点的容量

    2.哨兵
    哨兵是建立在主从同步之上而来的。
    哨兵就是单独的进程,用来监控所有主节点和从节点,当主节点放生异常时,可以选举一个从节点将其升级为主节点,保证了服务的高可用。
    一般我们在使用中会用多个哨兵进行监控,当其中某个哨兵给主节点发送ping命令失败,会将其设置为主观下线,并告知其他的哨兵,其他的哨兵也去发起ping命令,如果超过半数的哨兵都确认处理主观下线状态,这个时候就会把主节点置为客观下线。并推举出一个领头哨兵,由领头哨兵选出一个从节点并将其升级为主节点,并且也是由领头哨兵对故障的节点进行故障恢复。

    哨兵的优点:
    1.由于是基于主从,主从的优点都由
    2.可以自动进行主从的切换,提高了效率,保证了高可用。
    缺点:
    只是解决了主从自动切换的问题,同样拥有主从模式的另外两个缺点。

    3.Cluster
    主从和哨兵的问题在于,主节点和从节点存放的都是同样的数据,比较浪费内存,为了解决这个问题,cluster的每个主节点存放的都是不同的数据,并且之间相互关联,访问某个主节点就能拿到所有节点中的数据。
    cluster采用的是16384个哈希槽存储,每一个主节点负责一段哈希槽,在存放数据的时候redis会用key进行CRC16计算得到散列值,再与16384进行取模,来确定放置在哪一个主节点中。
    为了保证服务的高可用,cluster同样集成了主从和哨兵的功能
    主节点可以拥有多个从节点,主节点做数据存取,从节点做数据备份。
    主节点与主节点之间,像哨兵一样,也会相互发送ping命令,如果半数的主节点均认为某个节点属于下线,那么就会将其对应的子节点升级为主节点。

    为什么是16384个哈希槽?
    事实上,CRC16算法最大可以产生 65535 个哈希槽,之所以用16384个是因为redis节点每秒会发送心跳包,将槽放在心跳包中,让其他节点知道集群信息。16384个哈希槽大小16k,用bitmap压缩后就是2k,而如果是65535的话大小就是65k,压缩后也有8k。在我们主节点不超过1000的情况下,使用16384个完全够用,65535就太大了,浪费带宽。