Redis整合Mybatis

将Mybatis的缓存修改成redis缓存

将缓存和数据库分开

首先需要添加依赖

jedis的依赖和mybatis的依赖

<!-- mybatis依赖 -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.2.8</version>
</dependency>
<!-- jedis 依赖 -->
 <dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
     <version>2.7.1</version>
</dependency>  

然后我们需要实现Cache类重写里面的方法  

Cache实现类:
package cn.et.mybatis.day5.buffer;  

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Set;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;  

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.apache.ibatis.cache.Cache;  

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;  

public class JedisCache implements Cache {
    static JedisPool jp=null;
    private String id;
    //构造器
    public JedisCache(String id) {
        //redis池只需要初始化一次
        if(jp==null){
            try {
                //关于池的一些配置
                GenericObjectPoolConfig gopc=new GenericObjectPoolConfig();
                //最大连接数
                gopc.setMaxTotal(100);
                //最大排队数
                gopc.setMaxIdle(10);  

                //创建一个redis连接池
                jp=new JedisPool(gopc, "localhost");
                //启动一个redis  检查池创建是否正常
                Jedis redis = jp.getResource();
                //检查没错就回收回去
                jp.returnResourceObject(redis);
            } catch (Exception e) {  

                //出错时就不创建redis连接池
                jp=null;
            }
        }
        this.id = id;
    }  

    static class SeqUtils{
        //反序列化为对象
        public static Object deSer(byte[] bt) throws ClassNotFoundException, IOException{
            ByteArrayInputStream bais=new ByteArrayInputStream(bt);
            ObjectInputStream ois=new ObjectInputStream(bais);
            return ois.readObject();
        }  

        //对象序列化成字节数组
        public static byte[] ser(Object obj) throws IOException{
            ByteArrayOutputStream baos=new ByteArrayOutputStream();
            ObjectOutputStream obos=new ObjectOutputStream(baos);
            obos.writeObject(obj);
            return baos.toByteArray();
        }  

    }  

    @Override
    public void clear() {
        Jedis redis = jp.getResource();
        //将所有的缓存清空 所有对象都清空
        redis.flushAll();  

        jp.returnResourceObject(redis);
    }  

    /**
     * 这个方法返回的是mapper查询的id
     * */
    @Override
    public String getId() {  

        return id;
    }  

    /**
     * mybatis自动调用该方法 判断返回值是否为null
     *   如果为空  自动查询数据库
     *   不为空  直接使用 返回的对象
     *   key 才是 传入当前查询的oid 主键
     */
    //程序一进来首先检查key是否存在如果存在的话就不从数据库查
    @Override
    public Object getObject(Object key) {
        if(jp==null){
            return null;
        }
        Jedis redis = jp.getResource();
        try {
            byte[] bs = redis.get(SeqUtils.ser(key));  

            if(bs!=null){
                Object obj = SeqUtils.deSer(bs);
                jp.returnResourceObject(redis);
                return obj;
            }  

        } catch (IOException e) {  

            e.printStackTrace();
        } catch (ClassNotFoundException e) {  

            e.printStackTrace();
        }
        jp.returnResourceObject(redis);  

        return null;
    }  

    /**
     * 非阻塞式io  non-blocking io
     * */
    @Override
    public ReadWriteLock getReadWriteLock() {
        // TODO Auto-generated method stub
        return new ReentrantReadWriteLock();
    }  

    /**
     * 用于读取 redis中缓存了多少元素
     */
    @Override
    public int getSize() {  

        Jedis jedis=jp.getResource();  

        //表示匹配所有的key
        Set<String> alllElemebts=jedis.keys("*");  

        return alllElemebts.size();
    }  

    /**
     * 第一次查询数据库后 mybatis会自动调用 该方法将数据写入缓存
     */
    @Override
    public void putObject(Object key, Object value) {
        if(jp==null){
            return;
        }  

        Jedis jedis=jp.getResource();
        try {
            //因为只能传字节数组  所以我们需要将key和value转成字节数组
            jedis.set(SeqUtils.ser(key),SeqUtils.ser(value));  

        } catch (IOException e) {
            e.printStackTrace();
        }
        jp.returnResourceObject(jedis);
    }  

    /**
     * 移出缓存中一个键
     * */
    @Override
    public Object removeObject(Object key) {
        Jedis jedis=jp.getResource();  

        try {
            jedis.del(SeqUtils.ser(key));
        } catch (IOException e) {
            e.printStackTrace();
        }  

        jp.returnResourceObject(jedis);
        return null;
    }  

}

然后在配置问价的cache标签中添加你的实现类 表示引用你的实现类:

<cache type="cn.et.mybatis.day5.buffer.JedisCache"></cache> 
测试类:
@Test
    public void testTwoBuff(){
        SqlSessionFactory factory = getSession();  

        SqlSession session = factory.openSession();
        SqlSession session1 = factory.openSession();  

        BuffMapper bm = session.getMapper(BuffMapper.class);
        Emp emp = bm.selectEmp("7788");  

        //二级缓存 session不能互相干扰 session必须关闭.
        session.close();  

        System.out.println("-------------------------");  

        BuffMapper bm1 = session1.getMapper(BuffMapper.class);
        Emp emp1 = bm1.selectEmp("7788");  

        //二级缓存是不相等的  以为用到了序列化和反序列化  两个对象的值是相等的
        System.out.println(emp==emp1);
    } 

