redis预分片技术及实现

通常情况下,我们会建立多个redis实例来缓解单个redis实例的压力。但是,随着缓存数量的增加,对redis进行扩容是一件非做不可的事情。对redis进行扩容可以有多种办法,比如增加每个redis实例的最大内存。这只是解决办法之一,而且缺乏灵活性和可扩展性。在redis官网上,提到了预分片技术。本文将对预分片技术进行讲解,同时讲解jedis对分片是如何支持的。

一、redis预分片技术

在单个server上搭建多个redis实例。当需要扩展时,可以利用复制机制进行扩展,可参照如下步骤:

1)在新的服务器上创建空的redis实例。

2)配置新的redis实例作为源实例的从实例,将源数据导到新实例上。

3)停止客户端(如jedis)。

4)将客户端配置的实例ip更新为新的服务器地址。注意此处是替换老的ip地址,不能进行追加或调换各地址的顺序。

5)在新服务器上发送SLAVEOF NO ONE命令,使其不再作为从实例。

6)用新的配置重启客户端。

7)最后停止老服务器上不再使用的旧实例。

在这里提出个问题,将老的ip地址替换后,之前映射到旧的redis实例上关键字是否能映射到对应的新redis实例上?本文后面将会进行分析。

二、jedis对分片技术的实现

jedis支持分片技术,上图为涉及到的几个主要类,主要分成两部分:

1)记录各个redis实例的地址信息。从类图中可以看出,ShardInfo和JedisShardInfo实现了此功能;

2)使用一致性hash算法,对关键字及redis实例进行映射。从类图可以看出Sharded提供了此功能的一个基类,BinaryShardedJedis和ShardedJedis分别是字节和字符串的实现。

在Sharded类创建时,会执行一个初始化方法。通过hash算法,对每个redis实例得出160个hash值,并将该值作为TreeMap的key,将Redis实例的ShardInfo信息作为value。注意:在计算hash值时,并不是使用的ip地址,而是用的一个别名。该别名要么是在ShardInfo中设置,要么就是以一定规则生成。具体可看下面的代码:

    private void initialize(List<S> shards) {
	nodes = new TreeMap<Long, S>();

	for (int i = 0; i != shards.size(); ++i) {
	    final S shardInfo = shards.get(i);
	    if (shardInfo.getName() == null)
		for (int n = 0; n < 160 * shardInfo.getWeight(); n++) {
		    nodes.put(this.algo.hash("SHARD-" + i + "-NODE-" + n),
			    shardInfo);
		}
	    else
		for (int n = 0; n < 160 * shardInfo.getWeight(); n++) {
		    nodes.put(
			    this.algo.hash(shardInfo.getName() + "*"
				    + shardInfo.getWeight() + n), shardInfo);
		}
	    resources.put(shardInfo, shardInfo.createResource());
	}
    }

不使用ip地址进行哈希,就可以避免在ip地址变更时,缓存里的数据无法访问。这里回答了之前提出的问题。

实际上,这里就是一致性哈希算法的实现。memcached使用的也是此算法。160个哈希值,实际上是单个实例在哈希环上的虚拟节点。如果不建立虚拟节点,在增肌或删除节点时,会对某个节点造成压力,如果建立虚拟节点,可以将压力分解到各个redis实例上。



时间: 2024-10-25 23:52:05

redis预分片技术及实现的相关文章

redis预切片技术,实现

平时,我们将创建多个redis实例,以缓解单redis压力范例.但,作为高速缓存的数量增加.对redis对于扩展是一种非 - 不要无所谓.对redis有几种方法用于扩张可能.让我们添加每个redis最大内存实例. 之中的一个,并且缺乏灵活性和可扩展性.在redis官网上,提到了预分片技术.本文将对预分片技术进行解说,同一时候解说jedis对分片是怎样支持的. 一.redis预分片技术 在单个server上搭建多个redis实例.当须要扩展时.能够利用复制机制进行扩展.可參照例如以下步骤: 1)在

redis分片技术

需求: 如果将全部数据都保存到一台redis中,那么如果该服务器损坏,则影响全部的服务: 使用单台redis内存设定一般不要超过1G,但是有些业务数据量很大,如果不修改内存,则数据无法存储: 方案: 采用redis分片技术: 优点: 1.使用redis分片可以实现内存数据的动态扩容: 2.使用分片,每台redis节点中尽可能保存1/n的数据量,防止数据的丢失: 3.对于用户而言,整个redis的分片就是一个服务:n台服务器作为一个整体的服务器共同为用户服务: 1. 分片搭建: 1.1复制配置文件

