将 ShardedJedis 与 RedisTemplate 一起使用

Posted

技术标签:

【中文标题】将 ShardedJedis 与 RedisTemplate 一起使用【英文标题】:Using ShardedJedis with RedisTemplate 【发布时间】:2015-06-19 10:26:48 【问题描述】:

以下是从jedis github页面直接复制的Jedis文档:

List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
JedisShardInfo si = new JedisShardInfo("localhost", 6379);
si.setPassword("foobared");
shards.add(si);
si = new JedisShardInfo("localhost", 6380);
si.setPassword("foobared");
shards.add(si);

那么,ShardedJedis 有两种使用方式。直接连接或使用ShardedJedisPool。为了可靠运行,后者必须在多线程环境中使用。

2.a) 直接连接:

ShardedJedis jedis = new ShardedJedis(shards);
jedis.set("a", "foo");
jedis.disconnect;

2.b) 池化连接:

ShardedJedisPool pool = new ShardedJedisPool(new Config(), shards);
ShardedJedis jedis = pool.getResource();
jedis.set("a", "foo");
.... // do your work here
pool.returnResource(jedis);
.... // a few moments later
ShardedJedis jedis2 = pool.getResource();
jedis.set("z", "bar");
pool.returnResource(jedis);
pool.destroy();

上面的例子展示了如何使用ShardedJedis

在我当前的设置中,我使用的是RedisTemplateJedisConnectionFactory

我的问题是

如何将ShardedJedisRedisTemplate 一起使用?

【问题讨论】:

这是旧的,但当时回复说它不支持分片。 forum.spring.io/forum/spring-projects/data/nosql/… 【参考方案1】:

我认为它不直接支持你的情况。 RedisTemplate 为 Redis 交互提供了高级抽象。 而 RedisConnection 提供了接受和返回二进制值(字节数组)的低级方法。

见:Working with Objects through RedisTemplate

【讨论】:

【参考方案2】:

我认为您可以使用以下代码在 spring.xml 中配置 jedis: 当然你应该创建一个 JedisClient.java 作为接口

<!-- redis cluster -->
<!-- <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
    <constructor-arg>
        <set>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="$redis01.real.cluster.client.host"/>
                <constructor-arg name="port" value="$redis01.real.cluster.client.port"/>
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="$redis02.real.cluster.client.host"/>
                <constructor-arg name="port" value="$redis02.real.cluster.client.port"/>
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="$redis03.real.cluster.client.host"/>
                <constructor-arg name="port" value="$redis03.real.cluster.client.port"/>
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="$redis04.real.cluster.client.host"/>
                <constructor-arg name="port" value="$redis04.real.cluster.client.port"/>
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="$redis05.real.cluster.client.host"/>
                <constructor-arg name="port" value="$redis05.real.cluster.client.port"/>
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="$redis06.real.cluster.client.host"/>
                <constructor-arg name="port" value="$redis06.real.cluster.client.port"/>
            </bean>
        </set>
    </constructor-arg>
</bean>
<bean id="jedisClientCluster" class="com.dingli.rest.component.impl.JedisClientCluster"/> -->

【讨论】:

以上是关于将 ShardedJedis 与 RedisTemplate 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

ShardedJedis的使用

JedisShardInfo 怎么配置密码

Redis的JAVA连接

Jedis/JedisPool和Redis数据类型与特性

Spring整合redis

Redis集群