设为首页 收藏本站
查看: 4499|回复: 0

[经验分享] java- 简单redis 封装

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2015-7-21 10:40:04 | 显示全部楼层 |阅读模式
  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     public  RedisClient createRedisClient(){
23         JsonSerializer serializer = new JsonSerializer();
24         return new RedisClient(pool, serializer);
25     }
26     
27     public  RedisClient 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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-88991-1-1.html 上篇帖子: redis实现区间查询 下篇帖子: PHP5.5安装php-redis扩展
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表