您的位置:首页 > 数据库 > Redis

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

2014-08-25 15:54 393 查看
在上一篇文中的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;  

                }  

        }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: