设为首页 收藏本站
查看: 979|回复: 0

[经验分享] redis+mybatis+spring

[复制链接]

尚未签到

发表于 2016-11-25 02:42:02 | 显示全部楼层 |阅读模式
redis的安装http://liuyieyer.iyunv.com/blog/2078093
redis的主从高可用 http://liuyieyer.iyunv.com/blog/2078095
Mybatis 的使用不多说。
Mybatis为了方便我们扩展缓存定义了一个Cache接口,看看ehcache-mybatis的源码就明白了。我们要使用自己的cache同样的实现Cache接口即可。直接上代码
Java代码   DSC0000.png


  • public class RedisCache   implements Cache {  
  •         private static Log logger = LogFactory.getLog(RedisCache.class);  
  •         private Jedis redisClient = createClient();  
  •         /** The ReadWriteLock. */  
  •         private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();  
  •           
  •         private String id;  
  •         public RedisCache(final String id) {  
  •                 if (id == null) {  
  •                         throw new IllegalArgumentException("Cache instances require an ID");  
  •                 }  
  •                 logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>MybatisRedisCache:id=" + id);  
  •                 this.id = id;  
  •         }  
  •   
  •         @Override  
  •         public String getId() {  
  •                 return this.id;  
  •         }  
  •   
  •         @Override  
  •         public int getSize() {  
  •                 return Integer.valueOf(redisClient.dbSize().toString());  
  •         }  
  •   
  •         @Override  
  •         public void putObject(Object key, Object value) {  
  •                 logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>putObject:" + key + "=" + value);  
  •                 redisClient.set(SerializeUtil.serialize(key.toString()), SerializeUtil.serialize(value));  
  •         }  
  •   
  •         @Override  
  •         public Object getObject(Object key) {  
  •                 Object value = SerializeUtil.unserialize(redisClient.get(SerializeUtil.serialize(key.toString())));  
  •                 logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>getObject:" + key + "=" + value);  
  •                 return value;  
  •         }  
  •   
  •         @Override  
  •         public Object removeObject(Object key) {  
  •                 return redisClient.expire(SerializeUtil.serialize(key.toString()), 0);  
  •         }  
  •   
  •         @Override  
  •         public void clear() {  
  •                 redisClient.flushDB();  
  •         }  
  •   
  •         @Override  
  •         public ReadWriteLock getReadWriteLock() {  
  •                 return readWriteLock;  
  •         }  
  •          
  •         protected  static Jedis createClient() {  
  •                 try {  
  •                         JedisPool pool = new JedisPool(new JedisPoolConfig(), "172.60.0.172");  
  •                        return pool.getResource();  
  •                 } catch (Exception e) {  
  •                         e.printStackTrace();  
  •                 }  
  •                 throw new RuntimeException("初始化连接池错误");  
  •         }  
  •           
  •     
  •           
  • }  
  •   
  •   
  • class SerializeUtil {  
  •         public static byte[] serialize(Object object) {  
  •                 ObjectOutputStream oos = null;  
  •                 ByteArrayOutputStream baos = null;  
  •                 try {  
  •                         // 序列化  
  •                         baos = new ByteArrayOutputStream();  
  •                         oos = new ObjectOutputStream(baos);  
  •                         oos.writeObject(object);  
  •                         byte[] bytes = baos.toByteArray();  
  •                         return bytes;  
  •                 } catch (Exception e) {  
  •                         e.printStackTrace();  
  •                 }  
  •                 return null;  
  •         }  
  •   
  •         public static Object unserialize(byte[] bytes) {  
  •                 if(bytes == null)return null;  
  •                 ByteArrayInputStream bais = null;  
  •                 try {  
  •                         // 反序列化  
  •                         bais = new ByteArrayInputStream(bytes);  
  •                         ObjectInputStream ois = new ObjectInputStream(bais);  
  •                         return ois.readObject();  
  •                 } catch (Exception e) {  
  •                         e.printStackTrace();  
  •                 }  
  •                 return null;  
  •         }  
  • }  

 
