【SpringBoot+MyBatis】二级缓存以及使用Redis缓存数据

news2024/11/22 20:19:29

在MyBatis中,存在一级缓存以及二级缓存。一级缓存是默认自动开启,而二级缓存需要我们手动去开启。但看到这篇文章的人,大部分都是在做项目才发现的问题:每次访问数据都要查询一遍又一遍的数据库,这是在控制台上可以发现的。导致数据库压力很大(虽然一个人是看不出来的),但要是众多人使用的就会导致数据库压力大,这点可想而知。

这时候就需要启动MyBatis自带的二级缓存了。

使用二级缓存需要具备以下几个条件:

  • 1、在核心配置文件添加cache-enabled: true(全局性地开启或关闭所以映射器配置文件已配置的任何缓存)

但这是默认开启的,所以可以不用添加

  • 2、在需要的mapper映射文件中的<mapper></mapper>里添加<cache />

  • 3、使用二级缓存的实体类对象必须是可序化的,也就是必须实现java.io.Serializable接口

  • 4、纯MyBatis中需要将SqlSession对象关闭或提交之后,一级缓存才会被写入二级缓存中,此时二级缓存才可用

总而言之就是两步:1、所有的Mapper.xml文件配置<cache/>;2、所有实体类继承序列化接口

 

这样子二级缓存就开启了。每次查询同一条Sql就只会返回一次查询记录。

那么问题又来了,为什么我们已经做到这个地步了还需要使用Redis这个NoSQL呢?虽然MyBatis的二级缓存已经挺好用了,但在分布式集群环境下,应用部署在不同的服务器当中,根据负载均衡的原理,查询的操作可以会访问不同的服务器,如果其中的一个服务器断电什么的,那么缓存就不存在了,就又需要再次查询数据库。所以说需要使用分布式缓存来解决这个问题。

第一步:导入坐标

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

第二步:在yml配置中使用Redis相关配置

spring:
  #Redis相关配置
  redis:
    host: localhost
    #password:
    port: 6379
    database: 0 #操作的是0号数据库
    #Redis连接池配置
    pool:
      max-active: 8 #最大连接数
      max-wait: -1 #连接池最大阻塞等待时间 -1表示无限
      max-idle: 4 #连接池中的最大空闲连接
      min-idle: 0 #连接池中的最小空闲连接

第三步:MyBatis的缓存机制是通过其内部有个PerpetualCache类去实现Cache从而实现缓存的。那么我们同样可以写一个与其相同的类去存储。

import org.apache.ibatis.cache.Cache;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

public class RedisCache implements Cache {
    //id指定当前放入缓存的mapper的namespace
    private final String id;
    private final RedisTemplate redisTemplate;

    public RedisCache(String id) {
        //获取Redis实例
        redisTemplate = ApplicationContextUtil.getBean("redisTemplate",RedisTemplate.class);
        //指定key的序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        this.id = id;
    }

    @Override
    public String getId() {
        return id;
    }

    @Override
    public void putObject(Object key, Object value) {
        redisTemplate.opsForHash().put(id,key.toString(),value);
    }

    @Override
    public Object getObject(Object key) {
        return redisTemplate.opsForHash().get(id,key.toString());
    }

    @Override
    public Object removeObject(Object key) {
        return redisTemplate.opsForHash().delete(id, key);
    }

    @Override
    public void clear() {
        redisTemplate.delete(id);
    }

    @Override
    public int getSize() {
        return redisTemplate.opsForHash().size(id).intValue();
    }
}

在自己完成的这个缓存机制类的有参构造通过ApplicationContextUtil去实例化Redis,需要注意的是,这里不能通过Autowire的方式引用redisTemplate,因为RedisCache并不是Spring容器里的bean。所以我们需要手动地去调用容器的getBean方法来拿到这个bean.所以说需要去写一个工具类去实现ApplicationContextAware,从而去获取上下文对象ApplicationContext,然后才能通过getBean去实例化Redis。

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ApplicationContextUtil implements ApplicationContextAware {
    //获取IoC容器
    private static ApplicationContext applicationContext;

    //实现了ApplicationContextAware接口后,重写setApplicationContext方法进行设置 
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    //通过在工厂中获取对象的方法
    public static <T> T getBean(String beanName,Class<T> requiredType){
        return applicationContext.getBean(beanName,requiredType);
    }
}

