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

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

阅读更多

redis的安装http://liuyieyer.iteye.com/blog/2078093

redis的主从高可用 http://liuyieyer.iteye.com/blog/2078095

Mybatis 的使用不多说。

Mybatis为了方便我们扩展缓存定义了一个Cache接口,看看ehcache-mybatis的源码就明白了。我们要使用自己的cache同样的实现Cache接口即可。直接上代码

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 这个类实现的,照猫画虎,直接我们也继承

public class LoggingRedisCache extends LoggingCache {

        public LoggingRedisCache(String id) {
                super(new RedisCache(id));
        }
      
}

 

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

 

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

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

	<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代理对象,在对数据发生更改的时候,会出错。

 

 

2
0
分享到:
评论

相关推荐

    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作为缓存来提升应用性能。下面将详细阐述这个框架中的各个组成部分以及它们之间的协作。 首先,...

    mybatis与redis整合示例

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

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

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

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

    基于 SpringBoot 从0搭建一个企业级开发项目,基于SpringBoot 的项目,并集成MyBatis-Plus、Redis、Druid、Logback ,并使用 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缓存系统的结合使用,是实现这一目标的常见方式。本教程主要针对初学者,介绍如何将这三者整合,实现数据缓存功能,...

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

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

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

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

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

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

    mybatis+redis实现二级缓存

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

    Springboot+redis+mybatisplus实例

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

    springboot+mybatis+mybatisplus+swagger redis框架整合

    springboot+mybatis+mybatisplus+swagger redis框架整合springboot+mybatis+mybatisplus+swagger redis框架整合springboot+mybatis+mybatisplus+swagger redis框架整合springboot+mybatis+mybatisplus+swagger redis...

    基于mybatis自定义缓存配置Redis

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

    springmvc+mybatis+redis

    总结来说,"springmvc+mybatis+redis"的整合是现代Web开发中常见的技术栈组合,它利用SpringMVC提供灵活的控制层,MyBatis简化数据库操作,而Redis则通过高效的缓存机制优化了数据访问性能。这种组合能够帮助开发者...

    redis-cache-mybatis

    6. **事务支持**:尽管Redis本身不支持复杂的事务操作,但在MyBatis中,我们可以在数据库事务内管理Redis的读写,确保数据的一致性。 7. **缓存刷新**:当数据库中的数据发生变化时,需要及时更新Redis中的对应缓存...

    基于Vue和SpringBoot的医院门诊预约挂号管理系统,采用Redis作菜单缓存,MyBatis读写MySQL数据.zip

    基于Vue和SpringBoot的医院门诊预约挂号管理系统,采用Redis作菜单缓存,MyBatis读写MySQL数据.zip 毕业设计 基于springboot mysql Vue的系统开发,供参考,提供说明材料+源代码 毕业设计 基于springboot mysql ...

Global site tag (gtag.js) - Google Analytics