Redis做mybatis的二级缓存

作用提升速度,保证多台服务器访问同一数据库时不会崩

注意:保证本地有下载redis且已经打开,否则无法使用。

【本文只讲述了实现步骤,并没有原理讲解】

保证有导入mybatis依赖和Redis依赖

<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

创建cache包放入以下类

【记住:该类不可以注入bean,就是不能加注解@Bean】

//实现Mybatis的Cache接口
public class RedisMybatisCache implements Cache { //注意这里Cache导入的是ibatis的cache private final String id;
private static RedisTemplate<Object, Object> template; //注意构造方法必须带一个String类型的参数接收id
public RedisMybatisCache(String id){
this.id = id;
} //初始化时通过配置类将RedisTemplate给过来
public static void setTemplate(RedisTemplate<Object, Object> template) {
RedisMybatisCache.template = template;
} @Override
public String getId() {
return id;
} @Override
public void putObject(Object o, Object o1) { //o就是Key,o1就是Value
//这里直接向Redis数据库中丢数据即可,o就是Key,o1就是Value,60分钟为过期时间
template.opsForValue().set(o, o1, 60, TimeUnit.MINUTES);
} @Override
public Object getObject(Object o) {
//这里根据Key直接从Redis数据库中获取值即可
return template.opsForValue().get(o);
} @Override
public Object removeObject(Object o) {
//根据Key删除
return template.delete(o);
} @Override
public void clear() {
//由于template中没封装清除操作,只能通过connection来执行
template.execute((RedisCallback<Void>) connection -> {
//通过connection对象执行清空操作
connection.flushDb();
return null;
});
} @Override
public int getSize() {
//这里也是使用connection对象来获取当前的Key数量
return template.execute(RedisServerCommands::dbSize).intValue(); //这里导的类是redis下的
}
}

编写配置类config

@Configuration
public class MainConfiguration {
@Resource
RedisTemplate<Object, Object> template; @PostConstruct
public void init(){
//把RedisTemplate给到RedisMybatisCache
RedisMybatisCache.setTemplate(template);
}
}

每个mapper上加入该注解

//只需要修改缓存实现类implementation为我们的RedisMybatisCache即可
@CacheNamespace(implementation = RedisMybatisCache.class)
@Mapper
public interface MainMapper { @Select("select name from student where sid = 1")
String getSid();
}

每一个实体类实现该接口

(Redis存储对象时,是用序列化存储,所以select返回一个对象时会用到该接口)

@Data
public class Account implements Serializable {
int id;
String username;
String password;
String role;
}

