一.当采用reddis缓存的时候,如果同时,一万次访问,那么就会有10000次访问数据库所以就会对数据库造成巨大压力,这时候,就要用到线程

1.方法体上加锁(优点,防护住了并发锁,缺点降低了内存效率)

  /**
* 最简洁的高并发处理,但是,牺牲效率大
*
* @return
*/
public synchronized List<Student> selectAllStudent1() { // 字符串序列化器
RedisSerializer redisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(redisSerializer); /**
* 在高并发条件下,此处有问题,缓存穿透问题
*/
//查询关键字
List<Student> studentList = (List<Student>) redisTemplate.opsForValue().get("allStudents"); if (null == studentList) { //缓存为空,查询数据库
studentList = studentMapper.selectAllStudent(); //把数据库中查询出的数据,放入redis中
redisTemplate.opsForValue().set("allStudents", studentList);
} return studentList;
}

2.加双锁

 /**
* 双锁的提高效率版本
*
* @return
*/
@Override
public List<Student> selectAllStudent() { // 字符串序列化器
RedisSerializer redisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(redisSerializer); /**
* 在高并发条件下,此处有问题,缓存穿透问题
*/
//查询关键字
List<Student> studentList = (List<Student>) redisTemplate.opsForValue().get("allStudents"); if (null == studentList) {
//因为spring中的对象都是单例模式的,所以,直接对对象加锁
synchronized (this) {
// 从redis获取一下
studentList = (List<Student>) redisTemplate.opsForValue().get("allStudents");
if (null == studentList) {
System.out.println("查询数据库*******************");
//缓存为空,查询数据库
studentList = studentMapper.selectAllStudent(); //把数据库中查询出的数据,放入redis中
redisTemplate.opsForValue().set("allStudents", studentList);
} else {
System.out.println("查询缓存*******************");
}
}
} else {
System.out.println("查询缓存*******************");
} return studentList;
}

二.Controller中加线程池进行效验

 /**
* Redis测试,完善好的高并发
*
* @return
*/
@GetMapping("/student/selectAllStudent")
public Object selectAllStudent() { //线程,该线程,调用底层查询所有学生方法
Runnable runnable = new Runnable() {
@Override
public void run() {
studentService.selectAllStudent();
}
}; //多线程测试穿透问题
ExecutorService executorService = Executors.newFixedThreadPool(25); for (int i = 0; i < 10000; i++) {
executorService.submit(runnable);
} return studentService.selectAllStudent();
}

三.源码地址

https://github.com/liushaoye/02-transaction/tree/reddis

IntelliJ IDEA 2017版 spring-boot2.0.4+mybatis+Redis处理高并发,穿透问题的更多相关文章

  1. Spring Boot2.0之 整合Redis集群

    项目目录结构: pom: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:// ...

  2. Spring Boot2.0之 整合Redis事务

    Redis事物 Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命 ...

  3. Spring Boot2.0之整合Redis

    需要的maven依赖 jar包,是对Jedis的封装 maven依赖: <project xmlns="http://maven.apache.org/POM/4.0.0" ...

  4. IntelliJ IDEA 2017版 spring-boot 2.0.5 邮件发送简单实例 (三)

    一.搭建SpringBoot项目 详见此文:https://www.cnblogs.com/liuyangfirst/p/8298588.html 注意: 需要添加mail依赖的包,同时还添加了lom ...

  5. IntelliJ IDEA 2017版 spring-boot 2.0.3 部署war包项目和jar包项目

    1.建立项目 Java Controller package com.springboot.jsp.controller; import org.springframework.stereotype. ...

  6. IntelliJ IDEA 2017版 spring-boot 2.0.3 邮件发送搭建,概念梳理 (二)

    第二部分 邮件发送历史   一.第一封邮件   1.1969年10月,世界上的第一封电子邮件    1969年10月世界上的第一封电子邮件是由计算机科学家Leonard K.教授发给他的同事的一条简短 ...

  7. IntelliJ IDEA 2017版 spring-boot 2.0.3 邮件发送搭建,概念梳理 (一)

    邮件发送功能总结        第一部分 背景   一.使用场景 (1)注册验证    注册各大网站,通常需要输入邮件地址,在注册成功后,会发送一封邮箱验证的邮件,点击确认,证明这个邮箱是用户自己的 ...

  8. 【redis】在spring boot2.0中使用redis的StringRedisTemplate 自动注入@Autowired

    1.使用opv.increment 达到增量的效果[判断某个用户 是第几次做这种操作] @RequestMapping("createCode") @RestController ...

  9. Spring Boot2.0 设置拦截器

    所有功能完成 配置登录认证 配置拦截器 在spring boot2.0 之后 通过继承这个WebMvcConfigurer类 就可以完成拦截 新建包com.example.interceptor; 创 ...

随机推荐

  1. 超强、超详细Redis入门教程【转】

    这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ...

  2. MYSQL分析慢查询

    mysql慢查询的日志文件路径一般为: /var/lib/mysql/slowquery.log,具体的路径可以通过mysql配置文件(/etc/my.cnf)查询,slow_query_log_fi ...

  3. MBP 使用笔记

    1.svn下载指令(终端) svn checkout https://svn.openslam.org/data/svn/gmapping 参考:http://blog.csdn.net/q19910 ...

  4. vue2.0跨域携带cookie和IE兼容

    /*vue-resource为了跨域获取到cookie做的操作*/ 1vue-resource跨域问题Vue.http.interceptors.push(function(request, next ...

  5. python3.6.5 路径处理与规范化

    在Linux和Mac平台上,该函数会原样返回path,在windows平台上会将路径中所有字符转换为小写,并将所有斜杠转换为饭斜杠. >>> os.path.normcase('c: ...

  6. django rest framework restful 规范

    内容回顾: . django请求生命周期 -> 执行遵循wsgi协议的模块(socket服务端) -> 中间件(路由匹配) -> 视图函数(业务处理:ORM.模板渲染) -> ...

  7. PAT 1027 打印沙漏(20)(思路)

    1027 打印沙漏(20)(20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ***** *** * *** ***** 所谓& ...

  8. hdu 1983(BFS+DFS) 怪盗Kid

    http://acm.hdu.edu.cn/showproblem.php?pid=1983 首先,题目要求出口和入口不能封闭,那么,只要把出口或入口的周围全给封闭了那盗贼肯定无法成功偷盗,出口或入口 ...

  9. fedora25的免密码rsync服务配置

      目标:实现免密同步数据: 1.安装rsync包: 2.手工添加配置文件: cat  /etc/rsyncd.conf # See rsyncd.conf man page for more opt ...

  10. Luogu 2173 [ZJOI2012]网络 - LCT

    Solution $LCT$ 直接上$QuQ$ 注意$cut$ 完 需要 $d[u + c * N]--$ 再  $link$,  不然会输出Error 1的哦 Code #include<cs ...