redis实现二级缓存
缓存的作用就是降低数据库的使用率,来减轻数据库的负担。我们平常的操作一般都是查>改,所以数据库的有些查操作是重复的,如果一直使用数据库就会有负担。Mybatis也会做缓存,也会有一级缓存和二级缓存:
- 一级缓存:是SqlSession级别的缓存,使用HashMap数据结构来用于存储缓存数据的
- 二级缓存:是mapper级别的缓存,其作用域是mapper的同一个namespace,不同的SqlSession执行两次相同namespace下的sql语句,并且传递的参数相同,返回的结果也相同时,第一次执行sql语句是会将数据从数据库中取出并存入缓存中,第二次查询时便会从缓存中直接获取数据
二级缓存的实现大大的降低了数据库的负担,这里就来实现以下使用redis实现Mybatis的二级缓存。
我这里使用springboot快速搭建的项目>>>直通<<<,基本的环境如下:
jdk 1.7+
springboot maven mybatis项目
redis
mysql
二级缓存的实现
概述
redis二级缓存的实现,主要是重写了Cache.java的方法,自定义缓存,先来看看Cache的方法有哪些:
|
|
这里有put、get、clear等方法,将在我们自己的缓存方法中重写这些方法
自定义缓存方法
|
|
这里需要用到redisTemplate,一开始我们初始化的是空的redisTemplate,这样的话redisTemplate.opsForValue()就是一个空指针异常,所以我们这里要getBean来获取,所以这里有一个ApplicationContextHolder工具类。
ApplicationContextHolder.java:
|
|
二级缓存的使用
在mapper中添加自定义cache:
|
|
其中的eviction有4个不同的参数:
LRU :最近最少使用的:移除最长时间不被使用的对象
FIFO:先进先出:按进入缓存的顺序来移除他们
SOFT:软引用:移除基于垃圾回收器状态和软引用规则的对象
WEAK:弱引用:更积极的移除基于垃圾收集器状态和弱引用规则的对象
测试
测试前先在数据库中插入几条数据,用户测试二级缓存,其实二级缓存就是在原先完整的数据库操作程序中添加了一个自定义cache并在数据库mapper中引入使用。
1.启动redis,查看redis中的keys,可以看到现在是空的
2.启动程序,首先会运行MybatisRedisCache中的构造函数,在日志中看到id=com.yif.redis.model.User,即你的实例
3.运行查询步骤,MybatisRedisCache的运行顺序是:
第一次查询:
getObject()–>putObject()–>数据库查询
再看看redis中的keys,可以看出已经将存入了一个新的key
第二次相同的查询:
getObject()
这样就可以看出第一次查询是从数据库中查出然后将结果存入缓存中,第二次相同的查询是从缓存中就查出了,不再通过数据库查询。
注意:
在mapper文件中,主要两个参数:flushCache和useCache:
在select中,flushCache默认是false,不会清除本地缓存和二级缓存;useCache默认为true,表示进行二级缓存
在update、insert和delete中,flushCache默认为true,会清空本地缓存和二级缓存;而useCache在此是不存在的
所以在update语句中加上flushCache后更新数据库会清除redis的二级缓存,这样在进行下一次查询时,从redis中获取的便是自动更新后的数据(会将数据库的数据put到redis中),这里还有一个情况,也是自己遇到的。网上有很多资料写着MybatisRedisCache中的clear()方法是无用的,所以很多都没有写,这里我也没写,不过这样的话更新后就不会自动更新,所以自己又写了clear()方法,在数据库更新之后便会执行这个clear()方法。
redis实现二级缓存的更多相关文章
- SpringMVC + MyBatis + Mysql + Redis(作为二级缓存) 配置
2016年03月03日 10:37:47 标签: mysql / redis / mybatis / spring mvc / spring 33805 项目环境: 在SpringMVC + MyBa ...
- MySQL与Redis实现二级缓存
redis简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库 Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化, ...
- mybatis plus使用redis作为二级缓存
建议缓存放到 service 层,你可以自定义自己的 BaseServiceImpl 重写注解父类方法,继承自己的实现.为了方便,这里我们将缓存放到mapper层.mybatis-plus整合redi ...
- mybatis 使用redis实现二级缓存(spring boot)
mybatis 自定义redis做二级缓存 前言 如果关注功能实现,可以直接看功能实现部分 何时使用二级缓存 一个宗旨---不常变的稳定而常用的 一级是默认开启的sqlsession级别的. 只在单表 ...
- SpringMVC +Spring + MyBatis + Mysql + Redis(作为二级缓存) 配置
转载:http://blog.csdn.net/xiadi934/article/details/50786293 项目环境: 在SpringMVC +Spring + MyBatis + MySQL ...
- Mybatis的二级缓存、使用Redis做二级缓存
目录 什么是二级缓存? 1. 开启二级缓存 如何使用二级缓存: userCache和flushCache 2. 使用Redis实现二级缓存 如何使用 3. Redis二级缓存源码分析 什么是二级缓存? ...
- mybatis结合redis实战二级缓存(六)
之前的文章中我们意见分析了一级缓存.二级缓存的相关源码和基本原理,今天我们来分享下了mybatis二级缓存和redis的结合,当然mybatis二级缓存也可以和ehcache.memcache.OSC ...
- Springboot Mybatis Redis 实现二级缓存
前言 什么是mybatis二级缓存? 二级缓存是多个sqlsession共享的,其作用域是mapper的同一个namespace. 即,在不同的sqlsession中,相同的namespace下,相同 ...
- SpringBank 开发日志 Mybatis 使用redis 作为二级缓存时,无法通过cacheEnabled=false 将其关闭
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...
随机推荐
- restful的简单使用
根据http的不同方法,访问不同路由的相同控制器下的不同方法可以实现restful的使用 分别对应 路由方式 get put delete post 对应操作 获取 更新 删除 添加 其中如果要在非l ...
- virtualbox Ubuntu拒绝root用户ssh远程登录
http://www.bcty365.com/content-122-6241-1.html
- SQLite-外键约束/表链接查询
外键约束: 表一的某个字段关联到表二的某个字段 例子: 国家表:t_country
- win10远程桌面身份验证错误,要求的函数不受支持
出现原因win10最近安装了一个更新补丁导致的,当然可以直接卸载这个补丁,也可以安装操作来就可以.需要修改注册表里边的项目,添加下面的设置. 解决办法1.win+R 输入 regedit, 打开注册表 ...
- idea 为模块添加Tomcat依赖 解决: Intelij IDEA 创建WEB项目时没有Servlet的jar包
解决: Intelij IDEA 创建WEB项目时没有Servlet的jar包 今天创建SpringMVC项目时 用到HttpServletRequest时, 发现项目中根本没有Servlet这个包, ...
- centos mysql无法删除数据库
系统版本是CentOS Linux release 7.4.1708 (Core) 数据库版本mysql Ver 14.14 Distrib 5.6.39 在执行drop database ga-s ...
- 40)PHP,mysql_fetch_row和mysql_fetch_array和mysql_fetch_assoc的区别
分析: mysql_fetch_row,这个函数是从结果集中取一行作为枚举数据,从和指定的结果标识关联的结果集中取得一行数据并作为数组返回.每个结果的列储存在一个数组的单元中,偏移量从 开始. 注意, ...
- 以puppeteer抓取微指数,puppeteer基本示例,docker部署headless
还是直接上代码 https://github.com/cclient/weizhishu-puppeteer 根据关键字获取微博指数 早期版本以常规的构造cookie,token,sign的访问api ...
- C语言中传值和C++的传引用
在C语言中,传址其实也时传值的一种,首先地址其实也时可以看做是一个值来进行传递的. 在C++中有一种说法叫传引用,就是&变量名. 比如: /* * 传值 int a = 3; void fun ...
- 对Java8新的日期时间类的学习(一)
引用自Java译站http://it.deepinmind.com/java/2015/03/17/20-examples-of-date-and-time-api-from-Java8.html 除 ...