在上一篇文中的Cahe类存在各种问题如:一直使用同一个连接,每次都创建新的Cache,项目中老是爆出connection timeout 的异常,存储的key过长等等一系列的问题,解决问题最好的办法就是看源码和看官方的文档说明,jedis的文档还是够用的,接下来把cache也改造以下附上代码。
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; } } }
相关推荐
mybatis二级缓存 + reads做第三级缓存
springmvc整合Mybatis,Redis;实现将查询的数据进行二级缓存处理
3、自定义redis KEY生成器/CacheManager来管理redis缓存 4、分布式redis-session共享 5、springboot实现初始化加载配置(实现缓存预热)的两种方式 6、二级缓存联合使用 方式一:redis原生方法工具类(RedisService...
基于maven+springmvc+redis+mybatis整合案例框架,主要实现redis的读取案例
SpringMVC+Redis+MyBatis项目,主要实现Redis注释缓存
基于 SpringBoot 从0搭建一个企业级开发项目,基于SpringBoot 的项目,并集成MyBatis-Plus、Redis、Druid、Logback ,并使用 Redis 配置 MyBatis 二级缓存。
mybatis与redis的简单整合示例,供大家学习参考,内含完整maven工程。 博客内容地址:https://blog.csdn.net/magi1201/article/details/85635878
主要介绍了Mybatis-plus基于redis实现二级缓存过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
springboot整合redis做mybatis的二级缓存,含有自定义key,自定义过期时间,自定义序列化方式
springMVC+mybatis+shiro+redis 项目整合demo。
SpringBoot整合Redis源码 mybatis实战源码 封装RedisUtils工具类源码 redis缓存mybatis数据源码
本文给大家介绍redis与ssm整合方法(mybatis二级缓存)。主要是利用redis去做mybatis的二级缓存,mybaits映射文件中所有的select都会刷新已有缓存,如果不存在就会新建缓存,所有的insert,update操作都会更新缓存
Maven 、Redis、SpringMVC 、Mybatis整合。纯属学习使用,如发生问题,作者不负任何责任。有异议,请联系1218476693@qq.com
springboot+mybatis+mybatisplus+swagger redis框架整合springboot+mybatis+mybatisplus+swagger redis框架整合springboot+mybatis+mybatisplus+swagger redis框架整合springboot+mybatis+mybatisplus+swagger redis...
spring框架下整合mybatis和缓存redis
其中包括redis作为mybatis的第三方缓存配置和redis直接操作缓存数据库的集成。说明:将application.properties中数据源的修改成你的配置。若你只想看spring集成redis的操作,则可以将mysql的配置注释掉,将...
基于Vue和SpringBoot的医院门诊预约挂号管理系统,采用Redis作菜单缓存,MyBatis读写MySQL数
redis实现mybatis的二级缓存 springboot 2.0.1.RELEASE 关键点: 1.自己实现的二级缓存,必须要有一个带id的构造函数,否则会报错。 2.我们使用Spring封装的redisTemplate来操作Redis。 网上所有介绍redis做二级缓存...
该项目范例是使用了SpringBoot+Mybatis+Redis搭建而成,该项目可以下载后直接打开运行,里面包含增加、删除、修改和查询的的范例实现。本人结合网上资源,多方面查询才整合完成;但愿对需要和学习的朋友能有所帮助。
基于Vue和SpringBoot的医院门诊预约挂号管理系统,采用Redis作菜单缓存,MyBatis读写MySQL数据.zip 毕业设计 基于springboot mysql Vue的系统开发,供参考,提供说明材料+源代码 毕业设计 基于springboot mysql ...