Redis是一个基于内存的数据库,其不只读写速度快,每秒能够执行大约110000的写操做,81000的读取操做,并且其支持存储字符串,哈希结构,链表,集合丰富的数据类型。因此获得不少开发者的青睐。加之其支持主从、持久化等功能,3.0版本开始正式提供分片技术、让其在大型互联网应用中大显身手
分片(parttitioning)就是将你的数据拆分到多个redis实例的过程,这样每一个实例只包含全部键的子集,
分片的目的:
一、容许使用不少电脑内存综合来支持更大的数据库,没有分片你就被局限于单机能支持的内存容量
二、容许伸缩计算到多核和多服务器,伸缩网络带宽到多服务器或者多网络适配器
拓展
(
Redis采用的是基于内存的采用的是单进程单线程模型的KV数据库,由C语言编写。官方提供的数据是能够达到100000+的qps。这个数据不比采用单进程多线程的一样基于内存的KV数据库Memcached差。
Redis快的主要缘由是:
- 彻底基于内存
- 数据结构简单,对数据操做也简单
- 使用多路 I/O 复用模型
单进程单线程好处
- 代码更清晰,处理逻辑更简单
- 不用去考虑各类锁的问题,不存在加锁释放锁操做,没有由于可能出现死锁而致使的性能消耗
- 不存在多进程或者多线程致使的切换而消耗CPU
单进程单线程弊端
- 没法发挥多核CPU性能,不过能够经过在单机开多个Redis实例来完善;
)
分片的基础
一、范围分片
二、哈希分片
分片的不一样实现
一、客户端分片:客户端直接选择正确的节点来写入和读取指定键,许多Redis客户端实现了客户端的分析
二、代理协助分片:客户端发送一个请求到一个能够理解Redis协议的代理上,而不是直接发送请求到
Redis实例上,代理会根据配置好的分片模式,来保证转发咱们的请求到正确的Redis实例,并返回给客户端,Redis和Memcached的代理Twemproxy实现了代理协助分片
三、查询路由分片:你能够发送你的查询到一个随机实例,这个实例会保证转发你的查询到正确的节点,Redis集群在客户端的帮助下,实现了查询路由的一种混合形式(请求不是直接从Redis实例转发到另外一个,而是客户端收到重定向到正确的节点)。
四、在服务端进行分片即Redis官方集群分片方案 Redis Cluster
理论讲完,就来点干活java
最近公司打算作redis集群分片,研究了下redis 自带的clutesr 功能真的很强大,惟一的不足之处就是当其中一个分片服务器挂掉的话整个集群就会宕机,处于系统不可用状态git
官网分片方案,很不错可是要保证数据备份,作redis 灾备方案,会比较麻烦,并且须要不少台服务器,redis搭建cluster分片服务起须要针对每台分片搭建主从配置方案,实现自动切换从而解决相关问题,相关主从的配置还有须要搭建redis sentinel哨兵服务,致使整个集群变得愈来愈复杂维护成本愈来愈高,因此为了解决这个问题,就打算经过客户端分片的方式实现该功能,减小运维压力redis
一致性哈希算法实现redis的数据分片横向扩展算法
翻阅资料发现java 有现成的jredis客户端分片方案,C#比较悲哀只能本身实现,其实jedis实现实现分片方式是经过一致性哈希算法实现的集群分片,装模作样照搬实现方式,备份经过两次哈希键值达到备份的目的数据库
那么什么是一致性哈希算法呢?网上有不少资料,我讲讲本身的简单理解服务器
redis 是键值对数据存储的一种数据库,咱们在存出数据的时候要将数据均匀的分布在多个服务器上面,而且在增长减小cache server后,cache的迁移作到最少。网络
那么一致性hash算法就是为了实现这个功能设计的数据结构
具体算法代码参见
https://git.oschina.net/hl.wei/RedisCluster.git
一致性哈希算法能够实现数据散列到均衡的服务器,可以最大限度的达到增减服务器的时候数据散列问题影响至最小。多线程
实际应用中减小服务器添加,删除,形成的数据丢失问题,可使用以下方案:
假如咱们有 A,B,C 三台服务器,咱们在三台服务器上面天天搭建三个redis 实例,等于建立了 有9台redis 实例,当咱们添加新机器的时候就能够直接映射一台服务器到 其中一个实例,对该服务器数据进行迁移达到数据零偏差完美迁移的目的。运维