第四步:将我们原先在MyBatis的二级缓存<cache/>修改成<cache type="xxx"/>

测试后就会发现控制台输出的和一开始的二级缓存一样,并且在Redis数据库中也存放了数据

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91685.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

叶酸偶联N-季铵化壳聚糖(FA-HTCC)

叶酸偶联N-季铵化壳聚糖(FA-HTCC) 中文名称&#xff1a;叶酸偶联N-季铵化壳聚糖 英文名称&#xff1a;FA-HTCC 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体 包装&#xff1a;瓶装/袋装 溶解性&#xff1a;溶于大…

MYSQL 主从复制 --- binlog

一个MYSQL数据库存在的问题 在谈主从复制之前&#xff0c;应该都会有一个疑问&#xff0c;那么就是一个MYSQL数据库存在的问题呢&#xff1f; 1. 读和写所有压力都由一台数据库承担&#xff0c;压力大 2. 数据库服务器磁盘损坏则数据丢失&#xff0c;单点故障 为了解决我们可以…

Spark RDD介绍

RDD 引出问题 Spark是如何将多台机器上的数据通过一个类型来关联实现的&#xff1f; 答&#xff1a;通过RDD类型来实现关联 一、RDD简介 RDD&#xff08;Resilient Distributed Dataset&#xff09;&#xff1a;弹性分布式数据集 RDD的本质&#xff1a; 一个抽象的逻辑上的…

项目运行久了很卡,手动执行垃圾回收机制,秒丝滑

问题 当项目运行久了&#xff0c;内存会被大量占用。如何不重启项目&#xff0c;释放内存&#xff0c;继续丝滑开发呢&#xff1f; 回答 手动执行垃圾回收机制 打开任务管理器康康&#xff1a; 巨卡&#xff0c;无敌卡&#xff0c;解决它&#xff01; 打开命令行工具&…

Kaggle竞赛——Titanic泰坦尼克之灾(保姆级基础版)

Kaggle竞赛网址&#xff1a;https://www.kaggle.com/c/titanic 本次Kaggle泰坦尼克之灾分析过程大致分为&#xff1a; 第1步&#xff1a;了解数据 第2步&#xff1a;分析数据之间的关系 第3步&#xff1a;缺失项数据处理 第4步&#xff1a;特征因子化 第5步&#xff1a;处理特…

DBCO-SS-活性酯|DBCO-SS-NHS酯

DBCO-SS-活性酯|DBCO-SS-NHS酯 名称;DBCO-SS-活性酯|DBCO-SS-NHS酯 CAS NO&#xff1a;1435934-53-4 分子量&#xff1a;565.66 分子式&#xff1a;C28H27N3O6S2 含 量&#xff1a;>95% 外 观&#xff1a;固体粉末 保存&#xff1a;-20避光避湿 结构式&#xff1a; …

记录--手把手带你开发一个uni-app日历插件(并发布)

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 相信我们在开发各类小程序或者H5&#xff0c;甚至APP时&#xff0c;会把uni-app作为一个技术选型&#xff0c;其优点在于一键打包多端运行&#xff0c;较为强大的跨平台的性能。但是&#xff0c;只要开…

我为什么建议前端将Python 作为第二语言?

前言 “如何摆脱不停切图的困局&#xff1f;” 这不是一篇制造焦虑的文章&#xff0c;而是充满真诚建议的Python推广文。 当谈论到编程入门语言时&#xff0c;大多数都会推荐Python和JavaScript。 实际上&#xff0c;两种语言在方方面面都非常强大。 而如今我们熟知的ES6语…

用Java语言简单实现:炸金花,不知道你有没有兴趣跟着笔者来研究一下呀

说实话&#xff0c;到目前为止&#xff0c;笔者学习Java语言也有着进两个多月了吧&#xff01;&#xff01;但是&#xff0c;一直毫无进度&#xff01;博客更新的也很少&#xff0c;仅仅10篇刚出头&#xff0c;而且浏览量也很少&#xff0c;这样很不符合我的气质&#xff01;&a…

汉字风格迁移----FtransGAN

