redis代替mybatis做缓存
将redis作为缓存
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>1.5.8.RELEASE</version>
</dependency>
</dependencies>
pom
test文件
package com.lqh.springdataredis; import com.lqh.springdataredis.dao.AdminDao;
import com.lqh.springdataredis.entity.Admin;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource;
import java.util.List; @SpringBootTest(classes = SpringdataRedisApplication.class)
@RunWith(SpringRunner.class)
public class TestClazz { @Resource
AdminDao adminDao; @Test
public void selectAll(){
List<Admin> admins = adminDao.queryAll(new Admin());
for (Admin admin : admins) {
System.out.println(admin); }
System.out.println("=========================================================");
List<Admin> admins1 = adminDao.queryAll(new Admin());
for (Admin admin : admins1) {
System.out.println(admin); } }
}
配置文件
server.port=8087 logging.level.root=error
logging.level.com.lqh.springdataredis.dao=debug #spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/girls?serverTimezone=GMT%2B8
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.lqh.springdataredis.entity
spring.redis.host=192.168.253.11
spring.redis.port=6379
自定义cache
package com.lqh.springdataredis.mycache; import com.lqh.springdataredis.entity.Admin;
import org.apache.ibatis.cache.Cache;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer; import java.util.concurrent.locks.ReadWriteLock; public class Mycache implements Cache {
// 这个id是namespace 这个类是mybatis 调用的所以这个构造方法的参数也是mybatis传递的 private String id; public Mycache(String id) {
this.id = id;
} @Override
public String getId() {
System.out.println("getId: "+id);
/**
* id: com.lqh.springdataredis.dao.AdminDao
*/
return id;
} /**
* 存储从数据库中查找的数据当请求到达的时候先去缓存中去找数据如果没有数据则去数据库中去找
* 并且将查询到的数据添加到缓存中
* 在这个方法中将从数据库中查询到的数据保存到redis中
* 因为这个类的是由mybatis进行调用的的那么这个类就不能使用注解的方式那么如何在springboot的项目中
* 普通类如果想要使用spring工厂管理的组件(redisTemplate)需要做一下操作
* implements ApplicationContextAwear会将工厂作为参数传递给你重写这类里面的所有方法就会将你传入的类交由工厂管理
* @param o
* @param o1
*/
@Override
public void putObject(Object o, Object o1) {
System.out.println("putObject : "+o);
System.out.println("putObject :"+o1);
/**
* o的值:
* putObject : 518470582:509867698:com.lqh.springdataredis.dao.AdminDao.queryAll:0:2147483647:select
* id, name, birthday, mesage
* from girls.admin:SqlSessionFactoryBean
* o1的值:
* putObject :[Admin{id=1, name='朱李飞', birthday=Wed Oct 16 00:00:00 CST 2019, mesage='8888'},
* Admin{id=8, name='33', birthday=Fri Nov 15 00:00:00 CST 2019,
*/
// 从容器中获取redisTemplate
RedisTemplate redisTemplate = (RedisTemplate) MyApplicationContexAware.getBeanByName("redisTemplate");
// 以json作为序列化方式
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Admin.class);
redisTemplate.setKeySerializer(jackson2JsonRedisSerializer);
// redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setDefaultSerializer(jackson2JsonRedisSerializer);
// 将数据添加到redis中 key o | value o1
redisTemplate.opsForHash().put(id,o,o1);
} /**
* 从缓存中获取数据
* @param o
* @return
*/
@Override
public Object getObject(Object o) {
System.out.println("getObject: "+o);
/**
* getObject: 518470582:509867698:com.lqh.springdataredis.dao.AdminDao.queryAll:0:2147483647:select
* id, name, birthday, mesage
* from girls.admin:SqlSessionFactoryBean
*/
RedisTemplate redisTemplate = (RedisTemplate) MyApplicationContexAware.getBeanByName("redisTemplate");
// id 是 key o value o
Object o1 = redisTemplate.opsForHash().get(id, o);
return o1;
} @Override
public Object removeObject(Object o) {
return null;
}
//当进行修改操作时会清空缓存
@Override
public void clear() {
RedisTemplate redisTemplate = (RedisTemplate) MyApplicationContexAware.getBeanByName("redisTemplate");
redisTemplate.delete(id); } @Override
public int getSize() {
return 0;
} @Override
public ReadWriteLock getReadWriteLock() {
return null;
}
}
ApplicationContextAwear
package com.lqh.springdataredis.mycache; import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component; @Component
public class MyApplicationContexAware implements ApplicationContextAware {
/**
* 这个类主要是获取工厂对象用于管理
* @param applicationContext
* @throws BeansException
*/
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
} public static Object getBeanByClazz(Class clazz){
Object bean = applicationContext.getBean(clazz);
return bean;
} public static Object getBeanByName(String name){
Object bean = applicationContext.getBean(name);
return bean;
} }
redis代替mybatis做缓存的更多相关文章
- redis与ssm整合(用 redis 替代mybatis二级缓存)
SSM+redis整合 这里主要是利用redis去做mybatis的二级缓存,mybaits映射文件中所有的select都会刷新已有缓存,如果不存在就会新建缓存,所有的insert,update操作都 ...
- redis代替kafka做缓存队列
前言:刚上线elk一个月左右,使用的kafka作为缓存队列,但是不知道为何,中间发生过好几次,elk突然没数据了,长达好几天都没有, 折腾了好久,好了,过几天又发生同样的状况.经查找,数据是 ...
- Nosql 之 Redis(可做缓存 )
下载 可以下载解压安装的 地址:https://github.com/dmajkic/redis/downloads 修改 redis.conf 取消注释 requirepass foobared运行 ...
- mybatis本地缓存&分布式缓存干货分享
前言:干货记录学习mybatis实际开发中缓存的使用. 环境: springboot2.X + mybatis3.x Mybatis是一款持久层框架,它提供了一级缓存和二级缓存. 名词解释 一级缓存( ...
- Mybatis一级缓存、二级缓存详讲
Mybatis 一级缓存.二级缓存 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 查询缓存 首先,我们先看一下这个标题“查询缓存”,那就说明跟增.删.改是没有任何关联的,只有在查询 ...
- mybatis一级缓存和二级缓存(一)
一级缓存: 就是Session级别的缓存.一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中. 如果短时间内这个session(一定要同一个session)又做了同一个操作,那么h ...
- SpringBoot之Mybatis操作中使用Redis做缓存
上一博客学习了SpringBoot集成Redis,今天这篇博客学习下Mybatis操作中使用Redis做缓存.这里其实主要学习几个注解:@CachePut.@Cacheable.@CacheEvict ...
- spring-boot集成mybatis,用redis做缓存
网上有很多例子了,执行源码起码有3个,都是各种各样的小问题. 现在做了个小demo,实现spring-boot 用redis做缓存的实例,简单记录下思路,分享下源码. 缓存的实现,分担了数据库的压力, ...
- sping整合redis,以及做mybatis的第三方缓存
一.spring整合redis Redis作为一个时下非常流行的NOSQL语言,不学一下有点过意不去. 背景:学习Redis用到的框架是maven+spring+mybatis(框架如何搭建这边就不叙 ...
随机推荐
- WPF---数据绑定之RelativeSource(五)
一.概述 当Binding有明确的数据来源的时候,我们可以用Source或者ElementName赋值的办法让Binding与之关联. 但是,有时候当我们不能确定作为Source的对象叫什么名字的时候 ...
- pyspark启动与简单使用----本地模式(local)----shell
在Spark中采用本地模式启动pyspark的命令主要包含以下参数:–master:这个参数表示当前的pyspark要连接到哪个master,如果是local[*],就是使用本地模式启动pyspark ...
- 【CSS复合选择器、元素显示模式、背景】前端小抄(3) - Pink老师自学笔记
[CSS复合选择器.元素显示模式.背景]前端小抄(3) 本学习笔记是个人对 Pink 老师课程的总结归纳,转载请注明出处! 一.CSS的复合选择器 1.1 什么是复合选择器 在 CSS 中,可以根据选 ...
- assign()与create()的区别
Q:assign()与create()的区别? A:let obj = Object.assign(targetObj, -sourceObj) 作用:将一个或多个源对象自身的可枚举属性与目标对象的属 ...
- Linux命令集锦之·正则表达式
时间:2018-11-15 记录:byzqy 正则表达式与通配符: 正则表达式,用来在文件中匹配符合条件的字符串,正则是包含匹配. grep.awk.sed 等命令可以支持正则表达式. 通配符,用来匹 ...
- jquery mobile常用的data-role类型
data-role参数表: page 页面容器,其内部的mobile元素将会继承这个容器上所设置的属性 header 页面标题容器,这个容器内部可以包含文字.返回按钮.功能按钮等 ...
- Spring系列之事物是如何管理的
前言 我们都知道Spring给我们提供了很多抽象,比如我们在操作数据库的过程中,它为我们提供了事物方面的抽象,让我们可以非常方便的以事物方式操作数据库.不管你用JDBC.Mybatis.Hiberna ...
- MySQL-SQL基础
mysql> use test; Database changed mysql> create table emp(ename varchar(10),hirdate date,sal d ...
- 分布式技术专题-分布式协议算法-带你彻底认识Paxos算法、Zab协议和Raft协议的原理和本质
内容简介指南 Paxo算法指南 Zab算法指南 Raft算法指南 Paxo算法指南 Paxos算法的背景 [Paxos算法]是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息 ...
- 20210717 noip18
考前 从小饭桌出来正好遇到雨下到最大,有伞但还是湿透了 路上看到一个猛男搏击暴风雨 到了机房收拾了半天才开始考试 ys 他们小饭桌十分明智地在小饭桌看题,雨下小了才来 考场 状态很差. 开题,一点想法 ...