在上一篇文中的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; } } }
相关推荐
"springMybatis+redis三级缓存框架"是一个高效且灵活的解决方案,它将MyBatis的二级缓存与Redis相结合,形成一个三级缓存体系,以优化数据读取速度并减轻数据库压力。 首先,MyBatis作为一款轻量级的持久层框架,其...
### MyBatis与Redis缓存配置详解 #### 一、MyBatis缓存机制概述 在MyBatis中,缓存是一项重要的性能优化措施。它能够显著减少数据库的访问次数,提高应用程序的响应速度。MyBatis提供了两种级别的缓存支持:一级...
3、自定义redis KEY生成器/CacheManager来管理redis缓存 4、分布式redis-session共享 5、springboot实现初始化加载配置(实现缓存预热)的两种方式 6、二级缓存联合使用 方式一:redis原生方法工具类(RedisService...
本项目以“maven+springmvc+redis+mybatis整合”为主题,旨在提供一个基于这些技术的集成框架,特别强调了利用Redis作为缓存来提升应用性能。下面将详细阐述这个框架中的各个组成部分以及它们之间的协作。 首先,...
MyBatis与Spring的结合使用,可以实现事务管理,提供更强大的数据访问控制。 项目整合这三者,首先需要在SpringMVC的配置文件中添加Redis和MyBatis的相关配置,包括数据源、事务管理器、SqlSessionFactory等。接着...
Mybatis-plus基于Redis实现二级缓存过程解析 Mybatis-plus是一款基于Java语言的持久层框架,旨在简化数据库交互操作。然而,在高并发、高性能的应用场景中,数据库的查询操作可能会成为性能瓶颈。为了解决这个问题...
基于 SpringBoot 从0搭建一个企业级开发项目,基于SpringBoot 的项目,并集成MyBatis-Plus、Redis、Druid、Logback ,并使用 Redis 配置 MyBatis 二级缓存。
mybatis与redis的简单整合示例,供大家学习参考,内含完整maven工程。 博客内容地址:https://blog.csdn.net/magi1201/article/details/85635878
本篇文章将深入探讨如何在Spring Boot 2.x项目中整合Redis作为MyBatis的二级缓存,并实现自定义键、自定义过期时间和自定义序列化方式。 首先,让我们了解什么是二级缓存。在MyBatis中,一级缓存是基于SqlSession的...
在本项目中,“mybatis+redis实现二级缓存”是一个巧妙结合了MyBatis持久层框架与Redis内存数据库来优化数据访问速度的实践案例。下面将详细介绍这个项目中的关键技术点以及实现步骤。 首先,MyBatis是一个轻量级的...
这个"springMVC+mybatis+shiro+redis 项目整合demo"就是一个实例,展示了如何将这些技术集成到一个项目中,以实现高效的数据处理、用户认证授权和缓存管理。 首先,`SpringMVC` 是 Spring 框架的一部分,它是一个...
"Maven、Redis、SpringMVC、Mybatis整合"是一个常见的技术栈组合,它们各自承担着不同的职责,协同工作以实现强大的功能。接下来,我们将深入探讨这些技术及其整合方式。 **Maven** Maven是一个项目管理和综合工具...
在IT行业中,构建高效、可扩展的Web应用是至关重要的,而Spring框架、MyBatis持久层框架以及Redis缓存系统的结合使用,是实现这一目标的常见方式。本教程主要针对初学者,介绍如何将这三者整合,实现数据缓存功能,...
将SpringBoot与Redis和MyBatis整合,可以构建出高效、可维护的后端服务。下面我们将详细探讨这些知识点。 **SpringBoot整合Redis** 1. **配置Redis**: 在SpringBoot项目中,可以通过`application.properties`或`...
在本项目中,我们主要关注的是SpringBoot 2.7版本与多个技术的深度整合,包括Spring Security、JWT(JSON Web Token)、Redis缓存以及MySQL数据库,并利用MyBatis作为持久层框架。以下是对这些技术及其整合应用的...
本文将深入探讨如何对MyBatis的二级缓存进行扩展,并将其与Redis集成,以充分利用分布式缓存的优势。 MyBatis的二级缓存是基于全局的,它允许不同的SqlSession共享相同的缓存数据。默认情况下,MyBatis的二级缓存是...
通过以上步骤和注意事项,我们可以将Redis有效地整合到Mybatis的二级缓存中,实现高效的数据缓存,提高系统的响应速度和用户体验。同时,结合业务需求和系统负载情况,不断调整优化缓存策略,以达到最佳的性能效果。
本篇文章将深入探讨如何在MyBatis中自定义缓存配置,整合第三方缓存系统Redis。 首先,理解MyBatis的缓存机制。MyBatis提供了两级缓存:一级缓存是SqlSession级别的,存在于SqlSessionFactory内部,而二级缓存是...
MyBatis-Plus支持插入、更新、删除和查询操作,并且可以与Spring Boot无缝集成,实现自动化事务管理。 **Spring Boot整合Redis** 在Spring Boot应用中整合Redis,首先需要在`pom.xml`中引入Redis相关依赖。然后,...