需求:因为开发环境的redis通常为单机版,而生产环境的redis为集群版。所以能不能只需配置文件修改就能实现代码中兼容单机版和集群版。
1、定义一个接口继承JedisCommands(Common interface for sharded and non-sharded Jedis)
public interface JedisClient extends JedisCommands {
}
2、使用 适配器 设计模式,定义一个JedisClientAdapter适配器继承JedisClient接口,所有方法都为空实现。最好将类定义成抽象类abstract。
3、创建单机版和集群版实现类,都继承JedisClientAdapter,将想要实现的方法进行重写
单机版:
/**
* redis单机版,通过redis.clients.jedis.JedisPool
*/
public class JedisClientPool extends JedisClientAdapter {
@Autowired
private JedisPool jedisPool;
@Override
public String set(String key, String value) {
Jedis jedis = jedisPool.getResource();
jedis.set(key,value);
jedis.close();
return value;
}
@Override
public String get(String key) {
Jedis jedis = jedisPool.getResource();
String value = jedis.get(key);
return value;
}
}
集群版:
/**
* redis集群版,通过redis.clients.jedis.JedisCluster
*/
public class JedisClientCluster extends JedisClientAdapter {
@Autowired
private JedisCluster jedisCluster;
@Override
public String set(String key, String value) {
jedisCluster.set(key,value);
return value;
}
@Override
public String get(String key) {
return jedisCluster.get(key);
}
}
4、spring配置文件 applicationContext.xml
<context:component-scan base-package="com.heima.jedis"></context:component-scan>
<!--redis单机版-->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="host" value="192.168.25.129"></constructor-arg>
<constructor-arg name="port" value="6379"></constructor-arg>
</bean>
<!--redis集群版-->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg>
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.129"></constructor-arg>
<constructor-arg name="port" value="7001"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.129"></constructor-arg>
<constructor-arg name="port" value="7002"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.129"></constructor-arg>
<constructor-arg name="port" value="7003"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.129"></constructor-arg>
<constructor-arg name="port" value="7004"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.129"></constructor-arg>
<constructor-arg name="port" value="7005"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.129"></constructor-arg>
<constructor-arg name="port" value="7006"></constructor-arg>
</bean>
</set>
</constructor-arg>
</bean>
<!-- jedisClientPool 和 jedisClientCluster 必须要注释掉一个否则spring初始化会报错。
即通过接口JedisClient查找实现类会找到两个-->
<!-- <bean id="jedisClientPool" class="com.heima.jedis.JedisClientPool">
</bean>-->
<bean id="jedisClientCluster" class="com.heima.jedis.JedisClientCluster">
</bean>
<beans>
5、测试
public static void main(String[] args) {
ClassPathXmlApplicationContext application = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
//获取的时候,通过接口。必须保证spring配置文件只有一个实现类,否则报错
JedisClient jedis = application.getBean(JedisClient.class);
jedis.set("jedisClientPool","JedisClientCluster");
String value = jedis.get("jedisClientPool");
System.out.println("得到的值集:"+value);
}
获取实现类的时候通过JedisClient接口获取,这样测试环境和生产环境切换的时候,只需要修改配置文件applicationContext.xml。例如,现在applicationContext.xml有两个JedisClient的实现类,把需要的不需要的那个注释掉就ok了。