springboot+mybatis+redis实现二级缓存

文章介绍了Mybatis的一级缓存和二级缓存机制,以及如何在SpringBoot项目中集成Redis实现二级缓存。二级缓存是mapper级别的,多个sqlSession共享,而一级缓存仅存在于sqlSession内。通过示例展示了配置Redis作为二级缓存存储,并提供了配置类、mapper接口与实现、服务层代码,以及测试用例,强调了在查询多于修改的场景下使用二级缓存的效率提升和注意事项。

Mybatis提供了对缓存的支持,分为一级缓存和二级缓存,其查询顺序为:二级缓存>一级缓存->数据库,最原始是直接查询数据库,为了提高效率和节省资源,引入了一级缓存,为了进一步提高效率,引入了二级缓存。
Mybatis一级缓存是sqlSession级别的缓存,缓存的数据只在sqlSession内有效。
Mybatis二级缓存是mapper级别的缓存,同一个namespace公用这一个缓存,对sqlSession是共享的。
Mybatis默认开启一级缓存,默认没有开启二级缓存,需要在setting全局参数中配置开启二级缓存。

1、二级缓存

Mybatis二级缓存是多个sqlSession共享的,其作用域是mapper的同一个namespace,即同一个namespace下的所有操作语句都影响着同一个cache,即二级缓存被多个sqlSession共享,是一个全局的变量。
不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同时,即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。
二级缓存默认是关闭二级缓存的,因为对应增删改操作频繁的话,那么二级缓存形同虚设,每次都会被清空缓存。
在分布式环境下,由于默认的MyBatis Cache实现都是基于本地的,分布式环境下必然会出现读取到脏数据,需要使用集中式缓存将 MyBatis的Cache 接口实现,有一定的开发成本,直接使用Redis、分布式缓存可能成本更低,安全性也更高。

2、实例

2.1、新建springboot工程

在idea中新建springboot工程,版本为2.7.+,引入相关依赖,如下

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

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.31</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

在application.properties文件中配置mybatis、redis等

# 端口
server.port=8083

# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root

#mybatis
#entity扫描的包名
mybatis.type-aliases-package=com.*.*.model
#Mapper.xml所在的位置
mybatis.mapper-locations=classpath*:/mapper/*Mapper.xml
#开启MyBatis的二级缓存
mybatis.configuration.cache-enabled=true

#日志配置
logging.level.com.*=debug
logging.level.org.springframework.web=debug
logging.level.org.springframework.transaction=debug
logging.level.org.mybatis=debug

#redis
#database name
spring.redis.database=0
#server host
spring.redis.host=127.0.0.1
#server password
spring.redis.password=
#connection port
spring.redis.port=6379

debug=false

2.2、相关配置类

Redis配置类替换序列化实现方式

@Configuration
public class RedisConfig {

    /**
     * 重写Redis序列化方式,使用Json方式:
     * 当我们的数据存储到Redis的时候,我们的键(key)和值(value)都是通过Spring提供的Seriali
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值