wshmh 发表于 2015-7-21 10:40:04

java- 简单redis 封装

  jedis 简单使用并不复杂,但是考虑到效率问题,还是需要用到 jedispool,简单封装一下,方便调用,mark 一下。
  1.由于没有封装自己的序列化接口,所以这块需要我们自己实现



1 package com.lixiaodao.common.redis;
2
3 public interface Serializer {
4   
5   String serialize(T value);
6   
7   T deserialize(String value,Class clazz);
8   
9 }
10
11
12 -----------------------------------------------------------------------------
13 // Gson 的一种简单实现方式
14
15 package com.lixiaodao.common.redis;
16
17 import com.google.gson.Gson;
18
19 public class JsonSerializer implements Serializer {
20   
21   private Gson gson = new Gson();
22
23   @Override
24   public String serialize(T value) {
25         return gson.toJson(value);
26   }
27
28   @Override
29   public T deserialize(String json, Class clazz) {
30         return gson.fromJson(json, clazz);
31   }
32
33 }
  2 .redispool配置类



1 package com.lixiaodao.common.redis;
2
3 import java.io.InputStreamReader;
4
5 import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
6
7 import redis.clients.jedis.JedisPoolConfig;
8
9 import com.google.gson.Gson;
10
11 public class RedisPoolConfig extends GenericObjectPoolConfig {
12
13   private RedisConfig master;
14   private RedisConfig slave;
15
16   private static Gson gson = new Gson();
17
18   private RedisPoolConfig() {
19   }
20
21   /**
22      * 读取配置文件
23      * @param fileName
24      * @return
25      */
26   public static RedisPoolConfig loadConfig(String fileName) {
27         return gson.fromJson(new InputStreamReader(RedisPoolConfig.class
28               .getClassLoader().getResourceAsStream(fileName)),
29               RedisPoolConfig.class);
30   }
31
32   class RedisConfig {
33         private String ip;
34         private int port;
35         private int timeout;
36         private String password;
37         private int database;
38
39         private JedisPoolConfig poolConfig;
40
41         public JedisPoolConfig getPoolConfig() {
42             if (poolConfig == null) {
43               poolConfig = new JedisPoolConfig();
44             }
45             return poolConfig;
46         }
47
48         public String getIp() {
49             return ip;
50         }
51
52         public int getPort() {
53             return port;
54         }
55
56         public int getTimeout() {
57             return timeout;
58         }
59
60         public String getPassword() {
61             return password;
62         }
63
64         public int getDatabase() {
65             return database;
66         }
67
68         public void setIp(String ip) {
69             this.ip = ip;
70         }
71
72         public void setPort(int port) {
73             this.port = port;
74         }
75
76         public void setTimeout(int timeout) {
77             this.timeout = timeout;
78         }
79
80         public void setPassword(String password) {
81             this.password = password;
82         }
83
84         public void setDatabase(int database) {
85             this.database = database;
86         }
87
88         public void setPoolConfig(JedisPoolConfig poolConfig) {
89             this.poolConfig = poolConfig;
90         }
91
92   }
93
94   public RedisConfig getMaster() {
95         return master;
96   }
97
98   public RedisConfig getSlave() {
99         return slave;
100   }
101
102   public void setMaster(RedisConfig master) {
103         this.master = master;
104   }
105
106   public void setSlave(RedisConfig slave) {
107         this.slave = slave;
108   }
109 }
  3.主从连接池 (master 用于 写,slave 用于读,分散压力)
  



package com.lixiaodao.common.redis;
import com.lixiaodao.common.redis.RedisPoolConfig.RedisConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class RedisSlaveMasterPool {
private JedisPool master;
private JedisPool slave;
public RedisSlaveMasterPool(RedisPoolConfig config){
RedisConfig masterConfig = config.getMaster();
master = new JedisPool(masterConfig.getPoolConfig(), masterConfig.getIp(),masterConfig.getPort());
RedisConfig slaveConfig = config.getSlave();
slave = new JedisPool(slaveConfig.getPoolConfig(), slaveConfig.getIp(),slaveConfig.getPort());
}
/**
* 销毁 jedis 连接池
*/
public void destory(){
master.destroy();
slave.destroy();
}
/**
* 从 池子中 获取一个 redis 写权限的实例
* @return
*/
public Jedis getWriteJedis(){
return master.getResource();
}
public Jedis getReadJedis(){
return slave.getResource();
}
/**
* 释放连接 资源
* @param jedis
*/
public void returnReadRedis(Jedis jedis){
slave.returnResource(jedis);
}
/**
* 释放连接资源
* @param jedis
*/
public void returnWriteRedis(Jedis jedis){
master.returnResource(jedis);
}
}
  
  4. 客户端简单 封装(大部分方法没有写。。。嘿嘿)
  



