在上一篇文中的Cahe类存在各种问题如:一直使用同一个连接,每次都创建新的Cache,项目中老是爆出connection timeout 的异常,存储的key过长等等一系列的问题,解决问题最好的办法就是看源码和看官方的文档说明,jedis的文档还是够用的,接下来把cache也改造以下附上代码。

  1. package cn.seafood.cache;
  2. import java.io.ByteArrayInputStream;
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.ObjectInputStream;
  5. import java.io.ObjectOutputStream;
  6. import java.util.concurrent.locks.ReadWriteLock;
  7. import java.util.concurrent.locks.ReentrantReadWriteLock;
  8. import org.apache.commons.logging.Log;
  9. import org.apache.commons.logging.LogFactory;
  10. import org.apache.ibatis.cache.Cache;
  11. import redis.clients.jedis.Jedis;
  12. import redis.clients.jedis.JedisPool;
  13. import redis.clients.jedis.JedisPoolConfig;
  14. import redis.clients.jedis.exceptions.JedisConnectionException;
  15. import cn.seafood.util.PropertiesLoader;
  16. /**
  17. *
  18. * @ClassName: RedisCache
  19. * @Description: TODO(使用第三方缓存服务器redis,处理二级缓存)
  20. * @author LiuYi
  21. * @date 2014年6月9日 下午1:37:46
  22. *
  23. */
  24. public class RedisCache   implements Cache {
  25. private static Log log = LogFactory.getLog(RedisCache.class);
  26. /** The ReadWriteLock. */
  27. private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
  28. private String id;
  29. public RedisCache(final String id) {
  30. if (id == null) {
  31. throw new IllegalArgumentException("必须传入ID");
  32. }
  33. log.debug("MybatisRedisCache:id=" + id);
  34. this.id=id;
  35. }
  36. @Override
  37. public String getId() {
  38. return this.id;
  39. }
  40. @Override
  41. public int getSize() {
  42. Jedis jedis = null;
  43. JedisPool jedisPool = null;
  44. ;
  45. boolean borrowOrOprSuccess = true;
  46. try {
  47. jedis   = CachePool.getInstance().getJedis();
  48. jedisPool = CachePool.getInstance().getJedisPool();
  49. result = Integer.valueOf(jedis.dbSize().toString());
  50. } catch (JedisConnectionException e) {
  51. borrowOrOprSuccess = false;
  52. if (jedis != null)
  53. jedisPool.returnBrokenResource(jedis);
  54. } finally {
  55. if (borrowOrOprSuccess)
  56. jedisPool.returnResource(jedis);
  57. }
  58. return result;
  59. }
  60. @Override
  61. public void putObject(Object key, Object value) {
  62. if(log.isDebugEnabled())
  63. log.debug("putObject:" + key.hashCode() + "=" + value);
  64. if(log.isInfoEnabled())
  65. log.info("put to redis sql :" +key.toString());
  66. Jedis jedis = null;
  67. JedisPool jedisPool = null;
  68. boolean borrowOrOprSuccess = true;
  69. try {
  70. jedis   = CachePool.getInstance().getJedis();
  71. jedisPool = CachePool.getInstance().getJedisPool();
  72. jedis.set(SerializeUtil.serialize(key.hashCode()), SerializeUtil.serialize(value));
  73. } catch (JedisConnectionException e) {
  74. borrowOrOprSuccess = false;
  75. if (jedis != null)
  76. jedisPool.returnBrokenResource(jedis);
  77. } finally {
  78. if (borrowOrOprSuccess)
  79. jedisPool.returnResource(jedis);
  80. }
  81. }
  82. @Override
  83. public Object getObject(Object key) {
  84. Jedis jedis = null;
  85. JedisPool jedisPool = null;
  86. Object value = null;
  87. boolean borrowOrOprSuccess = true;
  88. try {
  89. jedis   = CachePool.getInstance().getJedis();
  90. jedisPool = CachePool.getInstance().getJedisPool();
  91. value  = SerializeUtil.unserialize(jedis.get(SerializeUtil.serialize(key.hashCode())));
  92. } catch (JedisConnectionException e) {
  93. borrowOrOprSuccess = false;
  94. if (jedis != null)
  95. jedisPool.returnBrokenResource(jedis);
  96. } finally {
  97. if (borrowOrOprSuccess)
  98. jedisPool.returnResource(jedis);
  99. }
  100. if(log.isDebugEnabled())
  101. log.debug("getObject:" + key.hashCode() + "=" + value);
  102. return value;
  103. }
  104. @Override
  105. public Object removeObject(Object key) {
  106. Jedis jedis = null;
  107. JedisPool jedisPool = null;
  108. Object value = null;
  109. boolean borrowOrOprSuccess = true;
  110. try {
  111. jedis   = CachePool.getInstance().getJedis();
  112. jedisPool = CachePool.getInstance().getJedisPool();
  113. );
  114. } catch (JedisConnectionException e) {
  115. borrowOrOprSuccess = false;
  116. if (jedis != null)
  117. jedisPool.returnBrokenResource(jedis);
  118. } finally {
  119. if (borrowOrOprSuccess)
  120. jedisPool.returnResource(jedis);
  121. }
  122. if(log.isDebugEnabled())
  123. log.debug("getObject:" + key.hashCode() + "=" + value);
  124. return value;
  125. }
  126. @Override
  127. public void clear() {
  128. Jedis jedis = null;
  129. JedisPool jedisPool = null;
  130. boolean borrowOrOprSuccess = true;
  131. try {
  132. jedis   = CachePool.getInstance().getJedis();
  133. jedisPool = CachePool.getInstance().getJedisPool();
  134. jedis.flushDB();
  135. jedis.flushAll();
  136. } catch (JedisConnectionException e) {
  137. borrowOrOprSuccess = false;
  138. if (jedis != null)
  139. jedisPool.returnBrokenResource(jedis);
  140. } finally {
  141. if (borrowOrOprSuccess)
  142. jedisPool.returnResource(jedis);
  143. }
  144. }
  145. @Override
  146. public ReadWriteLock getReadWriteLock() {
  147. return readWriteLock;
  148. }
  149. /**
  150. *
  151. * @ClassName: CachePool
  152. * @Description: TODO(单例Cache池)
  153. * @author LiuYi
  154. * @date 2014年6月17日 上午10:50:52
  155. *
  156. */
  157. public static class CachePool {
  158. JedisPool pool;
  159. private static final CachePool cachePool = new CachePool();
  160. public static CachePool getInstance(){
  161. return cachePool;
  162. }
  163. private CachePool() {
  164. JedisPoolConfig config = new JedisPoolConfig();
  165. );
  166. config.setMaxWaitMillis(1000l);
  167. PropertiesLoader pl =  new PropertiesLoader("classpath:config/redis.properties");
  168. pool = new JedisPool(config,pl.getProperty("redisvip"));
  169. }
  170. public  Jedis getJedis(){
  171. Jedis jedis = null;
  172. boolean borrowOrOprSuccess = true;
  173. try {
  174. jedis = pool.getResource();
  175. } catch (JedisConnectionException e) {
  176. borrowOrOprSuccess = false;
  177. if (jedis != null)
  178. pool.returnBrokenResource(jedis);
  179. } finally {
  180. if (borrowOrOprSuccess)
  181. pool.returnResource(jedis);
  182. }
  183. jedis = pool.getResource();
  184. return jedis;
  185. }
  186. public JedisPool getJedisPool(){
  187. return this.pool;
  188. }
  189. }
  190. public static class SerializeUtil {
  191. public static byte[] serialize(Object object) {
  192. ObjectOutputStream oos = null;
  193. ByteArrayOutputStream baos = null;
  194. try {
  195. // 序列化
  196. baos = new ByteArrayOutputStream();
  197. oos = new ObjectOutputStream(baos);
  198. oos.writeObject(object);
  199. byte[] bytes = baos.toByteArray();
  200. return bytes;
  201. } catch (Exception e) {
  202. e.printStackTrace();
  203. }
  204. return null;
  205. }
  206. public static Object unserialize(byte[] bytes) {
  207. if(bytes == null)return null;
  208. ByteArrayInputStream bais = null;
  209. try {
  210. // 反序列化
  211. bais = new ByteArrayInputStream(bytes);
  212. ObjectInputStream ois = new ObjectInputStream(bais);
  213. return ois.readObject();
  214. } catch (Exception e) {
  215. e.printStackTrace();
  216. }
  217. return null;
  218. }
  219. }
  220. }

