(转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
2017-06-08 10:41
561 查看
http://blog.csdn.net/yerenyuan_pku/article/details/72863323
我们知道Jedis在处理Redis的单机版和集群版时是完全不同的,有可能在开发的时候使用的是单机版,但是当项目上线后使用的则是集群版,这就需要能够方便的在单机版和集群版之间进行切换。我们的做法便是定义一个JedisClient接口,然后新建两个实现类来分别处理单机版和集群版,最后在spring容器中进行配置管理即可。
首先在taotao-content-service工程下新建一个包com.taotao.content.jedis,并在该包下新建一个JedisClient接口,如下图所示。
JedisClient接口的代码如下:
1
接着我们再在com.taotao.content.jedis包下新建两个JedisClient的实现类,分别是单机版实现类JedisClientPool和集群版实现类JedisClientCluster。单机版实现类的代码如下:
1
集群版实现类的代码如下:
1
我们先来测试单机版如何使用,我们在单机版实现类JedisClientPool当中可以看到使用注入的方式注入JedisPool,要注入,Spring容器当中便要管理这个Bean,因此我们在taotao-content-service工程的src/main/resources/spring目录下新建一个applicationContext-redis.xml配置文件来专门管理Jedis客户端的使用,内容如下:
1
注意:上面的配置文件中关于开启注解的配置是为了单元测试类中的测试代码而添加的,因为使用单元测试类测试的话,不会加载其它配置文件,相应地就不会开启注解,所以需要这句配置,测试完后记得要删掉这个配置哟!
针对applicationContext-redis.xml配置文件的内容有一点需要说明一下,我们看看下图,applicationContext-service.xml文件配置的扫描包的范围是com.taotao.content.service,那么如果我们不指定要扫描com.taotao.content.jedis包的话,能不能把JedisPool注入进来呢?答案是可以的,因为下图中
下面我们在JedisTest单元测试类中新建一个testJedisClientPool单元测试方法进行测试,发现Redis单机版没有任何问题,如下图所示。
测试完了Redis单机版,现在我们来测试Redis集群版,在配置文件中注释掉单机版配置,添加集群版配置,如下所示。
注意:单机版和集群版不能共存,使用单机版时注释集群版的配置,使用集群版,把单机版注释。
添加完集群版配置后,我们的测试方法不用做任何修改,再运行一下,如下图所示,运行一切正常。
我们再到Redis集群中的任何一个节点去检查一下,比如我在192.168.25.128:7006这个节点上使用客户端连接集群,使用命令
这样,以后我们只需修改Spring配置文件便可轻松在单机版和集群版之间进行切换。最后记得把applicationContext-redis.xml文件中用于测试的开启注解的配置
至此,用Spring容器来管理单机版和集群版Redis实现类便学习完了。
我们知道Jedis在处理Redis的单机版和集群版时是完全不同的,有可能在开发的时候使用的是单机版,但是当项目上线后使用的则是集群版,这就需要能够方便的在单机版和集群版之间进行切换。我们的做法便是定义一个JedisClient接口,然后新建两个实现类来分别处理单机版和集群版,最后在spring容器中进行配置管理即可。
首先在taotao-content-service工程下新建一个包com.taotao.content.jedis,并在该包下新建一个JedisClient接口,如下图所示。
JedisClient接口的代码如下:
public interface JedisClient { String set(String key, String value); String get(String key); Boolean exists(String key); Long expire(String key, int seconds); Long ttl(String key); Long incr(String key); Long hset(String key, String field, String value); String hget(String key, String field); Long hdel(String key, String... field); }
1
接着我们再在com.taotao.content.jedis包下新建两个JedisClient的实现类,分别是单机版实现类JedisClientPool和集群版实现类JedisClientCluster。单机版实现类的代码如下:
public class JedisClientPool implements JedisClient { @Autowired private JedisPool jedisPool; @Override public String set(String key, String value) { Jedis jedis = jedisPool.getResource(); String result = jedis.set(key, value); jedis.close(); return result; } @Override public String get(String key) { Jedis jedis = jedisPool.getResource(); String result = jedis.get(key); jedis.close(); return result; } @Override public Boolean exists(String key) { Jedis jedis = jedisPool.getResource(); Boolean result = jedis.exists(key); jedis.close(); return result; } @Override public Long expire(String key, int seconds) { Jedis jedis = jedisPool.getResource(); Long result = jedis.expire(key, seconds); jedis.close(); return result; } @Override public Long ttl(String key) { Jedis jedis = jedisPool.getResource(); Long result = jedis.ttl(key); jedis.close(); return result; } @Override public Long incr(String key) { Jedis jedis = jedisPool.getResource(); Long result = jedis.incr(key); jedis.close(); return result; } @Override public Long hset(String key, String field, String value) { Jedis jedis = jedisPool.getResource(); Long result = jedis.hset(key, field, value); jedis.close(); return result; } @Override public String hget(String key, String field) { Jedis jedis = jedisPool.getResource(); String result = jedis.hget(key, field); jedis.close(); return result; } @Override public Long hdel(String key, String... field) { Jedis jedis = jedisPool.getResource(); Long result = jedis.hdel(key, field); jedis.close(); return result; } }
1
集群版实现类的代码如下:
public class JedisClientCluster implements JedisClient { @Autowired private JedisCluster jedisCluster; @Override public String set(String key, String value) { return jedisCluster.set(key, value); } @Override public String get(String key) { return jedisCluster.get(key); } @Override public Boolean exists(String key) { return jedisCluster.exists(key); } @Override public Long expire(String key, int seconds) { return jedisCluster.expire(key, seconds); } @Override public Long ttl(String key) { return jedisCluster.ttl(key); } @Override public Long incr(String key) { return jedisCluster.incr(key); } @Override public Long hset(String key, String field, String value) { return jedisCluster.hset(key, field, value); } @Override public String hget(String key, String field) { return jedisCluster.hget(key, field); } @Override public Long hdel(String key, String... field) { return jedisCluster.hdel(key, field); } }
1
我们先来测试单机版如何使用,我们在单机版实现类JedisClientPool当中可以看到使用注入的方式注入JedisPool,要注入,Spring容器当中便要管理这个Bean,因此我们在taotao-content-service工程的src/main/resources/spring目录下新建一个applicationContext-redis.xml配置文件来专门管理Jedis客户端的使用,内容如下:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd"> <!-- 开启注解 --> <context:annotation-config /> <!-- redis单机版 --> <bean id="jedisPool" class="redis.clients.jedis.JedisPool"> <constructor-arg name="host" value="192.168.25.128" /> <constructor-arg name="port" value="6379" /> </bean> <bean id="jedisClientPool" class="com.taotao.content.jedis.JedisClientPool"></bean> </beans>
1
注意:上面的配置文件中关于开启注解的配置是为了单元测试类中的测试代码而添加的,因为使用单元测试类测试的话,不会加载其它配置文件,相应地就不会开启注解,所以需要这句配置,测试完后记得要删掉这个配置哟!
针对applicationContext-redis.xml配置文件的内容有一点需要说明一下,我们看看下图,applicationContext-service.xml文件配置的扫描包的范围是com.taotao.content.service,那么如果我们不指定要扫描com.taotao.content.jedis包的话,能不能把JedisPool注入进来呢?答案是可以的,因为下图中
<context:component-scan base-package="com.taotao.content.service"></context:component-scan>这句配置不仅指定了一个包扫描范围,还有一个功能就是开启注解(也就是同时具备两个功能),开启注解后写到Spring容器中的Bean都可以被外界成功注入。
下面我们在JedisTest单元测试类中新建一个testJedisClientPool单元测试方法进行测试,发现Redis单机版没有任何问题,如下图所示。
测试完了Redis单机版,现在我们来测试Redis集群版,在配置文件中注释掉单机版配置,添加集群版配置,如下所示。
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd"> <!-- 开启注解 --> <context:annotation-config /> <!-- redis单机版 --> <!-- <bean id="jedisPool" class="redis.clients.jedis.JedisPool"> <constructor-arg name="host" value="192.168.25.128" /> <constructor-arg name="port" value="6379" /> </bean> <bean id="jedisClientPool" class="com.taotao.content.jedis.JedisClientPool"></bean> --> <!-- 集群版,注意:单机版和集群版不能共存!!! --> <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster"> <constructor-arg name="nodes"> <set> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.128" /> <constructor-arg name="port" value="7001" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.128" /> <constructor-arg name="port" value="7002" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.128" /> <constructor-arg name="port" value="7003" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.128" /> <constructor-arg name="port" value="7004" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.128" /> <constructor-arg name="port" value="7005" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.128" /> <constructor-arg name="port" value="7006" /> </bean> </set> </constructor-arg> </bean> <bean id="jedisClientCluster" class="com.taotao.content.jedis.JedisClientCluster"></bean> </beans>
注意:单机版和集群版不能共存,使用单机版时注释集群版的配置,使用集群版,把单机版注释。
添加完集群版配置后,我们的测试方法不用做任何修改,再运行一下,如下图所示,运行一切正常。
我们再到Redis集群中的任何一个节点去检查一下,比如我在192.168.25.128:7006这个节点上使用客户端连接集群,使用命令
get client来获取它的值,发现client被保存到了槽号为3847的上面,该槽号在 192.168.25.128:7001节点上,如下图所示,说明client确实保存到集群当中了。
这样,以后我们只需修改Spring配置文件便可轻松在单机版和集群版之间进行切换。最后记得把applicationContext-redis.xml文件中用于测试的开启注解的配置
<context:annotation-config/>去掉,因为在applicationContext-service.xml文件中已经开启过注解了,系统运行会把所有的配置文件都加载进来,因此只需一处开启注解就可以了。
至此,用Spring容器来管理单机版和集群版Redis实现类便学习完了。
相关文章推荐
- 淘淘商城系列——使用Spring来管理Redis单机版和集群版
- 学习淘淘商城第三十三课(使用Spring来管理Redis单机版和集群版)
- 淘淘商城系列——使用SolrJ管理Solr集群
- Spring boot入门系列(三):使用Redis进行Session的管理
- redis安装配置使用,redis集群配置,redis集群管理,redis集群使用,php使用redis集群
- Redis 一二事 - 在spring中使用jedis 连接调试单机redis以及集群redis
- Redis 一二事 - 在spring中使用jedis 连接调试单机redis以及集群redis
- spring 使用redis集群配置
- 缓存系列之五:通过codis3.2实现redis3.2.8集群的管理
- Docker系列之(二):使用Mesos管理Docker集群(Mesos + Marathon + Chronos + Docker)
- 【Spring 事务管理系列之一】Spring使用JDBC的事务管理例子
- spring 使用redis集群配置
- spring data redis 集群(sentinel实现)和simple spring memcached分布式初使用
- 学习淘淘商城第五十课(使用SolrJ管理Solr集群)
- 分布式缓存技术redis学习系列----深入理解Spring Redis的使用
- spring 使用redis集群配置
- Docker系列之(二):使用Mesos管理Docker集群(Mesos + Marathon + Chronos + Docker)
- Hadoop系列之(三):使用Cloudera部署,管理Hadoop集群
- 分布式缓存技术redis学习系列(七)—— spring 整合redis如何操作redis集群
- 分布式缓存技术redis学习系列(六)—— 深入理解Spring Redis的使用