Redis入门很简单之七【使用Jedis实现客户端Sharding】
<一>. 背景介绍:
1. sharding机制:即通常所说的“分片”,允许数据存放在不同的物理机器上, 以适应数据量过大的场景,克服单台机器内存或者磁盘空间的限制。而这种“离散式”地存放,对客户端来说是透明的,对客户端来讲,完全看不到这种差别。
2. 常见的内存缓存中间件,比如Memcached支持服务器端Sharding,客户端根本无须关心具体的实现细节。而Redis并不支持服务器端分片,不过我们可以使用Jedis提供的API来实现客户端的分片,通过“一致性hash”算法,使得数据离散地存放在不同的服务器上面。
3. 对客户端来说,这是透明的,数据具体存在在那一台机器上面,对客户端来讲是无差别的。然后,通过不同机器上面的Redis控制台,我们还是可以看出数据的存储情况。
4. 优缺点:使用Sharding机制,克服了单台服务器的“内存限制”,但是不可避免的降低了数据的存储和访问效率。
<二>. 进行配置:
1. 增加节点:去掉之前的主从配置,作为用作Sharding的一台服务器,增加属性设置
- redis.host2=192.168.142.34
2. 连接池配置:使用shardedJedisPool
- <bean id = "shardedJedisPool" class = "redis.clients.jedis.ShardedJedisPool">
- <constructor-arg index="0" ref="jedisPoolConfig"/>
- <constructor-arg index="1">
- <list>
- <bean class="redis.clients.jedis.JedisShardInfo">
- <constructor-arg index="0" value="${redis.host}"/>
- <constructor-arg index="1" value="${redis.port}" type="int"/>
- <constructor-arg index="2" value="${redis.timeout}" type="int"/>
- <property name="password" value="${redis.password}"/>
- </bean>
- <bean class="redis.clients.jedis.JedisShardInfo">
- <constructor-arg index="0" value="${redis.host2}"/>
- <constructor-arg index="1" value="${redis.port}" type="int"/>
- <constructor-arg index="2" value="${redis.timeout}" type="int"/>
- <property name="password" value="${redis.password}"/>
- </bean>
- </list>
- </constructor-arg>
- </bean>
<三>. 使用API编程:
1. 获取shardedJedis:
- ShardedJedisPool shardedPool = (ShardedJedisPool)context.getBean("shardedJedisPool");
- ShardedJedis shardedJedis = shardedPool.getResource();
- ...
- shardedPool.returnResource(shardedJedis);
2. 存储/访问/删除数据:
- shardedJedis.set("president", "Obama");
- String president = shardedJedis.get("president");
- shardedJedis.del("president");
顶
踩

参考知识库