他只会去数据库里面查一次

使用注解

使用注解需要在类上面添加@CacheNamespace(implementation=JedisCache.class)

表示你的二级缓存使用你指定的类的

在方法上面添加一个注解@Options(useCache=true)

表示开启二级缓存

添加一点  如果想要在注解中使用二级缓存的话我们需要在类上面添加一个注解

@CacheNamespace(eviction=FifoCache.class)       紫色部分为Cache的一个子类 表示内存溢出的时候使用什么算法

时间: 2024-11-05 06:02:31

Redis整合Mybatis的相关文章

SpringCloud+MyBatis+Redis整合—— 超详细实例(二)

2.SpringCloud+MyBatis+Redis redis是一种nosql数据库,以键值对<key,value>的形式存储数据,其速度相比于MySQL之类的数据库,相当于内存读写与硬盘读写的差别,所以常常用作缓存,用于少写多读的场景下,直接从缓存拿数据比从数据库(数据库要I/O操作)拿要快得多. 话不多说,接下来紧接上一章<SpringCloud+MyBatis+Redis整合-- 超详细实例(一)>搭建SpringCloud+MyBatis+Redis环境: 第一步:在p

SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统

1.前言本文主要介绍使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例. 使用技术:SpringBoot.mybatis.shiro.thymeleaf.pagehelper.Mapper插件.druid.dataTables.ztree.jQuery 开发工具:intellij idea 数据库:mysql.redis 2.表结构还是是用标准的5张表来展现权限.如下图:image 分别为用户表,角色表,资源表,用户角色表,角色资源表.在这个demo中使用了mybat

springboot整合mybatis,redis,代码(二)

一 说明: springboot整合mybatis,redis,代码(一) 这个开发代码的复制粘贴,可以让一些初学者直接拿过去使用,且没有什么bug 二 对上篇的说明 可以查看上图中文件: 整个工程包括配置,对对应上文的配置 原文地址:https://www.cnblogs.com/xiufengchen/p/10327501.html

ssm+redis整合(通过cache方式)

这几天的研究ssm redis 终于进入主题了,今天参考了网上一些文章搭建了一下ssm+redis整合,特别记录下来以便以后可以查询使用,有什么不足请大牛们提点 项目架构 1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http:/

SSM+redis整合

SSM:是Spring+Struts+Mybatis ,另外还使用了PageHelper 前言: 这里主要是利用redis去做mybatis的二级缓存,mybaits映射文件中所有的select都会刷新已有缓存,如果不存在就会新建缓存,所有的insert,update操作都会更新缓存.(这里需要明白对于注解写的SQL语句不会操作缓存,我的增加方法是注解写的就没有清空缓存,后来改为XML中写就清空缓存了,这个问题没有解决?) redis的好处也显而易见,可以使系统的数据访问性能更高.本节只是展示了

SpringBoot 2.SpringBoot整合Mybatis

一.创建Springboot的配置文件:application.properties SpringApplication 会从 application.properties 文件中加载配置信息,下面是添加Spring配置信息的文件目录顺序: 当前目录下的/config子目录中 当前目录中 一个 classpath 包下的 /config 目录中 classpath 根目录中 大家根据自己习惯来即可. /application.properties 文件配置如下: spring.datasourc

spring整合mybatis遇到的bug java.lang.IllegalArgumentException: Property &#39;sqlSessionFactory&#39; or &#39;sqlSessionTemplate&#39; are required

出bug的原因:mybatis-spring版本问题. 查看SqlSessionDaoSupport源码 1.2以上的版本: 1.1.1版本: 解决方法:1.2版本移除了@Autowired的注解,所以如果是1.2版本以上,要在BaseDaoImpl里面手动 注入SetSessionTemplate或者SetSessionFactory spring整合mybatis遇到的bug java.lang.IllegalArgumentException: Property 'sqlSessionFa

springboot学习笔记-2 一些常用的配置以及整合mybatis

一.一些常用的配置 1.1 使用没有父POM的springboot 通过添加scope=import的依赖,仍然能获取到依赖管理的好处: <dependencyManagement> <dependencies> <dependency> <!-- Import dependency management from Spring Boot --> <groupId>org.springframework.boot</groupId>

Spring整合Mybatis应用

1.整合步骤介绍 基于SpringMVC和Mybatis技术开发的主要步骤如下 1>创建工程,搭建SpringMVC和Mybatis技术环境 2>基于MapperScannerConfigurer方式整合Mybatis的Mapper接口(推荐) 3>编写和配置SpringMVC的主要组件,例如Controller,HandlerMapping,ViewResolver等 4>编写JSP视图组件,利用标签和表达式显示模型数据 5>测试程序 2.如何搭建SpringMVC和Myb