redis预切片技术,实现
2015-10-15 11:51
162 查看
平时,我们将创建多个redis实例,以缓解单redis压力范例。但,作为高速缓存的数量增加。对redis对于扩展是一种非 - 不要无所谓。对redis有几种方法用于扩张可能。让我们添加每个redis最大内存实例。
之中的一个,并且缺乏灵活性和可扩展性。在redis官网上,提到了预分片技术。本文将对预分片技术进行解说,同一时候解说jedis对分片是怎样支持的。
1)在新的server上创建空的redis实例。
2)配置新的redis实例作为源实例的从实例,将源数据导到新实例上。
3)停止client(如jedis)。
4)将client配置的实例ip更新为新的server地址。
注意此处是替换老的ip地址,不能进行追加或调换各地址的顺序。
5)在新server上发送SLAVEOF NO ONE命令。使其不再作为从实例。
6)用新的配置重新启动client。
7)最后停止老server上不再使用的旧实例。
在这里提出个问题,将老的ip地址替换后。之前映射到旧的redis实例上keyword能否映射到相应的新redis实例上?本文后面将会进行分析。
jedis支持分片技术。上图为涉及到的几个主要类。主要分成两部分:
1)记录各个redis实例的地址信息。从类图中能够看出,ShardInfo和JedisShardInfo实现了此功能;
2)使用一致性hash算法。对keyword及redis实例进行映射。从类图能够看出Sharded提供了此功能的一个基类,BinaryShardedJedis和ShardedJedis各自是字节和字符串的实现。
在Sharded类创建时,会运行一个初始化方法。通过hash算法,对每一个redis实例得出160个hash值,并将该值作为TreeMap的key,将Redis实例的ShardInfo信息作为value。注意:在计算hash值时。并非使用的ip地址,而是用的一个别名。
该别名要么是在ShardInfo中设置,要么就是以一定规则生成。详细可看以下的代码:
不使用ip地址进行哈希,就能够避免在ip地址变更时,缓存里的数据无法訪问。
这里回答了之前提出的问题。
实际上。这里就是一致性哈希算法的实现。memcached使用的也是此算法。160个哈希值。实际上是单个实例在哈希环上的虚拟节点。假设不建立虚拟节点,在增肌或删除节点时,会对某个节点造成压力,假设建立虚拟节点,能够将压力分解到各个redis实例上。
之中的一个,并且缺乏灵活性和可扩展性。在redis官网上,提到了预分片技术。本文将对预分片技术进行解说,同一时候解说jedis对分片是怎样支持的。
一、redis预分片技术
在单个server上搭建多个redis实例。当须要扩展时。能够利用复制机制进行扩展。可參照例如以下步骤:1)在新的server上创建空的redis实例。
2)配置新的redis实例作为源实例的从实例,将源数据导到新实例上。
3)停止client(如jedis)。
4)将client配置的实例ip更新为新的server地址。
注意此处是替换老的ip地址,不能进行追加或调换各地址的顺序。
5)在新server上发送SLAVEOF NO ONE命令。使其不再作为从实例。
6)用新的配置重新启动client。
7)最后停止老server上不再使用的旧实例。
在这里提出个问题,将老的ip地址替换后。之前映射到旧的redis实例上keyword能否映射到相应的新redis实例上?本文后面将会进行分析。
二、jedis对分片技术的实现
jedis支持分片技术。上图为涉及到的几个主要类。主要分成两部分:
1)记录各个redis实例的地址信息。从类图中能够看出,ShardInfo和JedisShardInfo实现了此功能;
2)使用一致性hash算法。对keyword及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实例上。
相关文章推荐
- C:\windows\softwaredistribution 文件过大如何处理
- redis 基本信息查询
- java redis学习备忘
- 实现Asp.net Mvc分布式Session Redis群集
- redis 3.0源码安装详细步骤说明
- Ehcache与redis
- 基于redis分布式缓存实现(新浪微博案例)
- redis使用的命令记录
- redis 代替 session 多服务器共享的方案梳理
- redis总结
- Redis群集实现Asp.net Mvc分布式Session
- Redis: Jedis中publish/subscribe 使用
- MATLAB 安装 问题 配置Microsoft Visual C++ 2008 Redistributable 的解决方法
- Redis服务器段和客户端 最详细的说明
- windows下安装redis(Redis服务端按照 非常简单)
- centos 6.5 安装redis 2.8.3 测试和应用
- Redis同步(主从复制)
- redis 批量删除
- mac 下安装 redis
- Java Spring 与 Redis 操作封装源码