Redis做Mybatis的二级缓存的更多相关文章

  1. 使用Redis做MyBatis的二级缓存

    使用Redis做MyBatis的二级缓存 通常为了减轻数据库的压力,我们会引入缓存.在Dao查询数据库之前,先去缓存中找是否有要找的数据,如果有则用缓存中的数据即可,就不用查询数据库了. 如果没有才去 ...

  2. Redis实现Mybatis的二级缓存

    一.Mybatis的缓存 通大多数ORM层框架一样,Mybatis自然也提供了对一级缓存和二级缓存的支持.一下是一级缓存和二级缓存的作用于和定义. 1.一级缓存是SqlSession级别的缓存.在操作 ...

  3. 使用redis做mybaties的二级缓存(2)-Mybatis 二级缓存小心使用

    Mybatis默认对二级缓存是关闭的,一级缓存默认开启: 下面就说说为什么使用二级缓存需要注意: 二级缓存是建立在同一个namespace下的,如果对表的操作查询可能有多个namespace,那么得到 ...

  4. sping整合redis,以及做mybatis的第三方缓存

    一.spring整合redis Redis作为一个时下非常流行的NOSQL语言,不学一下有点过意不去. 背景:学习Redis用到的框架是maven+spring+mybatis(框架如何搭建这边就不叙 ...

  5. MyBatis:二级缓存原理分析

    MyBatis从入门到放弃七:二级缓存原理分析 前言 说起mybatis的一级缓存和二级缓存我特意问了几个身边的朋友他们平时会不会用,结果没有一个人平时业务场景中用. 好吧,那我暂且用来学习源码吧.一 ...

  6. Mybatis的二级缓存配置

    一个项目中肯定会存在很多共用的查询数据,对于这一部分的数据,没必要每一个用户访问时都去查询数据库,因此配置二级缓存将是非常必要的.  Mybatis的二级缓存配置相当容易,要开启二级缓存,只需要在你的 ...

  7. redis学习总结-redis作为MyBatis的自定义缓存

    1.RedisCache.java package com.houtai.cache; import java.util.concurrent.locks.ReadWriteLock; import ...

  8. Mybatis的二级缓存注意点

    --声明:一下内容都不一定是正确的,只是自己测试的结果,请自己的动手操作得出自己的结论 1.开启Mybatis的二级缓存,不仅要在SqlMapConfig.xml中进行开启总开关,还要在对应的XXXM ...

  9. 《深入理解mybatis原理7》 MyBatis的二级缓存的设计原理

    <深入理解mybatis原理> MyBatis的二级缓存的设计原理 MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能.本文将全面分 ...

  10. 《深入理解mybatis原理》 MyBatis的二级缓存的设计原理

    MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能.本文将全面分析MyBatis的二级缓存的设计原理. 如上图所示,当开一个会话时,一个SqlS ...

随机推荐

  1. 抖音"凶猛"的幕后英雄,火山引擎 DataTester 累计做过 150 万次 A/B 测试

    在国内互联网领域,字节跳动是最为推崇 A/B 测试的公司,旗下"抖音"."今日头条"两大最著名产品,连 APP 的名字都是来源于 A/B 测试. A/B 测试( ...

  2. 莉莉丝游戏与火山引擎 ByteHouse 达成合作,为实时数仓建设提速

    中国头部游戏公司莉莉丝游戏(Lilith Games)和火山引擎 ByteHouse 达成合作,共同致力于加速莉莉丝游戏的实时数仓建设.此次合作将利用 ByteHouse 的创新技术和功能,为莉莉丝的 ...

  3. AcWing 第五场周赛

    比赛链接:Here AcWing 3726. 调整数组 签到题 void solve() { int n; cin >> n; int x = 0, y = 1, c; for (int ...

  4. Function--jdk8用法

    Lambda表达式.首先是参数部分,接着是->,可以视为产出,->之后的内容都是方法体. 当只有一个参数时,可以不需要括号(): 正常情况使用()包裹参数,为了保持一致性,也可以使用括号( ...

  5. <vue 路由 7、导航守卫>

    导航守卫 一.     知识点 1.什么是导航守卫? (1)vue-router提供的导航守卫主要用来监听路由的进入和离开. (2)vue-router提供了beforeEach和afterEach的 ...

  6. ECS模式

    大家好,本文提出了ECS模式.ECS模式是游戏引擎中常用的模式,通常用来组织游戏场景.本文出自我写的开源书<3D编程模式>,该书的更多内容请详见:Github 在线阅读 普通英雄和超级英雄 ...

  7. 简单的git使用命令

    一.Git简介       Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理.Git 是 Linus Torvalds 为了帮助管理 Lin ...

  8. freeswitch的mod_xml_curl模块动态获取dialplan

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. mod_xml_curl模块支持从web服务获取xml配置,本文介绍如何动态获取dialplan配置. 环境 centos:Cent ...

  9. kafka 在 zookeeper 中保存的数据内容

    转载请注明出处: 1. 服务器上下载 kafka : wget https://archive.apache.org/dist/kafka/2.4.0/kafka_2.12-3.2.0.tgz 2.  ...

  10. 23- 数码管动态显示02-转换BCD码

    1.BCD码 数码管动态显示的data[19:0]使用二进制数表示的多位十进制数,不能直接生成段选和片选信号,需要使用BCD码表示的十进制数 BCD码(Binary-Coded Decimal),又称 ...