目录
1、设计模式 策略模式
根据此次需求,为了更好的增加用户体验,减少代码的冗余度,采用设计模式的方式完成本次的要求
一个接口对应两个实现类,接口为Jedis抽取的通用的方法,实现类为:一个是单机版的jedisPool完成对接口方法的实现;另一个是集群版JedisCluster完成对接口方法的实现。这样就完成了接口yidu一对二实现类,当在表现层使用(测试)的时候,即可不用修改代码,直接对配置文件applicationContext-jedis.xml进行选择就可以。方便简洁。这种思想模式需要记住。、
2、单机和集群实现
2.1 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);
}
2.2 单机JedisPool实现类
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;
}
}
2.3 JedisPool 单机版配置文件
<!-- id jedisPool是在单机实现类中注入的属性 -->
<!-- id jedisClientPool是实现JedisClient 接口的实现类 -->
<!-- 配置单机版 -->
<!-- id jedisPool是在单机实现类中注入的属性 -->
<!-- <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="host" value="192.168.93.88"></constructor-arg>
<constructor-arg name="port" value="6379"></constructor-arg>
</bean>
<bean id="jedisClientPool" class="com.taotao.content.jedis.utils.JedisClientPool"/> -->
2.4 JedisCluster 实现类
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);
}
}
2.5 JedisCluster配置文件
其中和单机版相同,第一个id是在实现类中注解需要的属性
第二个id是表示Spring在获取接口JedisClient时,表示真正实现的实现类所需要的。
<!-- 配置集群版 -->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg>
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.93.88"></constructor-arg>
<constructor-arg name="port" value="7001"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.93.88"></constructor-arg>
<constructor-arg name="port" value="7002"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.93.88"></constructor-arg>
<constructor-arg name="port" value="7003"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.93.88"></constructor-arg>
<constructor-arg name="port" value="7004"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.93.88"></constructor-arg>
<constructor-arg name="port" value="7005"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.93.88"></constructor-arg>
<constructor-arg name="port" value="7006"></constructor-arg>
</bean>
</set>
</constructor-arg>
</bean>
<bean id="jedisClientCluster" class="com.taotao.content.jedis.utils.JedisClientCluster"/>
2.6 实现测试
通过设计模式,能够在不修改代码的下,对需要的环境进行切换。
@Test
public void JedisClient()throws Exception{
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext("classpath:spring/applicationContext-jedis.xml");
JedisClient jedisClient = applicationContext.getBean(JedisClient.class);
jedisClient.set("hello", "100");
String result = jedisClient.get("hello");
System.out.println(result);
}
3、注解 和 包扫描
开启注解—负责注解是能够使用的,但是不能扫描包
配置一个扫描包========开启注解+扫描包(两件事)
在以上测试中。两个实现类分别使用了注解的方式,由于我们只是用spring加载了redis环境,因此没有用到包扫描,所以在配置文件中需要开启注解驱动模式。