`
247687009
  • 浏览: 173975 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多

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


1
0
分享到:
评论
4 楼 jinlibing 2015-04-29  
大神,求解,CachePool 为什么要用单例?
3 楼 wusuoya 2014-12-29  
getJedis方法法中,为什么最后又写了一遍jedis = pool.getResource()?
2 楼 247687009 2014-08-12  
jing981111 写道
你好,那个配置文件redis.properties 里面只有一个属性吗?

是的
1 楼 jing981111 2014-08-08  
你好,那个配置文件redis.properties 里面只有一个属性吗?

相关推荐

    springMybatis+redis三级缓存框架

    "springMybatis+redis三级缓存框架"是一个高效且灵活的解决方案,它将MyBatis的二级缓存与Redis相结合,形成一个三级缓存体系,以优化数据读取速度并减轻数据库压力。 首先,MyBatis作为一款轻量级的持久层框架,其...

    mybatis+redis缓存配置

    ### MyBatis与Redis缓存配置详解 #### 一、MyBatis缓存机制概述 在MyBatis中,缓存是一项重要的性能优化措施。它能够显著减少数据库的访问次数,提高应用程序的响应速度。MyBatis提供了两种级别的缓存支持:一级...

    springboot整合redis、mybatis以及redis和mybatis的联合使用

    3、自定义redis KEY生成器/CacheManager来管理redis缓存 4、分布式redis-session共享 5、springboot实现初始化加载配置(实现缓存预热)的两种方式 6、二级缓存联合使用 方式一:redis原生方法工具类(RedisService...

    maven+springmvc+redis+mybatis整合

    本项目以“maven+springmvc+redis+mybatis整合”为主题,旨在提供一个基于这些技术的集成框架,特别强调了利用Redis作为缓存来提升应用性能。下面将详细阐述这个框架中的各个组成部分以及它们之间的协作。 首先,...

    SpringMVC+Redis+MyBatis项目

    MyBatis与Spring的结合使用,可以实现事务管理,提供更强大的数据访问控制。 项目整合这三者,首先需要在SpringMVC的配置文件中添加Redis和MyBatis的相关配置,包括数据源、事务管理器、SqlSessionFactory等。接着...

    Mybatis-plus基于redis实现二级缓存过程解析

    Mybatis-plus基于Redis实现二级缓存过程解析 Mybatis-plus是一款基于Java语言的持久层框架,旨在简化数据库交互操作。然而,在高并发、高性能的应用场景中,数据库的查询操作可能会成为性能瓶颈。为了解决这个问题...

    从0到1项目搭建-集成 Redis 配置MyBatis二级缓存

    基于 SpringBoot 从0搭建一个企业级开发项目,基于SpringBoot 的项目,并集成MyBatis-Plus、Redis、Druid、Logback ,并使用 Redis 配置 MyBatis 二级缓存。

    mybatis与redis整合示例

    mybatis与redis的简单整合示例,供大家学习参考,内含完整maven工程。 博客内容地址:https://blog.csdn.net/magi1201/article/details/85635878

    springboot2.x整合redis做mybatis的二级缓存

    本篇文章将深入探讨如何在Spring Boot 2.x项目中整合Redis作为MyBatis的二级缓存,并实现自定义键、自定义过期时间和自定义序列化方式。 首先,让我们了解什么是二级缓存。在MyBatis中,一级缓存是基于SqlSession的...

    mybatis+redis实现二级缓存

    在本项目中,“mybatis+redis实现二级缓存”是一个巧妙结合了MyBatis持久层框架与Redis内存数据库来优化数据访问速度的实践案例。下面将详细介绍这个项目中的关键技术点以及实现步骤。 首先,MyBatis是一个轻量级的...

    springMVC+mybatis+shiro+redis 项目整合demo

    这个"springMVC+mybatis+shiro+redis 项目整合demo"就是一个实例,展示了如何将这些技术集成到一个项目中,以实现高效的数据处理、用户认证授权和缓存管理。 首先,`SpringMVC` 是 Spring 框架的一部分,它是一个...

    Maven 、Redis、SpringMVC 、Mybatis整合

    "Maven、Redis、SpringMVC、Mybatis整合"是一个常见的技术栈组合,它们各自承担着不同的职责,协同工作以实现强大的功能。接下来,我们将深入探讨这些技术及其整合方式。 **Maven** Maven是一个项目管理和综合工具...

    spring+mybatis+redis缓存入门

    在IT行业中,构建高效、可扩展的Web应用是至关重要的,而Spring框架、MyBatis持久层框架以及Redis缓存系统的结合使用,是实现这一目标的常见方式。本教程主要针对初学者,介绍如何将这三者整合,实现数据缓存功能,...

    SpringBoot 整合 Redis、mybatis 完整项目源码下载

    将SpringBoot与Redis和MyBatis整合,可以构建出高效、可维护的后端服务。下面我们将详细探讨这些知识点。 **SpringBoot整合Redis** 1. **配置Redis**: 在SpringBoot项目中,可以通过`application.properties`或`...

    SpringBoot2.7整合SpringSecurity+Jwt+Redis+MySQL+MyBatis完整项目代码

    在本项目中,我们主要关注的是SpringBoot 2.7版本与多个技术的深度整合,包括Spring Security、JWT(JSON Web Token)、Redis缓存以及MySQL数据库,并利用MyBatis作为持久层框架。以下是对这些技术及其整合应用的...

    mybatis二级缓存扩展-与redis集成

    本文将深入探讨如何对MyBatis的二级缓存进行扩展,并将其与Redis集成,以充分利用分布式缓存的优势。 MyBatis的二级缓存是基于全局的,它允许不同的SqlSession共享相同的缓存数据。默认情况下,MyBatis的二级缓存是...

    Redis用作二级缓存

    通过以上步骤和注意事项,我们可以将Redis有效地整合到Mybatis的二级缓存中,实现高效的数据缓存,提高系统的响应速度和用户体验。同时,结合业务需求和系统负载情况,不断调整优化缓存策略,以达到最佳的性能效果。

    基于mybatis自定义缓存配置Redis

    本篇文章将深入探讨如何在MyBatis中自定义缓存配置,整合第三方缓存系统Redis。 首先,理解MyBatis的缓存机制。MyBatis提供了两级缓存:一级缓存是SqlSession级别的,存在于SqlSessionFactory内部,而二级缓存是...

    Springboot+redis+mybatisplus实例

    MyBatis-Plus支持插入、更新、删除和查询操作,并且可以与Spring Boot无缝集成,实现自动化事务管理。 **Spring Boot整合Redis** 在Spring Boot应用中整合Redis,首先需要在`pom.xml`中引入Redis相关依赖。然后,...

Global site tag (gtag.js) - Google Analytics