1 package com.lixiaodao.common.redis;
2
3 import redis.clients.jedis.Jedis;
4
5 /**
6* redisclient
7* @author Cookie
8*客户端在 new 的时候,去得到jedis 实例,现用现拿,延迟去拿,用完了就释放。。。。
9* @param
10*/
11 public class RedisClient {
12
13   private static final int DEFAULT_DB_INDEX = 0;
14
15   private RedisSlaveMasterPool pool;
16   private Serializer serializer;
17   private int dbIndex;
18
19   public RedisClient(RedisSlaveMasterPool pool, Serializer serializer) {
20         this(pool, serializer, DEFAULT_DB_INDEX);
21   }
22
23   public RedisClient(RedisSlaveMasterPool pool, Serializer serializer,
24             int dbIndex) {
25         super();
26         this.pool = pool;
27         this.serializer = serializer;
28         this.dbIndex = dbIndex;
29   }
30
31   public Jedis getWriteJedis() {
32         Jedis jedis = pool.getWriteJedis();
33         try {
34             jedis.select(dbIndex);
35         } catch (Exception e) {
36             pool.returnWriteRedis(jedis);
37         }
38         return jedis;
39   }
40
41   public Jedis getReadJedis() {
42         Jedis jedis = pool.getReadJedis();
43         try {
44             jedis.select(dbIndex);
45         } catch (Exception e) {
46             pool.getReadJedis();
47         }
48         return jedis;
49   }
50
51   public void set(String key, T value) {
52         Jedis jedis = getWriteJedis();
53         try {
54             jedis.set(key, serializer.serialize(value));
55         } finally {
56             pool.returnWriteRedis(jedis);
57         }
58   }
59
60   public T get(String key,Class clazz) {
61         Jedis jedis = getReadJedis();
62         T value = null;
63         try {
64             String cached = jedis.get(key);
65             if (cached != null) {
66               value = serializer.deserialize(cached, clazz);
67             }
68         } finally {
69             pool.returnReadRedis(jedis);
70         }
71         return value;
72   }
73 }
  5.定义工厂 ,方便调用



1 package com.lixiaodao.common.redis;
2
3
4 public class RedisClientFactory {
5   
6   /**
7      * 客户端工厂 单粒
8      */
9   public static final RedisClientFactory INSTANCE = new RedisClientFactory();
10   
11   private static final String FILE_NAME = "jedis.json";
12   
13   private RedisSlaveMasterPool pool;
14   
15   private RedisClientFactory() {
16         // 初始化连接池
17         RedisPoolConfig poolConfig = RedisPoolConfig.loadConfig(FILE_NAME);
18         // 生产 实例
19         pool = new RedisSlaveMasterPool(poolConfig);
20   }
21   
22   publicRedisClient createRedisClient(){
23         JsonSerializer serializer = new JsonSerializer();
24         return new RedisClient(pool, serializer);
25   }
26   
27   publicRedisClient createRedisClient(int dbIndex){
28         JsonSerializer serializer = new JsonSerializer();
29         return new RedisClient(pool, serializer,dbIndex);
30   }
31   
32   public void destroy(){
33         pool.destory();
34   }
35 }
  此外 还一个定义异常、统一key 生成规则。。。。
  忘了说一句: jedis.json 要放到 根目录下



{
'master':{
'ip':'127.0.0.1',
'port':6379,
'maxTotal':200,
'maxIdle':20,
'timeout':2000,
'password':'',
'database':0
},
'slave':{
'ip':'127.0.0.1',
'port':6379,
'maxTotal':200,
'maxIdle':20,
'timeout':2000
}
}
  
页: [1]
查看完整版本: java- 简单redis 封装