Redis中的Sharding分片机制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis中的Sharding分片机制相关的知识,希望对你有一定的参考价值。
参考技术A 前面我们有学习到AKF原理,我们可以通过主从复制来解决单点故障问题,那我们这个要学习的是怎么解决【容量不足的问题】。常见的方式,将数据进行分类,或者按照业务逻辑功能去分类,把数据存入到redis缓存当中
采用Sharding分片机制解决
hash+取模
很多情况下数据没发划分清晰,那么我们可以采用Sharding分片的方式将数据存入redis当中。
如图,利用hash+取模的方式进行计算,将数据存入对应映射的redis中
不过这种方式有弊端,取模的数必须固定%3、%4、%10等,会影响分布式下的可拓展性。
随机push
利用一致性哈希算法,不用取模,每个key、node节点都需要参与hash计算。并将0—2^32个位置规划成环状——哈希环。
一致性哈希算法:
了解一致性哈希
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");
1
顶
顶
0
踩
踩
评论
5 楼 di1984HIT 2017-02-02
jedis应该是自己判断了~
4 楼 wxx302 2016-02-15
你好,有个疑问想请教下。
文中的连接池配置是通过 <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,执行数据缓存时,是怎么判断获取的是上面配置的哪个主机的资源或者将数据缓存到哪个主机的呢?
文中的连接池配置是通过 <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,执行数据缓存时,是怎么判断获取的是上面配置的哪个主机的资源或者将数据缓存到哪个主机的呢?
3 楼 长滩岛上的辣炒年糕 2015-12-11
太赞了,感觉jedis可以做好多东西啊
2 楼 bert82503 2014-08-13
Memcached服务端不支持Sharding,是客户端做的“一致性hash”分片算法。见《memcached全面剖析--4. memcached的分布式算法》http://blog.charlee.li/memcached-004/
可以看一下 Java Memcached 实现源码
可以看一下 Java Memcached 实现源码
1 楼 bert82503 2014-08-13
Memcached服务端不支持Sharding,是客户端做的“一致性hash”分片算法。见[url]《memcached全面剖析--4. memcached的分布式算法》http://blog.charlee.li/memcached-004/[/url]
可以看一下 Java Memcached 实现源码
可以看一下 Java Memcached 实现源码
以上是关于Redis中的Sharding分片机制的主要内容,如果未能解决你的问题,请参考以下文章
参考知识库