redis cluster配置集群与使用Jedis的ShardedJedis做Redis集群的区别
jedis客户端操作redis主要三种模式:单台模式、分片模式(ShardedJedis)、集群模式(BinaryJedisCluster),分片模式是一种轻量级集群
在看ShardedJedis源码的时候,发现ShardedJedis并没有使用节点的Ip和port做hash,而是用的instance的顺序或者name,太赞了
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);}elsefor (int n = 0; n < 160 * shardInfo.getWeight(); n++) {nodes.put(this.algo.hash(shardInfo.getName() + "*"+ shardInfo.getWeight() + n), shardInfo);}resources.put(shardInfo, shardInfo.createResource());}}配置的时候也非常简单:
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="1000"/> <property name="maxIdle" value="10"/> <property name="minIdle" value="1"/> <property name="maxWaitMillis" value="30000"/> <property name="testOnBorrow" value="true"/> <property name="testOnReturn" value="true"/> <property name="testWhileIdle" value="true"/> </bean> <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool" destroy-method="destroy"> <constructor-arg ref="jedisPoolConfig"/> <constructor-arg> <list> <bean class="redis.clients.jedis.JedisShardInfo"> <constructor-arg value="127.0.0.1"/> <constructor-arg type="int" value="7000"/> <constructor-arg value="instance:01"/> </bean> <bean class="redis.clients.jedis.JedisShardInfo"> <constructor-arg value="127.0.0.1"/> <constructor-arg type="int" value="7001"/> <constructor-arg value="instance:02"/> </bean> <bean class="redis.clients.jedis.JedisShardInfo"> <constructor-arg value="127.0.0.1"/> <constructor-arg type="int" value="7003"/> <constructor-arg value="instance:03"/> </bean> </list> </constructor-arg> </bean>一开始你可以设置足够多的instance,数据扩容的时候,只需要将几个instance的数据copy到别的机器上。
然后修改配置文件的ip和端口即可。很方便吧?
另外,Jedis还提供了对jedis sentinel pool的封装,所以发生主从切换的时候,web server都不需要重新配置和deploy。高可用性的极佳体现啊。
@Autowired private JedisSentinelPool pool;public void mymethod() { Jedis jedis = null; try { jedis = pool.getResource(); jedis.hset(.... } catch (JedisException je) { throw je; } finally { if (jedis != null) pool.returnResource(jedis); } }spring bean的配置:<bean id="redisSentinel" class="redis.clients.jedis.JedisSentinelPool"> <constructor-arg index="0" value="mymaster" /> <constructor-arg index="1"> <set> <value>hostofsentinel:26379</value> </set> </constructor-arg> <constructor-arg index="2" ref="jedisPoolConfig" /> </bean>```##redis cluster 客户端(Jedis)<span style="color: #333333; font-family: Arial, sans-serif;"><span style="color: #333333; font-family: Arial, sans-serif;"> private static BinaryJedisCluster jc; static { //只给集群里一个实例就可以 Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>(); jedisClusterNodes.add(new HostAndPort("10.10.34.14", 6380)); jedisClusterNodes.add(new HostAndPort("10.10.34.14", 6381)); jedisClusterNodes.add(new HostAndPort("10.10.34.14", 6382)); jedisClusterNodes.add(new HostAndPort("10.10.34.14", 6383)); jedisClusterNodes.add(new HostAndPort("10.10.34.14", 6384)); jedisClusterNodes.add(new HostAndPort("10.10.34.14", 7380)); jedisClusterNodes.add(new HostAndPort("10.10.34.14", 7381)); jedisClusterNodes.add(new HostAndPort("10.10.34.14", 7382)); jedisClusterNodes.add(new HostAndPort("10.10.34.14", 7383)); jedisClusterNodes.add(new HostAndPort("10.10.34.14", 7384)); jc = new BinaryJedisCluster(jedisClusterNodes); } @Test public void testBenchRedisSet() throws Exception { final Stopwatch stopwatch = new Stopwatch(); List list = buildBlogVideos(); for (int i = 0; i < 1000; i++) { String key = "key:" + i; stopwatch.start(); byte[] bytes1 = protostuffSerializer.serialize(list); jc.setex(key, 60 * 60, bytes1); stopwatch.stop(); } System.out.println("time=" + stopwatch.toString()); }</span></span> 继续阅读与本文标签相同的文章
-
python之面向对象编程二
2026-05-25栏目: 教程
-
python之面向对象编程一
2026-05-25栏目: 教程
-
python之常用模块
2026-05-25栏目: 教程
-
python基础day4
2026-05-25栏目: 教程
-
python基础3
2026-05-25栏目: 教程
