SpringBoot引入缓存提高单次查询数据效率

这篇具有很好参考价值的文章主要介绍了SpringBoot引入缓存提高单次查询数据效率。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第1步:引入缓存上下文

import com.zhangziwa.practisesvr.model.Student;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

import static org.apache.commons.lang3.ObjectUtils.anyNull;

public class StudentContextHolder {
    private static final ThreadLocal<Map<Integer, Student>> studentContextHolder = ThreadLocal.withInitial(HashMap::new);

    public static Student getStudent(Integer id) {
        if (Objects.isNull(id)) {
            return null;
        }
        return studentContextHolder.get().get(id);
    }

    public static void setStudent(Integer id, Student student) {
        if (anyNull(id, student)) {
            return;
        }
        if (getStudent(id) != null) {
            throw new UnsupportedOperationException("Student with id " + id + " already exists.");
        }
        studentContextHolder.get().put(id, student);
    }

    public static void clear() {
        studentContextHolder.remove();
    }
}

第2步:查询先查缓存,查询到值先存缓存

public Student queryById(Integer id) {
    if (Objects.isNull(id)) {
        return null;
    }
    
    // 线程缓存里去
    Student student = StudentContextHolder.getStudent(id);
    if (nonNull(student)) {
        return student;
    }
    
    student = studentsMapper.queryById(id);
    
    // 查询数据库值先存缓存
    StudentContextHolder.setStudent(id, student);
    
    return student;
}

第3步:清理缓存上下文

public class ResponsePostInterceptor implements HandlerInterceptor {

    //在Controller执行之前调用,如果返回false,controller不执行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.err.println("***ResponsePostInterceptor.preHandle***");
        return true;
    }

    //controller执行之后,且页面渲染之前调用
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.err.println("***ResponsePostInterceptor.postHandle***");
    }

    //页面渲染之后调用,一般用于资源清理操作
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.err.println("***ResponsePostInterceptor.afterCompletion***");
        StudentContextHolder.clear(); //  清除student上下文
    }
}

第4步:验证使用

@GetMapping("{id}")
public ResponseEntity<Student> queryById(@PathVariable("id") Integer id) {
    System.out.println("***StudentController.queryById***");
    
    Student body = studentService.queryById(id);
    System.out.println(body);
    
    System.out.println(studentService.queryById(id));
    
    return ResponseEntity.ok(body);
}

执行日志文章来源地址https://www.toymoban.com/news/detail-829581.html

[2024-01-26 01:16:16.068_068] [WARN ] [http-nio-8080-exec-2] [LogFilter.java:21][LogFilter.doFilter: Start processing request at 2024-01-25T17:16:16.068132700Z - /students/8]
***LogFilter.doFilter.start***
***RequestHeaderCheckFilter.doFilter.start***

***ResponsePostInterceptor.preHandle***
***LogInterceptor.preHandle***
[2024-01-26 01:16:16.094_094] [WARN ] [http-nio-8080-exec-2] [LogInterceptor.java:37][LogInterceptor.postHandle: Start processing request at 2024-01-25T17:16:16.094950300Z - /students/8]

***StudentController.queryById***
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3bfba234] was not registered for synchronization because synchronization is not active
[2024-01-26 01:16:16.128_128] [INFO ] [http-nio-8080-exec-2] [HikariDataSource.java:110][practisedb - Starting...]
[2024-01-26 01:16:16.248_248] [INFO ] [http-nio-8080-exec-2] [HikariPool.java:565][practisedb - Added connection com.mysql.cj.jdbc.ConnectionImpl@12e4ef1]
[2024-01-26 01:16:16.252_252] [INFO ] [http-nio-8080-exec-2] [HikariDataSource.java:123][practisedb - Start completed.]
JDBC Connection [HikariProxyConnection@688850212 wrapping com.mysql.cj.jdbc.ConnectionImpl@12e4ef1] will not be managed by Spring
==>  Preparing: select id, username, password, age, height, gender, class_id, is_delete from students where id = ?
***SqlExecuteInterceptor.intercept***
***SqlReadRowInterceptor.intercept***
==> Parameters: 8(Integer)
<==    Columns: id, username, password, age, height, gender, class_id, is_delete
<==        Row: 8, 汪子韬, lq2fks1eg5, 24, 161.84,, 5, 0
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3bfba234]
Student(id=8, username=汪子韬, password=lq2fks1eg5, age=24, height=161, gender=, classId=5, isDelete=false)

Student(id=8, username=汪子韬, password=lq2fks1eg5, age=24, height=161, gender=, classId=5, isDelete=false)

***ResponsePostAdvice.supports***
***ResponsePostAdvice.beforeBodyWrite***

