redis cluster的批量操作

之前项目中都在使用redis的单机或者主从,后来迁移到集群的时候,出现了一系列问题,下面整理一下redis集群方面的知识。

Redis集群介绍

redis cluster是去中心化的,每个节点都是master,将数据按key哈希到16384个slot上,每个redis node负责一部分的slot

按照CAP理论来说,**单机版的Redis属于保证CP(Consistency & Partition-Tolerancy)而牺牲A(Availability)**,也就说Redis能够保证所有用户看到相同的数据(一致性,因为Redis不自动冗余数据)和网络通信出问题时,暂时隔离开的子系统能继续运行(分区容忍性,因为Master之间没有直接关系,不需要通信),但是不保证某些结点故障时,所有请求都能被响应(可用性,某个Master结点挂了的话,那么它上面分片的数据就无法访问了)。

有了Cluster功能后,Redis从一个单纯的NoSQL内存数据库变成了分布式NoSQL数据库,CAP模型也从CP变成了AP。也就是说,通过自动分片和冗余数据,Redis具有了真正的分布式能力,某个结点挂了的话,因为数据在其他结点上有备份,所以其他结点顶上来就可以继续提供服务,保证了可用性(Availability)。然而,也正因为这一点,Redis无法保证曾经的强一致性了。这也是CAP理论要求的,三者只能取其二。

Redis集群的功能限制

Redis集群相对单机在功能上存在一些限制,需要开发人员提前了解,在使用时做好规避。

  • key批量操作支持有限。
    类似 mset、mget 操作,目前只支持对具有相同 slot 值的 key 执行 批量操作。对于映射为不同 slot 值的 key 由于执行 mget、mget 等操作可能存在于多个节点上,因此不被支持。

  • key事务操作支持有限。
    只支持多key在同一节点上的事务操作,当多个key分布在不同的节点上时无法使用事务功能。

  • key 作为数据分区的最小粒度
    不能将一个大的键值对象如 hash、list 等映射到不同的节点

  • 不支持多数据库空间
    单机下的Redis可以支持16个数据库(db0~db15),集群模式下只能使用一个数据库空间,即db0。

  • 复制结构只支持一层
    从节点只能复制主节点,不支持嵌套树状复制结构。

参考链接