`
steveoyung
  • 浏览: 29303 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

Mybatis自定义缓存——Redis实现

阅读更多

mybatis默认缓存是PerpetualCache,可以查看一下它的源码,发现其是Cache接口的实现;那么我们的缓存只要实现该接口即可。

该接口有以下方法需要实现:

  String getId();
  int getSize();
  void putObject(Object key, Object value);
  Object getObject(Object key);
  Object removeObject(Object key);
  void clear();
  ReadWriteLock getReadWriteLock();

1 实现类:

[java] view plaincopy
 
  1. package app.platform.mybatis

  2. import java.util.concurrent.locks.ReadWriteLock;  
  3. import java.util.concurrent.locks.ReentrantReadWriteLock;  
  4.   
  5. import org.apache.ibatis.cache.Cache;  
  6. import org.slf4j.Logger;  
  7. import org.slf4j.LoggerFactory;  
  8.   
  9. import redis.clients.jedis.Jedis;  
  10. import redis.clients.jedis.JedisPool;  
  11. import redis.clients.jedis.JedisPoolConfig;  
  12.   
  13.   
  14. public class MybatisRedisCache implements Cache {  
  15.       
  16.     private static Logger logger = LoggerFactory.getLogger(MybatisRedisCache.class);  
  17.     private Jedis redisClient=createReids();  
  18.      /** The ReadWriteLock. */    
  19.     private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();   
  20.       
  21.     private String id;  
  22.       
  23.     public MybatisRedisCache(final String id) {    
  24.         if (id == null) {  
  25.             throw new IllegalArgumentException("Cache instances require an ID");  
  26.         }  
  27.         logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>MybatisRedisCache:id="+id);  
  28.         this.id = id;  
  29.     }    
  30.     @Override  
  31.     public String getId() {  
  32.         return this.id;  
  33.     }  
  34.   
  35.     @Override  
  36.     public int getSize() {  
  37.      
  38.         return Integer.valueOf(redisClient.dbSize().toString());  
  39.     }  
  40.   
  41.     @Override  
  42.     public void putObject(Object key, Object value) {  
  43.         logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>putObject:"+key+"="+value);  
  44.         redisClient.set(SerializeUtil.serialize(key.toString()), SerializeUtil.serialize(value));  
  45.     }  
  46.   
  47.     @Override  
  48.     public Object getObject(Object key) {  
  49.         Object value = SerializeUtil.unserialize(redisClient.get(SerializeUtil.serialize(key.toString())));  
  50.         logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>getObject:"+key+"="+value);  
  51.         return value;  
  52.     }  
  53.   
  54.     @Override  
  55.     public Object removeObject(Object key) {  
  56.         return redisClient.expire(SerializeUtil.serialize(key.toString()),0);  
  57.     }  
  58.   
  59.     @Override  
  60.     public void clear() {  
  61.           redisClient.flushDB();  
  62.     }  
  63.     @Override  
  64.     public ReadWriteLock getReadWriteLock() {  
  65.         return readWriteLock;  
  66.     }  
  67.     protected  static Jedis createReids(){  
  68.         JedisPool pool = new JedisPool(new JedisPoolConfig(), "10.12.162.85");  
  69.         return pool.getResource();  
  70.     }  
[java] view plaincopy
 
  1. public class SerializeUtil {  
  2.     public static byte[] serialize(Object object) {  
  3.         ObjectOutputStream oos = null;  
  4.         ByteArrayOutputStream baos = null;  
  5.         try {  
  6.         //序列化  
  7.         baos = new ByteArrayOutputStream();  
  8.         oos = new ObjectOutputStream(baos);  
  9.         oos.writeObject(object);  
  10.         byte[] bytes = baos.toByteArray();  
  11.         return bytes;  
  12.         } catch (Exception e) {  
  13.          e.printStackTrace();  
  14.         }  
  15.         return null;  
  16.         }  
  17.            
  18.         public static Object unserialize(byte[] bytes) {  
  19.         ByteArrayInputStream bais = null;  
  20.         try {  
  21.         //反序列化  
  22.         bais = new ByteArrayInputStream(bytes);  
  23.         ObjectInputStream ois = new ObjectInputStream(bais);  
  24.         return ois.readObject();  
  25.         } catch (Exception e) {  
  26.            
  27.         }  
  28.         return null;  
  29.         }  

 

2 spring中的mybatis配置

<!-- mybatis配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath*:app/mapper/**/*.xml"/>
       <property name="configLocation" value="classpath:/mybatis/mybatis-config.xml" />
</bean>


3 mybatis-config.xml 中的settings配制

<settings>
<!-- 开启缓存支持 -->  
<setting name="cacheEnabled" value="true" />
....... 
</settings>

 

4 在需要加缓存的sqlMap中加入<cache eviction="LRU" type="app.platform.mybatis.MybatisRedisCache" />

例:

<mapper namespace="SYS_ROLE">

  <!-- 缓存 -->
  <cache eviction="LRU" type="app.platform.mybatis.MybatisRedisCache" />

   <!-- 查询所有 -->
<select id="findAll" parameterType="HashMap" resultType="HashMap">
select 
<include refid="base_column" />
from SYS_ROLE
where 1=1
<if test="BUS_TYPE!=null and BUS_TYPE!=''">
and BUS_TYPE  =#{BUS_TYPE}
</if>
<if test="ENABLE!=null and ENABLE!=''">
and ENABLE  =#{ENABLE}
</if>
<if test="ROLE_NAME!=null and ROLE_NAME!=''">
and ROLE_NAME like '%'||#{ROLE_NAME}||'%'
</if>
<if test="ROLE_OTHER_NAME!=null and ROLE_OTHER_NAME!=''">
and ROLE_OTHER_NAME like '%'||#{ROLE_OTHER_NAME}||'%'
</if>
</select>

</mapper>



本文参考了http://blog.csdn.net/nmgrlq/article/details/7996925,按他的方式没配置成功,按上面的方式修改后成功

分享到:
评论

相关推荐

    分布式系统架构——使用Redis做MyBatis的二级缓存 - CSDN博客1

    MyBatis的二级缓存机制允许开发者自定义缓存实现,这就为我们使用Redis这样的分布式缓存系统提供了可能。Redis是一个高性能的键值存储系统,适合存储大量的字符串、列表、集合、哈希表等数据结构,并支持丰富的操作...

    基于SpringBoot+Mybatis+Redis开发的一个问答社区源码+sql数据库(仿牛客网).zip

    使用 Redis 实现点赞、关注功能,优化登录模块——存储登录凭证、缓存用户信息 【备注】 主要针对计算机相关专业的正在做毕设的学生和需要项目实战的Java学习者。 也可作为课程设计、期末大作业。包含:项目源码、...

    整合springmvc、mybatis、redis、shiro

    本示例旨在演示如何将四个核心组件——SpringMVC、MyBatis、Redis和Shiro整合在一起,以实现一个功能丰富的Web应用。下面我们将详细探讨这些技术以及它们在集成中的作用。 1. **SpringMVC**:SpringMVC是Spring框架...

    SpringBoot+Mybatis整合完整源码

    【Spring Boot + Mybatis 整合详解】 Spring Boot 和 Mybatis 的整合是现代 Java 开发中的常见实践,它...在实际项目中,你可以根据需求进一步扩展,如集成 Swagger 进行 API 文档管理,或者引入 Redis 做缓存优化等。

    ShiroDemo权限框架处理

    本文将深入探讨如何在Spring+SpringMVC+MyBatis的环境下,结合Shiro和Redis实现一个完整的权限框架处理——ShiroDemo。 首先,Shiro的核心组件包括Subject、SecurityManager、Realms、Caching、Session管理和...

    springboot搭建

    SpringBoot 搭建——整合 Redis 与 MyBatis 的实战指南 在现代的 Java 开发中,Spring Boot 已经成为了快速构建应用的首选框架,它极大地简化了 Spring 应用的初始设置和配置。本教程将详细介绍如何使用 Spring ...

    javaStudy.rar

    本篇文章将围绕"javaStudy.rar"这个项目,详细解读其中涉及的关键技术点,包括SpringBoot的核心特性、Controller封装、异常处理、分页功能、MyBatis集成、Redis缓存、日志记录、过滤器机制以及Swagger的API文档自动...

    培训班学java学到什么程度可以出去工作了?(csdn)————程序.pdf

    6. **分布式技术**:了解分布式系统的基础知识,如缓存(Redis)、消息中间件(Kafka)、流处理(Storm)和协调服务(Zookeeper)。 7. **设计经验**:具备一定的Java应用开发经验,能够在项目中担任关键模块的设计...

    Java Web供电企业人力资源薪酬管理系统的设计与实现

    - **分布式技术**:考虑到系统的复杂性和未来可能的增长,适当引入分布式技术,如缓存机制(Redis)、消息队列(RabbitMQ)等,提高系统的响应速度和并发处理能力。 **3. 系统架构设计** - **网络结构**:采用B/S...

    java面试——SpringBoot面试专题.zip

    - **Redis**:Spring Boot提供了对Redis缓存的支持,方便数据的快速读写。 6. **安全控制** - **Spring Security**:Spring Boot默认集成Spring Security,提供认证和授权功能。 - **JWT(JSON Web Tokens)**:...

    jsp的公司人事管理系统.rar

    1. 数据缓存:利用Redis等缓存技术,减少数据库访问,提高系统响应速度。 2. 日志管理:记录系统操作日志,便于问题排查和性能优化。 3. 模块化设计:将功能模块化,方便后期增加新功能或进行模块升级。 4. 响应...

    基于ssm+JSP的乡镇自来水收费系统源码数据库.zip

    使用缓存技术如Redis提高数据读取速度;采用分页查询减少数据库压力;同时,系统应该具有良好的模块化设计,以便未来添加新功能或进行维护。 总的来说,基于SSM+JSP的乡镇自来水收费系统是一个集成了现代Web开发...

    java面试——深圳-OPPO-Java高级.zip

    - JPA或MyBatis:ORM框架的使用,事务管理,缓存机制。 10. **分布式系统**: - 分布式锁:Redis、Zookeeper实现的分布式锁机制。 - 分布式一致性:CAP理论,Paxos、Raft等一致性协议的理解。 这些知识点不仅...

    2021 Java学习路线,已助我成功拿到offer(csdn)————程序.pdf

    - **缓存技术**:如Redis,用于提升数据访问速度。 9. **网络编程** - **TCP/IP协议**:理解网络通信的基本原理。 - **Socket编程**:实现简单的客户端和服务器程序。 - **HTTP协议**:了解HTTP请求和响应的...

    md.zip_DVD租赁_碟片租赁_租赁管理系统_租赁管理系统 java

    1. **缓存机制**:引入Redis等缓存技术,减少对数据库的频繁访问,提高系统响应速度。 2. **并发控制**:使用乐观锁或悲观锁策略,解决多线程环境下数据一致性问题。 3. **数据库优化**:合理设计数据库表结构,建立...

    dudenglan_通讯录

    此外,还可以通过缓存技术如Redis来减少对数据库的直接访问,提高系统响应速度。 综上所述,JAVA通讯录的实现不仅涉及到数据库的基本操作,还涵盖了代码简化和优化、反射机制的运用等多个层面。通过对这些知识点的...

    java易买网源代码.zip

    - **Redis**或**Ehcache**:可能用于缓存高频访问数据,提高系统性能。 10. **测试**: - **JUnit**:单元测试框架,确保每个模块功能的正确性。 - **Mockito**:模拟对象,便于隔离测试。 通过深入分析这些源...

    全套Java、Android、HTML5前端视频教程

    - 自定义启动配置。 - 微服务架构搭建。 - **最新SpringBoot整合篇** - Spring Boot与数据库整合。 - 安全性与认证支持。 - 云原生应用部署。 - **最新Mapper视频** - Mapper接口与映射文件关系。 - 动态...

Global site tag (gtag.js) - Google Analytics