Redis集群技术及Codis实践

"高效运维最佳实践"是InfoQ在2015年推出的精品专栏,由触控科技运维总监萧田国撰写,InfoQ总编辑崔康策划. 前言 如开篇文章所言,高效运维包括管理的专业化和技术的专业化.前两篇我们主要在说些管理相关的内容,本篇说一下技术专业化.希望读者朋友们能适应这个转换,谢谢. 互联网早在几年前就已进入Web 2.0时代,对后台支撑能力的要求,提高了几十倍甚至几百倍.在这个演化过程中,缓存系统扮演了举足轻重的角色. 运维进化到今天,已经不是重复造轮子的时代.所以,我们在架构优化和自动化运维

理想化的 Redis 集群 - 技术翻译 - 开源中国社区

理想化的 Redis 集群 - 技术翻译 - 开源中国社区 zookeeper web界面查看工具node-zk-browser安装 | 日拱一卒

第六天 分片技术

在mongodb里面存在另一种集群,就是分片技术,跟mysql的表分区类似,我们知道当数据量达到T级别的时候,我们的磁盘,内存就吃不消了,针对这样的场景我们该如何应对. 一.分片 mongodb采用将集合进行拆分,然后将拆分的数据均摊到几个片上的一种解决方案. 下面我对这张图解释一下: 人脸:代表客户端,客户端肯定说,你数据库分片不分片跟我没关系,我叫你干啥就干啥,没什么好商量的. mongos:首先我们要了解“片键”的概念,也就是说拆分集合的依据是什么?按照什么键值进行拆分集合.... 好了,

dns-prefetch—DNS预解析技术

今天在看一个网站的源代码时 发现了 <link rel="dns-prefetch" href="//static.tuweia.cn/"> 对dns-prefetch有点儿好奇,因为不止一次地见到,今天终于忍不住要看看他到底是什么技术? 下面是在网上找到的一篇关于dns-prefetch的简述. DNS 实现域名到IP的映射.通过域名访问站点,每次请求都要做DNS解析.目前每次DNS解析,通常在200ms以下.针对DNS解析耗时问题,一些浏览器通过DN

8天学通MongoDB——第六天 分片技术

在mongodb里面存在另一种集群,就是分片技术,跟sql server的表分区类似,我们知道当数据量达到T级别的时候,我们的磁盘,内存 就吃不消了,针对这样的场景我们该如何应对. 一:分片 mongodb采用将集合进行拆分,然后将拆分的数据均摊到几个片上的一种解决方案. 下面我对这张图解释一下: 人脸:       代表客户端,客户端肯定说,你数据库分片不分片跟我没关系,我叫你干啥就干啥,没什么好商量的. mongos: 首先我们要了解”片键“的概念,也就是说拆分集合的依据是什么?按照什么键值

MySQL数据库分片技术调研

将这段时间了解的MySQL分片技术和主从复制只是整理清楚画了思维导图记录一下,希望能给需要的人一些帮助 P.S.:个人整理,可能会有错误之处,还望指出~ 要解决的问题 1.海量数据的操作超出单表.单库的最大限制 2.访问压力超出数据库系统限制,性能下降 3.数据库复制.容灾等问题 解决方案 一.采用数据分表分库提高数据库的性能限制 1.可选Sharding策略 2.Sharding实现的层面 可以为: (1)数据访问层(DAO) (2)ORM框架层 (3)JDBC API层 (4)应用服务器和数

Mongodb学习总结-6(分片技术)

在mongodb里面存在另一种集群,就是分片技术,跟sql server的表分区类似,我们知道当数据量达到T级别的时候,我们的磁盘,内存 就吃不消了,针对这样的场景我们该如何应对. 一:分片 mongodb采用将集合进行拆分,然后将拆分的数据均摊到几个片上的一种解决方案. 下面我对这张图解释一下: 人脸:       代表客户端,客户端肯定说,你数据库分片不分片跟我没关系,我叫你干啥就干啥,没什么好商量的. mongos: 首先我们要了解”片键“的概念,也就是说拆分集合的依据是什么?按照什么键值