redis(五)redis与Mybatis的无缝整合让MyBatis透明的管理缓存二的更多相关文章

  1. redis(四)redis与Mybatis的无缝整合让MyBatis透明的管理缓存

    redis的安装 http://liuyieyer.iteye.com/blog/2078093 redis的主从高可用  http://liuyieyer.iteye.com/blog/207809 ...

  2. Mybatis与Spring整合,使用了maven管理项目,作为初学者觉得不错,转载下来

    转载自:http://www.cnblogs.com/xdp-gacl/p/4271627.html 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype ...

  3. ssm框架(Spring Springmvc Mybatis框架)整合及案例增删改查

    三大框架介绍 ssm框架是由Spring springmvc和Mybatis共同组成的框架.Spring和Springmvc都是spring公司开发的,因此他们之间不需要整合.也可以说是无缝整合.my ...

  4. Spring+SpringMVC+MyBatis深入学习及搭建(九)——MyBatis和Spring整合

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6964162.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(八)--My ...

  5. spring + Mybatis + pageHelper + druid 整合源码分享

    springMvc + spring + Mybatis + pageHelper + druid 整合 spring 和druid整合,spring 整合druid spring 和Mybatis  ...

  6. Mybatis和Spring整合&逆向工程

    Mybatis和Spring整合&逆向工程Mybatis和Spring整合mybatis整合Spring的思路目的就是将在SqlMapConfig.xml中的配置移植到Spring的appli ...

  7. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(九)Linux下安装redis及redis的常用命令和操作

    redis简介 Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis与其他key-value缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存 ...

  8. 03.redis与ssm整合(mybatis二级缓存)

    SSM+redis整合 ssm框架之前已经搭建过了,这里不再做代码复制工作. 这里主要是利用redis去做mybatis的二级缓存,mybaits映射文件中所有的select都会刷新已有缓存,如果不存 ...

  9. springboot与redis的无缝整合(分布式)

    参考博客 : https://blog.csdn.net/csao204282/article/details/54092997 1 首先得引入依赖 <dependency> <gr ...

