redis(五)redis与Mybatis的无缝整合让MyBatis透明的管理缓存二

时间:2022-03-20 03:29:46

在上一篇文中的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. }