首页 > 其他分享 >接口查询性能优化-缓存

接口查询性能优化-缓存

时间:2023-08-28 21:45:47浏览次数:43  
标签:缓存 数据库 接口 查询 key mybatis 分布式

查询性能优化

  • 缓存种类

    • mybatis一级缓存

    • mybatis二级缓存

    • 本地缓存

      • 各个节点的数据不同步

    • 分布式缓存

      • redis

    • 前端h5的缓存

      • 本地缓存

      • session缓存

  • mybatis一级缓存

    • 一个方法中对同一个sql,查询了多次

    • 当在这个方法上加@transactional

    • 后续的查询就是走一级缓存,不会查数据库。

    • 关闭一级缓存

    • mybatis.configuration.local-cache-scope=statement
  • mybatis二级缓存

    • 默认是没有开启的

    • 在多次接口调用时的缓存,后几次请求就走缓存

    • 缓存的类要序列化

    • 加cache标签就行了

    • 有增删改的时候缓存会刷新

    • 缺点:刷新快的场景不适合用,分布式场景:执行增删改的时候,没有被执行的机器,还会读之前的数据。

  •  springboot内置的缓存

  • redis
  • 缓存击穿

    • 热点key失效,都打到数据库了

      • 60s失效

        • 定时任务刷新缓存60s

      • 如果缓存坏了

        • 分布式锁,

        • 只有一个线程能查询数据库。

        • 没有锁的就快速失败。

        • 有上千个获取锁的请求

    缓存穿透

    • if(有数据){ 返回}else{ 查询数据库,写入缓存}

      • 这样就有上千个请求打到数据库

      • 这样就有上千个请求打到数据库

      • 解决办法

        • else里加分布式锁,其他快速失败

        • 空列表也方缓存,null;null则去数据库查,空列表则直接返回,不查数据库。

雪崩

  • 多个key同时失效

    • 热点key大量失效

      • 如果设置成不过期

      • 则需要设置缓存过期策略

    • 最好的办法是把所有的key打散

    • 定时任务主动查询进行打散

    • 查询时也要针对事务加锁。

      • ​加锁的外面也要加个限流

 

 

标签:缓存,数据库,接口,查询,key,mybatis,分布式
From: https://www.cnblogs.com/jiangym/p/17619128.html

相关文章

  • MySQL 分析查询与来源机器
    当前分析针对版本:MariaDB10.5线上出现报错:can'tcreatemorethanmax_prepared_stmt_countstatements。造成这个错误的直接原因就是同时开启了prepare句柄太多导致的,所以比较直接的方式是调大参数,首先查看设置的值:showglobalvariableslike'max_prepared_stmt_count';......
  • 查询SQL Server数据库执行时间最长的sql语句
    SELECT(total_elapsed_time/execution_count)/1000N'平均时间ms',total_elapsed_time/1000N'总花费时间ms',total_worker_time/1000N'所用的CPU总时间ms',total_physical_readsN'物理读取总次数',total_logical_reads/execution_countN'每次......
  • 使用autofac注册继承特定接口的类或接口
    publicclassMyModule:Module{///<summary>//////</summary>///<paramname="builder"></param>protectedoverridevoidLoad(ContainerBuilderbuilder){//扫描程序集中所有继承自ITransientDepend......
  • Python查询Prometheus API
     #!/bin/python#-*-coding:utf-8-*-importpandasaspdimportrequests,time,redefgetcolumn(status):iffloat(status)<80:return"正常"#eliffloat(status)<2:#return"异常"else:......
  • Redis缓存高可用集群(3.1)
    1、Redis集群方案比较哨兵模式在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况......
  • 实用指令_实操作_磁盘查询实用指令
    磁盘情况查询查询系统整体磁盘使用情况基本语法df-h应用实例查询指定目录的磁盘占用情况基本语法du-h/目录​ 查询指定目录的磁盘占用情况,默认为当前目录​ -s指定目录占用大小汇总​ -h带计量单位​ -a含文件​ --max-depth=1子目录深度​ -c列出明......
  • 关于在oracle查询密集的情况下OOM问题
    线上tomcat运行内存设置为4G,在用户使用密集的情况下oom。通过内存分析工具(MAT)得到结果如下: 应当是SQL查询结果过大导致,但是SQL查询返回结果并不大。实际查询结果非常小,只有一条数据,但是SQL较为复杂,关联的表较多。使用的是oracle提供的jdbc驱动包,在查询的时候会使用defineCh......
  • python+playwright 学习-77 playwright 发送接口请求APIRequestContext
    前言每个Playwright浏览器上下文都有与其关联的APIRequestContext实例,该实例与浏览器上下文共享cookie存储,可以通过browser_context.request或page.request访问。也可以通过调用api_request.new_context()手动创建一个新的APIRequest上下文实例。通过浏览器发请求可以通过browser......
  • 如何调用api接口获取到商品数据
    要调用API接口获取商品数据,需要进行以下步骤:确定API接口首先需要确定要使用的API接口,可以通过搜索引擎或者相关文档来查找适合的API接口。以淘宝开放平台为例,可以使用淘宝的商品信息查询API接口来获取商品数据。注册API账号并获取API密钥要使用API接口,需要先在API平台上注册一个账......
  • 【Ehcache技术专题】「入门到精通」带你一起从零基础进行分析和开发Ehcache框架的实战
    缓存大小的设置缓存大小的限制可以设置在CacheManager上,也可以设置在单个的Cache上。我们可以设置缓存使用内存的大小,也可以设置缓存使用磁盘的大小,但是使用堆内存的大小是必须设置的,其它可设可不设,默认不设就是无限制。在设置缓存大小的时候,我们可以设置缓存使用某一个存储器的最......