- Redis知识库4924 关注 | 738 收录
评论
文中的连接池配置是通过 <constructor-arg index="1">
<list>
<bean class="redis.clients.jedis.JedisShardInfo">
<constructor-arg index="0" value="${redis.host}"/>
<constructor-arg index="1" value="${redis.port}" type="int"/>
<constructor-arg index="2" value="${redis.timeout}" type="int"/>
<property name="password" value="${redis.password}"/>
</bean>
<bean class="redis.clients.jedis.JedisShardInfo">
<constructor-arg index="0" value="${redis.host2}"/>
<constructor-arg index="1" value="${redis.port}" type="int"/>
<constructor-arg index="2" value="${redis.timeout}" type="int"/>
<property name="password" value="${redis.password}"/>
</bean>
</list>
</constructor-arg>
实现,那么在下面获取shardedJedis,执行数据缓存时,是怎么判断获取的是上面配置的哪个主机的资源或者将数据缓存到哪个主机的呢?
可以看一下 Java Memcached 实现源码
可以看一下 Java Memcached 实现源码
Redis入门很简单之七【使用Jedis实现客户端Sharding】的更多相关文章
- Redis入门很简单之六【Jedis常见操作】
Redis入门很简单之六[Jedis常见操作] http://www.tuicool.com/articles/vaqABb http://www.cnblogs.com/stephen-liu74/ ...
- Redis入门很简单之五【Jedis和Spring的整合】
Redis入门很简单之五[Jedis和Spring的整合] 博客分类: NoSQL/Redis/MongoDB redisnosql缓存jedisspring 在上一篇文章中,简单介绍了Jedis的 ...
- Redis入门很简单之四【初识Jedis】
Redis入门很简单之四[初识Jedis] 博客分类: NoSQL/Redis/MongoDB redisnosql缓存jedis 使用Jedis提供的Java API对Redis进行操作,是Red ...
- Redis入门很简单之一【简介与环境搭建】
Redis入门很简单之一[简介与环境搭建] 博客分类: NoSQL/Redis/MongoDB redisnosqlmemcached缓存中间件 [Redis简介] <一>. NoSQL ...
- Redis入门很简单之三【常见参数配置】
Redis入门很简单之三[常见参数配置] 博客分类: NoSQL/Redis/MongoDB redisnosql缓存中间件memcached Redis的一下常见设置都是通过对redis.conf ...
- Redis入门很简单之二【常见操作命令】
Redis入门很简单之二[常见操作命令] 博客分类: NoSQL/Redis/MongoDB redisnosql缓存 Redis提供了丰富的命令,允许我们连接客户端对其进行直接操作.这里简单介绍一 ...
- 踢爆IT劣书出版黑幕——由清华大学出版社之《C语言入门很简单》想到的(1)
1.前言与作者 首先声明,我是由于非常偶然的机会获得<C语言入门很简单>这本书的,绝对不是买的.买这种书实在丢不起那人. 去年这书刚出版时,在CU论坛举行试读推广,我当时随口说了几句(没说 ...
- [电子书] 《Android编程入门很简单》
<Android编程入门很简单>是一本与众不同的Android学习读物,是一本化繁为简,把抽象问题具体化,把复杂问题简单化的书.本书避免出现云山雾罩.晦涩难懂的讲解,代之以轻松活泼.由浅入 ...
- 《Mysql 入门很简单》(读后感①)
下载完整版<Mysql 入门很简单>,点击这里~: http://files.cnblogs.com/files/zhengyeye/MySQL%E5%85%A5%E9%97%A8%E5% ...
随机推荐
- CodeForce-1196D2-RGB Substring (hard version)
原题链接 题目大意与上题完全一样,只是数据规模更大. 思路: 再用上题的暴力肯定TLE,所以需要优化一下搜索过程.上一题我们是外层遍历n,内层遍历3种情况.这题我们外层遍历3种情况,内层遍历数组,记录 ...
- Hadoop(2): Blocks存储管理及读写
1. Replication: 因为每个HDFS被部署在是低成本的商业硬件上(low cost commodity hardware),所以为了有更佳的Fault Tolerance,HDFS将每个B ...
- iframe父页面和子页面高度自适应
父页HTML: <iframe id="mainframe" name="mainframe" style="width:100%;&quo ...
- JS formData
有时候,我们需要使用formData来上传文件,并根据反馈的结果做不同的处理, 这个时候使用form来提交文件不方便 #perform 获取的的上传文件所用的input标签 var formData ...
- java_第一年_JavaWeb(2)
HTTP协议 HTTP协议——超文本传输协议,用于定义web浏览器和web服务器之间数据交换的过程,遵守一定的通讯的格式: HTTP请求——包括请求行和多个信息头 请求行:包含请求方式(常用的GET. ...
- Pandas的拼接操作
pandas的拼接操作 pandas的拼接分为两种: 级联:pd.concat, pd.append 合并:pd.merge, pd.join import pandas as pd import n ...
- 针对三星Exynos CPU Root漏洞
因为系统为了保护这些符号地址泄露,而用的一种保护手段,从而使除root用户外的普通用户不能直接查看符号地址: 原因在于内核文件kallsyms.c中的显示符号地址命令中做了如下限制: seq_prin ...
- jquery动态加载select选项
$("#selectid").get(0).options.add(new Option(json数据))
- C#设计模式:桥接模式(Bridge Pattern)
一,桥接模式,直接上代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...
- NGUI的slider的滑动条制作(SliderScript)
一,添加一个sprite,给这个sprite添加一个背景如下图: 二,在当前的sprite添加一个子sprite同时给子层添加一个颜色较深的图片,这个子层覆盖当前sprite,我们需要调节子层的dep ...