在上一篇文中的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. DC游戏《斑鸠》原创赏析[转载]

    游戏背景:      凤来之国本来只是边远地区的一个小国.但现在他们却自称为得到“神之力”的“神通者”,在“选民思想”“和平统一”之类的名义下开始了对各地的武力侵略.      事情的起因是因为凤来之 ...

  2. 定时每天备份mysql

    http://blog.csdn.net/panning_hu/article/details/9210001 Spring MVC Spring中MVC框架的底层实现 http://blog.csd ...

  3. IC卡,ID卡,M1卡,射频卡

    一般把可读可写,频率是13.56MHz的射频卡称为IC卡,IC卡可以写入数据, 只能读,频率是125KHz的射频卡称为ID卡, M1卡是NXP公司的S50卡的一种叫法,国内的复旦F08,达华的TKS5 ...

  4. CodeIgniter结合Bootstrap

    CodeIgniter-Bootstrap结合了 cI和bootstrap的长处,一个专注于服务器端,一个专注于ui,这个把2个结合起来了.框架地址: http://www.andyhawthorne ...

  5. 赵雅智:service_startService生命周期

    案例演示 布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...

  6. 概率图模型(PGM)学习笔记(四)-贝叶斯网络-伯努利贝叶斯-多项式贝叶斯

    之前忘记强调了一个重要差别:条件概率链式法则和贝叶斯网络链式法则的差别 条件概率链式法则 贝叶斯网络链式法则,如图1 图1 乍一看非常easy认为贝叶斯网络链式法则不就是大家曾经学的链式法则么,事实上 ...

  7. UVA 10312 - Expression Bracketing(数论+Catalan数)

    题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1253">10312 - Exp ...

  8. 【转】利用Ajax.BeginForm提交文件

    Ajax.BeginForm @using (Ajax.BeginForm("YourAction", "YourController", new AjaxOp ...

  9. VM VirtualBox安装Centos6.5

    · · 参考资料:http://www.jb51.net/os/239738.html 如果安装图形界面,内存分配要大于628M 和下图安装选项无关,1.2都可以 界面说明: Install or u ...

  10. struts jsp传值到action,乱码的解决方案

    使用了Struts框架,前台写好了编码为utf-8 <%@ page language="java" contentType="text/html; charset ...