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 ...
随机推荐
- Python3.7离线安装Requests无法正常使用问题
继续搬砖...... 春节前,克服了网络受限的情况下离线安装Python库文件问题,传送门如下: https://www.cnblogs.com/mrgavin/p/12202214.html htt ...
- iOS 直接使用16进制颜色
在做iOS开发时,一般我们会吸色,就是产品给的图我们一般会吸色,但是最近吸色时候,老大说有较大的颜色偏差,所以要求我们直接使用UI给出的额16进制颜色,你也可以搜索<RGB颜色值转换成十六进制颜 ...
- 吴裕雄--天生自然python Google深度学习框架:经典卷积神经网络模型
import tensorflow as tf INPUT_NODE = 784 OUTPUT_NODE = 10 IMAGE_SIZE = 28 NUM_CHANNELS = 1 NUM_LABEL ...
- E - Ingredients 拓扑排序+01背包
题源:https://codeforces.com/gym/101635/attachments 题意: n行,每行给定字符串s1,s2,s3代表一些菜谱名.s2和s3是煮成是的必要条件,然后给出c和 ...
- Python语言学习:pyc是什么
一.pyc 1.PyCodeObject:是python编译器真正编译成的结果 当python程序运行时,编译的结果是保存在位于内存中的PyCodeObject中.当python程序运行结束时,pyt ...
- Linux平台下_tomcat的安装与优化
一.Tomcat介绍 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一 ...
- Codeforces Round #576 (Div. 2) D. Welfare State
http://codeforces.com/contest/1199/problem/D Examples input1 output1 input2 output2 Note In the firs ...
- FPGA 状态机-序列检测器verilog
实现功能:检测出串行输入数据4位Data二进制序列0101,当检测到该序列的时候,out=1,否则out=0 (1)给出状态编码,画出状态图 (2)门电路实现 (3)verilog实现 首先规定Q3Q ...
- 17)C++开始--命名空间
命名空间:就是区分同一个名字,在不同的作用域的变量 代码展示 #include<iostream> namespace spaceA{ ; namespace spaceB{ struct ...
- ASP.NET防止连续多次点击提交按钮 导致页面重复提交
PS:实际使用中发现,第①种方法在火狐浏览中有时候有问题.第2种方法,在各个浏览器中都没问题 近做项目遇到了这样的情况: 公司网络比平常慢了不少,在点击保存按钮提交页面后需等待挺长的一段时间,忍不住手 ...