在看ehcache-mybatis的源码 它真正使用cache的方式是通过集成org.apache.ibatis.cache.decorators.LoggingCache 这个类实现的,照猫画虎,直接我们也继承
Java代码  


  • public class LoggingRedisCache extends LoggingCache {  
  •   
  •         public LoggingRedisCache(String id) {  
  •                 super(new RedisCache(id));  
  •         }  
  •         
  • }  

 
在mapper.xml中添加如下cache标签
 
Xml代码  


  • <!-- 启用缓存 -->  
  •     <cache type="cn.seafood.cache.LoggingRedisCache" />   

 在mybatis的核心文件中开启缓存
Xml代码  


  • <settings>  
  •     <!-- 这个配置使全局的映射器启用或禁用缓存 -->  
  •     <setting name="cacheEnabled" value="true" />  
  •  <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->      
  •         <setting name="multipleResultSetsEnabled" value="true"/>  
  •     <!-- 配置默认的执行器。SIMPLE 执行器没有什么特别之处。REUSE 执行器重用预处理语句。BATCH 执行器重用语句和批量更新 -->  
  •     <setting name="defaultExecutorType" value="REUSE" />  
  •     <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->  
  •     <setting name="lazyLoadingEnabled" value="false" />  
  •     <setting name="aggressiveLazyLoading" value="true" />  
  •     <!-- <setting name="enhancementEnabled" value="true"/> -->  
  •     <!-- 设置超时时间,它决定驱动等待一个数据库响应的时间。 -->  
  •     <setting name="defaultStatementTimeout" value="25000" />  
  • </settings>  

 
