在Redis官方的分布式方案出来之前,有twemproxy和codis两种方案,这两个方案总体上来说都是依赖proxy来进行分布式的,也就是说redis本身并不关心分布式的事情,而是交由twemproxy和codis来负责 。而redis官方给出的cluster方案则是把分布式的这部分事情做到了每一个redis服务器中,使其不再需要其他的组件就可以独立的完成分布式的要求 。
我们这里不关心这些方案的优略,我们关注一下这里的分布式到底是要处理那些事情?也就是twemproxy和codis独立处理的处理分布式的这部分逻辑和cluster集成到redis服务的这部分逻辑到底在解决什么问题?
如我们前面所说的,一个分布式的服务在外界看来就像是一个集中式的服务一样 。那么要做到这一点就面临着有一个问题需要解决:既是增加或减少分布式服务中的服务器的数量,对消费这个服务的客户端而言应该是无感的;那么也就意味着客户端不能穿透分布式服务,把自己绑死到某一个台的服务器上去,因为一旦如此,你就再也无法新增服务器,也无法进行故障替换 。
解决这个问题有两个路子:
第一个路子最直接,那就是我加一个中间层来隔离这种具体的依赖,即twemproxy采用的方式,让所有的客户端只能通过它来消费redsi服务,通过它来隔离这种依赖(但是你会发现twermproxy会成为一个单点),这种情况下每台redis服务器都是独立的,它们之间彼此不知对方的存在;
第二个路子是让redis服务器知道彼此的存在,通过重定向的机制来引导客户端来完成自己所需要的操作,比如客户端链接到了某一个redis服务器,说我要执行这个操作,redis服务器发现自己无法完成这个操作,那么就把能完成这个操作的服务器的信息给到客户端,让客户端去请求另外的一个服务器,这时候你就会发现每一个redis服务器都需要保持一份完整的分布式服务器信息的一份资料,不然它怎么知道让客户端去找其他的哪个服务器来执行客户端想要的操作呢 。
上面这一大段解释了这么多,不知有没有发现不管是第一个路子还是第二个路子,都有一个共同的东西存在,那就是分布式服务中所有服务器以及其能提供的服务的信息 。这些信息无论如何也是要存在的,区别在于第一个路子是把这部分信息单独来管理,用这些信息来协调后端的多个独立的redis服务器;第二个路子则是让每一个redis服务器都持有这份信息,彼此知道对方的存在,来达成和第一个路子一样的目的,优点是不再需要一个额外的组件来处理这部分事情 。
Redis Cluster的具体实现细节则是采用了Hash槽的概念,即预先分配出来16384个槽:在客户端通过对Key进行CRC16(key)% 16384运算得到对应的槽是哪一个;在redis服务端则是每个服务器负责一部分槽,当有新的服务器加入或者移除的时候,再来迁移这些槽以及其对应的数据,同时每个服务器都持有完整的槽和其对应的服务器的信息,这就使得服务器端可以进行对客户端的请求进行重定向处理 。在JAVA技术栈微信公众号后台回复关键字:Redis,可以获取更多栈长整理的 Redis 技术干货 。
4 客户端的Redis
上面的第三小节主要介绍的是Redis服务端的演进步骤,解释了Redis如何从一个单机的服务,进化为一个高可用的、去中心化的、分布式的存储系统 。这一小节则是关注下客户端可以消费的redis服务 。
4.1 数据类型
redis支持丰富的数据类型,从最基础的string到复杂的常用到的数据结构都有支持:
string:最基本的数据类型,二进制安全的字符串,最大512M 。
list:按照添加顺序保持顺序的字符串列表 。
set:无序的字符串集合,不存在重复的元素 。
sorted set:已排序的字符串集合 。
hash:key-value对的一种集合 。
bitmap:更细化的一种操作,以bit为单位 。
hyperloglog:基于概率的数据结构 。
这些众多的数据类型,主要是为了支持各种场景的需要,当然每种类型都有不同的时间复杂度 。其实这些复杂的数据结构相当于之前我在《解读REST》这个系列博客基于网络应用的架构风格中介绍到的远程数据访问(Remote Data Access = RDA)的具体实现,即通过在服务器上执行一组标准的操作命令,在服务端之间得到想要的缩小后的结果集,从而简化客户端的使用,也可以提高网络性能 。比如 如果没有list这种数据结构,你就只能把list存成一个string,客户端拿到完整的list,操作后再完整的提交给redis,会产生很大的浪费 。
4.2 事务
推荐阅读
- 华为|华为自研语言“仓颉”火上热搜 成员辟谣:不是中文编程
- 舍得酒这么样 舍得酒特点介绍
- 吃陈皮上火吗?陈皮的营养价值有哪些?
- 吃咸鸭蛋上火吗?咸鸭蛋的营养价值有哪些?
- 吃黑豆上火吗?黑豆的营养价值有哪些?
- 吃蘑菇上火吗?蘑菇的营养价值有哪些?
- 吃花生上火吗?花生的营养价值有哪些?
- 吃薄荷上火吗?薄荷的营养价值有哪些?
- 吃核桃上火吗?核桃的营养价值有哪些?
- 吃大白菜上火吗?大白菜的营养价值有哪些?