目录
1、设计模式 策略模式
2、单机和集群实现
2.1 JedisClient 接口
2.2 单机JedisPool实现类
2.3 JedisPool 单机版配置文件
2.4 JedisCluster 实现类
2.5 JedisCluster配置文件
2.6 实现测试
3、注解 和 包扫描
根据此次需求,为了更好的增加用户体验,减少代码的冗余度,采用设计模式的方式完成本次的要求
一个接口对应两个实现类,接口为Jedis抽取的通用的方法,实现类为:一个是单机版的jedisPool完成对接口方法的实现;另一个是集群版JedisCluster完成对接口方法的实现。这样就完成了接口yidu一对二实现类,当在表现层使用(测试)的时候,即可不用修改代码,直接对配置文件applicationContext-jedis.xml进行选择就可以。方便简洁。这种思想模式需要记住。、
里面封装了常用的方法
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);
}
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;
}
}
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);
}
}
其中和单机版相同,第一个id是在实现类中注解需要的属性
第二个id是表示Spring在获取接口JedisClient时,表示真正实现的实现类所需要的。
通过设计模式,能够在不修改代码的下,对需要的环境进行切换。
@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);
}
开启注解—负责注解是能够使用的,但是不能扫描包
配置一个扫描包========开启注解+扫描包(两件事)
在以上测试中。两个实现类分别使用了注解的方式,由于我们只是用spring加载了redis环境,因此没有用到包扫描,所以在配置文件中需要开启注解驱动模式。