***LogInterceptor.postHandle***
***ResponsePostInterceptor.postHandle***
***LogInterceptor.afterCompletion***
[2024-01-26 01:16:16.394_394] [WARN ] [http-nio-8080-exec-2] [LogInterceptor.java:57][LogInterceptor.postHandle: Finished processing request at 2024-01-25T17:16:16.393566400Z - /students/8 in 299 ms. Status code: 200]
[2024-01-26 01:16:16.413_413] [INFO ] [http-nio-8080-exec-2] [logUtils.java:70][{"traceId":"9287f21b215b49e19ed7fd94c9aed4e6","endDate":"2024-01-26T01:16:16.3972818+08:00[Asia/Shanghai]","cost":299,"remoteHost":"0:0:0:0:0:0:0:1","remoteAddr":"0:0:0:0:0:0:0:1","remotePort":12742,"method":"GET","requestURI":"/students/8","status":200,"requestContentLength":-1,"sqlCount":1,"sqlCost":31,"sqlSearchedRowCount":1,"currentThreadTime":109,"currentThreadUserTime":78,"currentThreadAllocatedBytes":20845224}]
[2024-01-26 01:16:16.419_419] [WARN ] [http-nio-8080-exec-2] [LogFilter.java:30][LogFilter.doFilter: Finished processing request at 2024-01-25T17:16:16.419516700Z - /students/8 in 351 ms. Status code: 200]
***ResponsePostInterceptor.afterCompletion***

***RequestHeaderCheckFilter.doFilter.end***
***LogFilter.doFilter.end***

到了这里,关于SpringBoot引入缓存提高单次查询数据效率的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【MySQL 数据库】6、一篇文章学习【索引知识】,提高大数据量的查询效率【文末送书】

    索引(index) 是帮助 MySQL 高效获取数据的数据结构(有序) 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是 索引 。 MySQL的索引是在存储引擎

    2024年02月08日
    浏览(67)
  • MyBatis缓存-提高检索效率的利器--一级缓存

    😀前言 本篇博文是关于MyBatis一级缓存的介绍使用和缓存失效情况分析,希望能够帮助到您😊 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博

    2024年02月14日
    浏览(46)
  • 互联网大厂技术-elasticsearch(es)- 在数据量很大的情况下(数十亿级别)提高查询效率

    互联网大厂技术-elasticsearch(es)- 在数据量很大的情况下(数十亿级别)提高查询效率 目录 一、问题分析 二、问题剖析 三、性能优化的杀手锏(filesystem cache) 四、数据预热 五、冷热分离 六、document 模型设计 七、分页性能优化 八、解决方案 这个问题是肯定要问的,说白了,就

    2024年02月04日
    浏览(78)
  • 查询效率至少提高4倍的MySQL技巧

    SQL语句中IN包含的值不应过多 MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select id from t where num in(1,2,3) 对于连续的数值,能用between就不要用in了;再或者使用连接来替

    2024年04月26日
    浏览(36)
  • Oracle之table()函数的使用,提高查询效率

    目录 一、序言 二、table()函数使用步骤 三、table() 具体使用实例 3.1 table()结合数组 使用 3.2 table()结合PIPELINED函数(这次报表使用的方式) 3.3 table()结合系统包使用 前段时间一直在弄报表,快被这些报表整吐了,然后接触到了Oracle的table()函数。所以今天把table()函数的具体用法

    2024年02月03日
    浏览(39)
  • 在PostgreSQL中如何实现分区表以提高查询效率和管理大型表?

    随着数据量的增长,单一的大型表可能会遇到性能瓶颈和管理难题。PostgreSQL的分区表功能允许我们将一个大型表分割成多个较小的、更易于管理的片段,称为分区。这不仅可以提高查询效率,还可以简化数据管理和维护。 1. 确定分区键 首先,我们需要确定一个或多个列作为

    2024年04月25日
    浏览(51)
  • 项目记录:利用Redis实现缓存以提升查询效率

    当我们查询所有数据时,如果缓存中没有,则去数据库查询,如果有,直接查缓存的数据就行。注意定期更新缓存数据。 BoundHashOperations是绑定键值的方法,意味着之后的操作都是对此键进行操作。 ObjectMapper类提供了一系列json序列化和反序列化的操作。 缓存更新操作是通过

    2024年02月03日
    浏览(47)
  • 【案例实战】SpringBoot整合Redis实现缓存分页数据查询

    正式观看本文之前,设想一个问题,高并发情况下,首页列表数据怎么做? 类似淘宝首页,这些商品是从数据库中查出来的吗?答案肯定不是,在高并发的情况下,数据库是扛不住的,那么我们要怎么去扛住C端大并发量呢,这块我们可以借助Redis,我们知道Redis是一个基于内

    2024年02月09日
    浏览(58)
  • 如何在数据中台中提高效率并节省成本?

    上节讨论了如何保障数据中台的数据质量,让数据“准”。除了“快”和“准”,数据中台还离不开“省”。随数据规模越来越大,成本越来越高,如不合理控制成本,还没等你挖掘出数据应用价值,企业利润就被消耗完。 能否做到精细化成本管理,关乎数据中台项目成败。

    2024年02月15日
    浏览(38)
  • 如何利用云计算提高大数据分析的效率

    大数据分析是指通过对大量、多样化的数据进行处理、清洗、分析、挖掘,以揭示隐藏的信息和知识的过程。随着数据的增长和复杂性,大数据分析的挑战也随之增加。云计算是一种基于互联网的计算资源分配和共享模式,可以提供大量的计算能力和存储空间。因此,利用云

    2024年04月16日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包