🚀针对的问题 以前的大多数作品都是通过将给定子集的风格转移到未见子集的内容来解决这个问题的。然而,他们只关注同一语言中的字体样式转换。在许多任务中,我们需要学习一种语言的字体信息,然后将其应用到其他语言。现有的方法很难完成这样的任务。 图1。几个应用实例。…

03_2排序算法:快速排序、归并排序

开始系统学习算法啦&#xff01;为后面力扣和蓝桥杯的刷题做准备&#xff01;这个专栏将记录自己学习算法是的笔记&#xff0c;包括概念&#xff0c;算法运行过程&#xff0c;以及代码实现&#xff0c;希望能给大家带来帮助&#xff0c;感兴趣的小伙伴欢迎评论区留言或者私信博…

IIS2MDCTR传感器规格、ISM303DACTR磁力计应用、STPSC20H12WL二极管特点

IIS2MDC 3轴数字式磁性传感器具有高达50高斯的磁场动态范围以及16位数据输出。IIS2MDC设有I2C串行总线接口&#xff0c;可支持标准模式 (100kHz)、快速模式 (400kHz)、快速模式 (1MHz) 以及高速模式 (3.4MHz)。 该传感器还设有SPI串行标准接口&#xff0c;另外对其进行配置后可…

IBPS低代码产品公司流辰信息:用心研发,不负众望!

作为一家低代码产品公司&#xff0c;流辰信息一直以高标准严格要求自己&#xff0c;努力研发&#xff0c;努力提升服务品质&#xff0c;从专业的角度为中大型企业数字化转型积极赋能&#xff0c;共创价值。 IBPS低代码开发产品是流辰信息努力研发的硕果&#xff0c;是满足企业级…

教材推荐网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 高校教材推介交流平台的开发主要功能教师发布课程名称、用书信息&#xff0c;各出版社推荐样 书&#xff08;线上&#…

CRTO 考试总结

写在最前&#xff1a;欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里&#xff1a;https://discord.gg/9XvvuFq9Wb 一起进步&#xff0c;一起 NB~ 背景 今天我结束了 Zero Point Security RTO I 的考试。证书到手。 Zero Point Security 是一家 Base 在英国的安全…

知乎zse-96算法-js补环境方案

文章目录 1. js代码定位与抠取2. 初步分析 开始补环境3. 完整的补全环境的js整合4. 编写python代码调用测试1. js代码定位与抠取 抠js和上篇jsrpc方案一样,传送门:知乎zse-96算法-jsrpc方案 这里简单提一下 直接进入encrypt方法里, 往上先把整个方法体给扣下来: "u…

c语言教工工资管理系统课程设计

序 言 借助现代信息技术和管理理论&#xff0c;建立学校管理信息系统势在必行。对学校而言&#xff0c;全面开发和应用计算机管理信息系统就是有必要的。在学校管理中&#xff0c;教师是学校的宝贵资源&#xff0c;也是学校的“生命线”&#xff0c;因此人事管理是学校的计算机…

JAVA中生成随机数Random VS ThreadLocalRandom性能比较

前言 大家项目中如果有生成随机数的需求&#xff0c;我想大多都会选择使用Random来实现&#xff0c;它内部使用了CAS来实现。 实际上&#xff0c;JDK1.7之后&#xff0c;提供了另外一个生成随机数的类ThreadLocalRandom&#xff0c;那么他们二者之间的性能是怎么样的呢&#x…

用JavaScript写代码将硬盘序列号从16进制字符串转换为ASCII字符串,兼谈EditPlus和Edge浏览器对JavaScript脚本支持的一点差别

之前写的系统信息收集报告程序SysInfo的一个功能就是收集并报告系统中的硬盘序列号。在之前的测试中这项功能表现不错&#xff0c;但前两天用SysInfo收集一台电脑的信息时&#xff0c;显示的硬盘序列号与其它硬盘序列号读取程序显示的顺序不一样。于是着手对SysInfo的相关代码进…

网络爬虫爬取数据并制作词云全过程【内附可执行代码注释完整】

文章目录前言网络爬取数据部分小知识点利用正则表达式在字符串中提取到url&#xff08;https以及http&#xff09;仅仅只保存字符串中的中文字符爬取数据生成词云jieba分词生成词云生成词云最终版代码总结前言 快期末了&#xff0c;有个数据挖掘的大作业需要用到python的相关知…