在上一篇文中的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. 转:alphaImageLoader滤镜加载后 链接不能点击

    我是一个很少使用IE滤镜,也是一个不赞成使用IE滤镜的前端工程师.不过今天有一个朋友给我发来了一个有关于IE6的BUG,就是在IE6中使用了AlphaPNG透明的IE滤镜之后,a链接不能够点击.具体情 ...

  2. 光学基础知识:白光、颜色混合、RGB、色彩空间

    1665年,牛顿(Isaac Newton)进行了太阳光实验,让太阳光通过窗板的小圆孔照射在玻璃三角棱镜上,光束在棱镜中折射后,扩散为一个连续的彩虹颜色带,牛顿称之为光谱,表示连续的可见光谱.而可见光 ...

  3. golang(2):beego 环境搭建

    本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/46695513 转载请一定注明出处. 1,关于beego beego是一个用Go开 ...

  4. MySQL的字段设计

    1.尽量使用数字,因为文本占空间,不利于查询(针对有限种类文本)

  5. jquery 上下滑动效果

    <script type="text/javascript"> var myar = setInterval('AutoScroll(".li_gundong ...

  6. FreeCodeCamp:Truncate a string

    要求: 用瑞兹来截断对面的退路! 截断一个字符串! 如果字符串的长度比指定的参数num长,则把多余的部分用...来表示. 切记,插入到字符串尾部的三个点号也会计入字符串的长度. 但是,如果指定的参数n ...

  7. RSA, ACS5.X 集成配置

    目的是RSA和ACS集成,ACS作为RADIUS服务器提供二次验证服务. ①配置RSA SecurID Token Servers   按照如下网址配置: http://www.cisco.com/c ...

  8. CSS 初始化 代码

    腾讯QQ官网 样式初始化 ;} body{font:12px"宋体","Arial Narrow",HELVETICA;background:#fff;-web ...

  9. asp.net mvc 客户端(&)中检测到有潜在危险的 Request.Path 值。

    出现这个错误后,试过 <pages validateRequest="false"> <httpRuntime requestValidationMode=&qu ...

  10. bootstrap基础知识

    Bootstrap是Twitter推出的一款简洁.直观.强悍的前端开发框架. Bootstrap基于 HTML.CSS.JAVASCRIPT.它由Twitter的设计师Mark Otto和Jacob ...