在上一篇文中的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. poj 3335 Rotating Scoreboard - 半平面交

    /* poj 3335 Rotating Scoreboard - 半平面交 点是顺时针给出的 */ #include <stdio.h> #include<math.h> c ...

  2. Linux相关问题-CentOS6.5 x64版本号下Tomcat无法自启动的解决的方法

    前段时间使用阿里云server.使用的是Linux CentOS6.5系统,在搭建完Tomcat后发现,Tomcat无法自启动. 将启动tomcat的命令为tomcat_home/bin/startu ...

  3. ofbiz学习笔记

    最新稳定版apache-ofbiz-13.07.02 最新源码ofbiz-release14.12 ant load-demo 载入演示样例数据 ant load-seed 仅仅载入种子数据 ant ...

  4. .c和.h文件的区别(头文件与之实现文件的的关系~ )

     .c和.h文件的区别 一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢 ...

  5. (转)内核线程对象--Event事件对象

    在所有的内核对象中,事件内核对象是个最基本的对象.事件能够通知一个操作已经完成. 客户机和一个服务器,它们之间需要互相进行通信例子(vs2008 ) 事件内核对象的组成 一个使用计数(与所有内核对象一 ...

  6. BZOJ 3675: [Apio2014]序列分割( dp + 斜率优化 )

    WA了一版... 切点确定的话, 顺序是不会影响结果的..所以可以dp dp(i, k) = max(dp(j, k-1) + (sumn - sumi) * (sumi - sumj)) 然后斜率优 ...

  7. 解决虚拟内存不够导致Eclipse is not responding

    安装目录下eclipse.ini中: 修改参数至必要大小. e.g. -vmargs-Djava.net.preferIPv4Stack=true-Dosgi.requiredJavaVersion= ...

  8. HTML5 总结-表单-输入类型

    HTML5 Input 类型 HTML5 新的 Input 类型 HTML5 拥有多个新的表单输入类型.这些新特性提供了更好的输入控制和验证. 本章全面介绍这些新的输入类型: email url nu ...

  9. win7和ubuntu双系统,win7时间晚8小时解决办法。

    装了Win7和Ubuntu双系统后发现,使用Ubuntu后再登陆win7时系统显示时间不准确,比实际时间晚了8小时. 搜索后发现原来Linux和Windows的系统时间管理是不同的.Linux是以主板 ...

  10. java读写

    IO流下分为字节流与字符流,每个流又分为输入输出以及读写. 字节流的两个基类为InputStream与OutputStream. 字符流为Reader和Writer