<setting name="lazyLoadingEnabled" value="false" />
<setting name="aggressiveLazyLoading" value="true" />
注意着两个属性,需要把属性延迟加载和关联对象加载给关闭了,不然放进redis中的cglib代理对象,在对数据发生更改的时候,会出错。
 
 
在上一篇文中的Cahe类存在各种问题如:一直使用同一个连接,每次都创建新的Cache,项目中老是爆出connection timeout 的异常,存储的key过长等等一系列的问题,解决问题最好的办法就是看源码和看官方的文档说明,jedis的文档还是够用的,接下来把cache也改造以下附上代码。
Java代码  


  • package cn.seafood.cache;  
  •   
  • import java.io.ByteArrayInputStream;  
  • import java.io.ByteArrayOutputStream;  
  • import java.io.ObjectInputStream;  
  • import java.io.ObjectOutputStream;  
  • import java.util.concurrent.locks.ReadWriteLock;  
  • import java.util.concurrent.locks.ReentrantReadWriteLock;  
  •   
  • import org.apache.commons.logging.Log;  
  • import org.apache.commons.logging.LogFactory;  
  • import org.apache.ibatis.cache.Cache;  
  •   
  • import redis.clients.jedis.Jedis;  
  • import redis.clients.jedis.JedisPool;  
  • import redis.clients.jedis.JedisPoolConfig;  
  • import redis.clients.jedis.exceptions.JedisConnectionException;  
  • import cn.seafood.util.PropertiesLoader;  
  •   
  • /** 
  •  *  
  • * @ClassName: RedisCache 
  • * @Description: TODO(使用第三方缓存服务器redis,处理二级缓存) 
  • * @author LiuYi 
  • * @date 2014年6月9日 下午1:37:46 
  • * 
  •  */  
  • public class RedisCache   implements Cache {  
  •         private static Log log = LogFactory.getLog(RedisCache.class);  
  •         /** The ReadWriteLock. */  
  •         private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();  
  •           
  •         private String id;  
  •         public RedisCache(final String id) {  
  •                 if (id == null) {  
  •                         throw new IllegalArgumentException("必须传入ID");  
  •                 }  
  •                 log.debug("MybatisRedisCache:id=" + id);  
  •                 this.id=id;  
  •         }  
  •           
  •         @Override  
  •         public String getId() {  
  •                 return this.id;  
  •         }  
  •   
  •         @Override  
  •         public int getSize() {  
  •                 Jedis jedis = null;  
  •                 JedisPool jedisPool = null;  
  •                 int result = 0;  
  •                 boolean borrowOrOprSuccess = true;  
  •                 try {  
  •                         jedis   = CachePool.getInstance().getJedis();  
  •                         jedisPool = CachePool.getInstance().getJedisPool();  
  •                         result = Integer.valueOf(jedis.dbSize().toString());  
  •                 } catch (JedisConnectionException e) {  
  •                         borrowOrOprSuccess = false;  
  •                         if (jedis != null)  
  •                                 jedisPool.returnBrokenResource(jedis);  
  •                 } finally {  
  •                         if (borrowOrOprSuccess)  
  •                                 jedisPool.returnResource(jedis);  
  •                 }  
  •                 return result;  
  •                    
  •         }  
  •   
  •         @Override  
  •         public void putObject(Object key, Object value) {  
  •                 if(log.isDebugEnabled())  
  •                 log.debug("putObject:" + key.hashCode() + "=" + value);  
  •                 if(log.isInfoEnabled())  
  •                 log.info("put to redis sql :" +key.toString());  
  •                 Jedis jedis = null;  
  •                 JedisPool jedisPool = null;  
  •                 boolean borrowOrOprSuccess = true;  
  •                 try {  
  •                         jedis   = CachePool.getInstance().getJedis();  
  •                         jedisPool = CachePool.getInstance().getJedisPool();  
  •                         jedis.set(SerializeUtil.serialize(key.hashCode()), SerializeUtil.serialize(value));  
  •                 } catch (JedisConnectionException e) {  
  •                         borrowOrOprSuccess = false;  
  •                         if (jedis != null)  
  •                                 jedisPool.returnBrokenResource(jedis);  
  •                 } finally {  
  •                         if (borrowOrOprSuccess)  
  •                                 jedisPool.returnResource(jedis);  
  •                 }  
  •                   
  •         }  
  •   
  •         @Override  
  •         public Object getObject(Object key) {  
  •                 Jedis jedis = null;  
  •                 JedisPool jedisPool = null;  
  •                 Object value = null;  
  •                 boolean borrowOrOprSuccess = true;  
  •                 try {  
  •                         jedis   = CachePool.getInstance().getJedis();  
  •                         jedisPool = CachePool.getInstance().getJedisPool();  
  •                         value  = SerializeUtil.unserialize(jedis.get(SerializeUtil.serialize(key.hashCode())));  
  •                 } catch (JedisConnectionException e) {  
  •                         borrowOrOprSuccess = false;  
  •                         if (jedis != null)  
  •                                 jedisPool.returnBrokenResource(jedis);  
  •                 } finally {  
  •                         if (borrowOrOprSuccess)  
  •                                 jedisPool.returnResource(jedis);  
  •                 }  
  •                 if(log.isDebugEnabled())  
  •                 log.debug("getObject:" + key.hashCode() + "=" + value);  
  •                 return value;  
  •         }  
  •   
  •         @Override  
  •         public Object removeObject(Object key) {  
  •                 Jedis jedis = null;  
  •                 JedisPool jedisPool = null;  
  •                 Object value = null;  
  •                 boolean borrowOrOprSuccess = true;  
  •                 try {  
  •                         jedis   = CachePool.getInstance().getJedis();  
  •                         jedisPool = CachePool.getInstance().getJedisPool();  
  •                         value  = jedis.expire(SerializeUtil.serialize(key.hashCode()), 0);  
  •                 } catch (JedisConnectionException e) {  
  •                         borrowOrOprSuccess = false;  
  •                         if (jedis != null)  
  •                                 jedisPool.returnBrokenResource(jedis);  
  •                 } finally {  
  •                         if (borrowOrOprSuccess)  
  •                                 jedisPool.returnResource(jedis);  
  •                 }  
  •                 if(log.isDebugEnabled())  
  •                 log.debug("getObject:" + key.hashCode() + "=" + value);  
  •                 return value;  
  •         }  
  •   
  •         @Override  
  •         public void clear() {  
  •                 Jedis jedis = null;  
  •                 JedisPool jedisPool = null;  
  •                 boolean borrowOrOprSuccess = true;  
  •                 try {  
  •                         jedis   = CachePool.getInstance().getJedis();  
  •                         jedisPool = CachePool.getInstance().getJedisPool();  
  •                         jedis.flushDB();  
  •                         jedis.flushAll();  
  •                 } catch (JedisConnectionException e) {  
  •                         borrowOrOprSuccess = false;  
  •                         if (jedis != null)  
  •                                 jedisPool.returnBrokenResource(jedis);  
  •                 } finally {  
  •                         if (borrowOrOprSuccess)  
  •                                 jedisPool.returnResource(jedis);  
  •                 }  
  •         }  
  •   
  •         @Override  
  •         public ReadWriteLock getReadWriteLock() {  
  •                 return readWriteLock;  
  •         }  
  •        /** 
  •         *  
  •        * @ClassName: CachePool 
  •        * @Description: TODO(单例Cache池) 
  •        * @author LiuYi 
  •        * @date 2014年6月17日 上午10:50:52 
  •        * 
  •         */  
  •         public static class CachePool {  
  •                 JedisPool pool;  
  •                 private static final CachePool cachePool = new CachePool();  
  •                   
  •                 public static CachePool getInstance(){  
  •                         return cachePool;  
  •                 }  
  •                 private CachePool() {  
  •                         JedisPoolConfig config = new JedisPoolConfig();  
  •                         config.setMaxIdle(100);  
  •                         config.setMaxWaitMillis(1000l);  
  •                          PropertiesLoader pl =  new PropertiesLoader("classpath:config/redis.properties");  
  •                          pool = new JedisPool(config,pl.getProperty("redisvip"));  
  •                 }  
  •                 public  Jedis getJedis(){  
  •                         Jedis jedis = null;  
  •                         boolean borrowOrOprSuccess = true;  
  •                         try {  
  •                                 jedis = pool.getResource();  
  •                         } catch (JedisConnectionException e) {  
  •                                 borrowOrOprSuccess = false;  
  •                                 if (jedis != null)  
  •                                         pool.returnBrokenResource(jedis);  
  •                         } finally {  
  •                                 if (borrowOrOprSuccess)  
  •                                         pool.returnResource(jedis);  
  •                         }  
  •                         jedis = pool.getResource();  
  •                         return jedis;  
  •                 }  
  •                   
  •                 public JedisPool getJedisPool(){  
  •                         return this.pool;  
  •                 }  
  •                   
  •         }  
  •           
  •           
  •         public static class SerializeUtil {  
  •                 public static byte[] serialize(Object object) {  
  •                         ObjectOutputStream oos = null;  
  •                         ByteArrayOutputStream baos = null;  
  •                         try {  
  •                                 // 序列化  
  •                                 baos = new ByteArrayOutputStream();  
  •                                 oos = new ObjectOutputStream(baos);  
  •                                 oos.writeObject(object);  
  •                                 byte[] bytes = baos.toByteArray();  
  •                                 return bytes;  
  •                         } catch (Exception e) {  
  •                                 e.printStackTrace();  
  •                         }  
  •                         return null;  
  •                 }  
  •   
  •                 public static Object unserialize(byte[] bytes) {  
  •                         if(bytes == null)return null;  
  •                         ByteArrayInputStream bais = null;  
  •                         try {  
  •                                 // 反序列化  
  •                                 bais = new ByteArrayInputStream(bytes);  
  •                                 ObjectInputStream ois = new ObjectInputStream(bais);  
  •                                 return ois.readObject();  
  •                         } catch (Exception e) {  
  •                                 e.printStackTrace();  
  •                         }  
  •                         return null;  
  •                 }  
  •         }  
  • }  

  参考链接:http://liuyieyer.iyunv.com/blog/2081382

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-304961-1-1.html 上篇帖子: Spring+Mybatis 手动控制事务 下篇帖子: MyBatis概述及学习资料整理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表