随机推荐

  1. SubLime2 win + mac keygen

    参考 http://www.cnblogs.com/snandy/archive/2013/05/08/3068059.html http://www.freebuf.com/tools/6434.h ...

  2. MVC-03 控制器(5)

    八.动作过滤器 有时在运行Action之前或之后会需要运行一些逻辑运算,以及处理一些运行过程中所生成的异常状况,为了满足这个需求,ASP.NET MVC提供动作过滤器(Action Filter)来处 ...

  3. HDOJ 1423 Greatest Common Increasing Subsequence(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1423 思路分析:[问题定义]给定两个序列A[0, 1,..., m]和B[0, 1, ..., n], ...

  4. The document "ViewController.xib" could not be opened. Could not read archive.

    The document "ViewController.xib" could not be opened. Could not read archive. Please use ...

  5. python下使用protobuf

    python解决ImportError: No module named google.protobuf 关于protocol buffer的优点,就过多涉及:如果涉及到数据传输和解析,使用pb会比自 ...

  6. json数据的获取(网络摘抄)

    一个简单的对象: $.ajax({ type: "post", url: "Handler.ashx", dataType: "html", ...

  7. Tableau 群集部署

    由于公司连续两个月月底Tableau服务器过载崩溃,因此有了搭建Tableau服务器群集的想法.目前还在测试阶段,所以做一步写一步了. 目录: 一.安装和配置工作服务器 二.其他参考文档 一. 安装和 ...

  8. 浅谈JDBC(一)

    一.JDBC技术引言 1.什么是JDBC技术 提供了一套接口规范,利用java代码进行数据库操作. 2.JDBC技术的核心思想 对于程序员来说,代码访问数据库分为三个步骤:1.通过数据库的账号密码.2 ...

  9. 「OC」类的深入研究、description方法和sel

    一.类的深入研究 (一)类的本质 类本身也是一个对象,是class类型的对象,简称“类对象”. Class类型的定义: Typedef struct obj class *class; 类名就代表着类 ...

  10. Hadoop平台安装前准备

    集群配置 准备工作 1.  Iptables #chkconfig iptables –list #chkconfig iptables –level 3456off #service iptable ...