遇到缓存问题

news2025/1/11 16:22:03

问题:在事务中在进行数据库查询所有的数据后,将其中的数据更改几个后,重新进行查询。发现此时返回的数据并不是修改之后的数据。

经过学习后发现是Mybatis的一级缓存问题,同时也了解的Mybatis的二级缓存:

Mybatis一级缓存:

  • 当在一个方法中执行多次,查询同一个sql语句的命令的方法

    • 当不加事务的时候执行sql,执行完之后会话就会结束,一级缓存就会消失。

    • 当加事务的时候,一级缓存不会消失,再次查询同一个sql的时候(参数也得一样)就会使用前面查出的数据。

  • 一级缓存可以帮助我们减少重复的数据库查询

  • 缺点:但是当我们第一次查询之后对相关数据进行更改后,依旧会得到一级缓存的数据

    • 解决方式:将一级缓存关闭在配置文件中

    • 参数:statement:sql语句 session:会话 默认为会话,换为statement则每执行一个sql本地缓存就清空

      mybatis.configuration.local-cache-scope=statement

Mybatis二级缓存:

多次执行同一个sql,如果二级缓存生效则只执行一次(适合读多写少的接口,比如查询所有车次接口和查询所有车站接口)

如何开启:在mapper.xml中在需要开启的sql下加入<cache></cache>即可。同时需要将实体类做一个序列化

失效:对同一个namespace做增删改操作时二级缓存就会清空

序列化:实现Serializable接口

  • 当一个类需要保存起来,下次再还原成类是就需要序列化,或者需要远程传输,比如放到redis里,也需要序列化

  • 缺点:当有多个节点时,都执行了二级缓存查找,当进行删除命令时只会进入到一个节点去删除,那么数据就会改变。而另一个节点并不知道,拿原来的数据导致数据不一致问题。

接着对Springboot的内置缓存以及redis进行了学习

springboot内置缓存

引入依赖,在各模块添加注解@EnableCaching,开启缓存,在需要开启事务的方法上添加@Cacheable(value = "t")//注解。value为缓存的名字。

相当于开辟了一块空间,根据不同的请求参数,空间内会缓存多个结果,会根据请求参数生产一个key,需要对请求参数生产hashcode和equals方法,用于生产key。

根据不同的参数重写hashCode()与equals()方法。

强制刷新缓存方法 @CachePut,每次去数据库中查找,查完会将结果放到缓存中去。

实现:将两个方法结合

程序去查询queryList()方法,自动读取缓存。当数据发生变化时主动执行queryList2()强制刷新同一缓存名区的值,将数据放到缓存里面去。

问题:但是并没有设置缓存的过期时间。存在多台缓存的问题。

集成redis:

第一行为将spring的cache放在redis中,

接着两行为放在redis中的key的前缀(防止多个项目冲突)

接着一行为是否可以为空

最后一行为设置redis缓存为60s

将类放到redis中,有一个远程传输的动作,对类进行远程传输就需要将类进行序列化

redis解决问题:

  1. 高性能:提高访问速度,mysql单机版QPS约为2000,redis为10万

  2. 数据的持久化:解决多节带你共享缓存,机械重启也不会丢失数据

缓存击穿与解决方案:

在抢票功能中,很可能出现。

缓存击穿:热点的一个key失效,大量的请求直接访问数据库,导致数据库压力增大

解决方案:

  1. (解决缓存超时问题)主动刷新缓存。假设时间为60s,当时间快到时我们可以主动调用@CachePut注解中的方法,主动刷新缓存时间(定时任务)。

  2. (如果缓存直接失效:比如缓存机器换了,热点key突然没有了)使用分布式锁,只让一个请求拿到锁并查询数据库,其他请求都失败,告诉其他用户稍后等待。

缓存穿透与解决方案:

第一步:判断当前缓存是否有数据

  • 没有则去数据库去读取->数据库中也没有数据就会造成缓存穿透的问题

  • 有则直接返回数据

解决方案:

  1. 分布式锁,100个请求只能让一个请求进入

  2. 如果查询到空列表,那么也将其放到缓存中去。在第一步中区分null和[] 如果是null去数据库中查,如果是[]就不去数据库中查找(允许缓存为空)。

缓存雪崩与解决方案:

缓存雪崩:由于短时间内,大量的key失效,导致数据库压力剧增。

常见缓存过期策略:

  1. TTL 超时时间

  2. LRU 最近最少使用

  3. LFU 最近最不经常使用

  4. FIFO先进先出

  5. Random 随机淘汰策略

解决方案:

  1. 将热点KEY主动打散 :定时任务将热点KEY主动刷新 超时时间再加上一个随机值

  2. 给接口限流,让访问数不过大

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1969051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud网关 SpringBoot服务 HTTP/HTTPS路由/监听双支持

背景 一般来说SpringCloud Gateway到后面服务的路由属于内网交互&#xff0c;因此路由方式是否是Https就显得不是那么重要了。事实上也确实如此&#xff0c;大多数的应用开发时基本都是直接Http就过去了&#xff0c;不会一开始就是直接上Https。然而随着时间的推移&#xff0c…

WebGoC题解(16) 386.山洞

题目描述 小C和弟弟一起参观影视城&#xff0c;发现里面有m个圆形排列的“小山洞”&#xff0c;山洞用半径20、颜色号为编号的圆表示&#xff0c;由边长是100的线连接&#xff0c;均匀的发布一圈&#xff08;1号洞在正上方&#xff09;。m为8时如下图&#xff1a; 小C跟弟弟提议…

点赞10W+,销售额上百万,如何搭上奥运的流量快车?

2024巴黎奥运会正如火如荼进行中。一边是紧张的赛事与各种抓马事情&#xff0c;一边是法国的浪漫与中国00后的松弛&#xff0c;这届奥运会的看客仿佛瓜田里的猹&#xff0c;忙得不可开交。 作为全球范围内的重大体育盛事&#xff0c;奥运会一直以来都备受公众的热烈关注。 据腾…

Python PDF处理技巧 - 加密和解密PDF

目录 安装Python PDF库 使用Python加密PDF 使用Python设置PDF的安全权限 使用Python解密PDF PDF文档在我们的个人生活和工作中扮演着重要角色。从机密的商业报告到敏感的个人记录&#xff0c;PDF广泛应用于存储和共享重要信息。然而&#xff0c;随着数据泄露和未经授权访问…

facebook脸书登入协议分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;若有侵权&#xff0c;请添加&#xff08;wx&#xff1a;wyqlxl99&#xff09;联系删除 前言: 前段…

MuRF代码阅读

对图像Size的处理, 以适应Transformer 在MVSPlat 当中使用 Center_Crop 裁剪图像&#xff0c;适用于 Transformer 的32 倍数&#xff0c; 其中 焦距 f 不变化&#xff0c;只改变 cx,cy.MuRF 直接对图像进行 插值&#xff0c;合成理想的 size. 根据 ori_size 和 inference_size…

恒驰快讯丨恒驰受邀出席华为云数据库专题销售伙伴思享会

7月25日下午&#xff0c;华为云数据库专题销售伙伴思享会在上海成功落幕。 本次华为云数据库专题销售伙伴思享会&#xff0c;汇集了优秀伙伴、华为云产品专家70人&#xff0c;共同见证了一场关于数据库前沿技术、市场趋势和应用实践的深入交流盛会。上海恒驰信息系统有限公司&a…

【Linux网络编程】套接字Socket

网络编程基础概念&#xff1a; ip地址和端口号 ip地址是网络协议地址&#xff08;4字节32位&#xff0c;形式&#xff1a;xxx.xxx.xxx.xxx xxx在范围[0, 255]内&#xff09;&#xff0c;是IP协议提供的一种统一的地址格式&#xff0c;每台主机的ip地址不同&#xff0c;一个…

【赛事】2024第五届“华数杯”全国大学生数学建模竞赛

为了培养学生的创新意识及运用数学方法和计算机技术解决实际问题的能力&#xff0c;天津市未来与预测科学研究会、中国未来研究会大数据与数学模型专业委员会&#xff08;协办&#xff09;决定举办华数杯全国大学生数学建模竞赛。竞赛的目标是为培养大学生的科学精神及运用数学…

精准识别,无缝转换:2024年顶尖语音转文字技术展示

高效、准确的信息传递与处理成为了我们工作与生活中的重要需求。随着科技的飞速发展&#xff0c;一项革命性的技术——语音转文字软件应运而生。掌握这项技术就能提高工作效率创造更多价值。 1.365在线转文字 链接传送&#xff1a;www.pdf365.cn/ 这个方式虽然不是软件&am…

《四季之歌:春溪潺潺、夏林舞动、秋山守望、冬夜温光》

在这个喧嚣的世界里&#xff0c;有时我们会渴望逃离&#xff0c;去寻找那些安静而纯净的自然角落。每个季节都有它独特的魅力&#xff0c;它们像是大自然精心谱写的交响乐章&#xff0c;我们只需细心聆听&#xff0c;就能感受到四季变换带来的无尽奇境。 春天的序曲&#xff0c…

政企互动 | 南京市雨花台区委副书记王金玉一行莅临聚铭网络视察指导

7月30日&#xff0c;南京市雨花台区委副书记王金玉一行领导莅临聚铭网络进行实地考察与指导。聚铭网络总经理唐开达先生热情接待&#xff0c;双方就聚铭网络的发展现状、业务规模及未来规划展开了深入而愉快的交流。 在唐开达总经理的悉心陪同下&#xff0c;王书记一行深入聚铭…

前后端完全分离实现登录和退出

前后端分离的整合 使用springsecurity前端项目redis完成认证授权的代码 1. 搭建一个前端工程 使用 vue ui搭建&#xff0c;使用webstrom操作 2. 创建一个登录页面 <template><div class"login_container"><!-- 登录盒子 --><div class"l…

深度学习中五种归一化原理

调用库API实现以及手写实现 import torch import torch.nn as nnbatch_szie2 #sample time_steps3 embedding_dim4 #channel num_group2inputxtorch.randn(batch_szie,time_steps,embedding_dim)# N*L*C 批归一化 BatchNorm1d ## 1. 批归一化 实现batch_norm并验证API --…

2024年钉钉杯大学生大数据挑战赛倒计时,最后冲刺

2024第三届钉钉杯大学生大数据挑战赛倒计时&#xff0c;小编给大家带来非常实用的最后冲刺助力【A题】&#xff0c;&#xff08;看图资料预览&#xff09;&#xff1a; 中国烟草行业作为国家税收和财政收入的重要支柱&#xff0c;近年来销售收入持续增长。国家对此实行严格的专…

C++跳跃表个人理解

一、概念 跳跃表是一种基于有序链表的扩展&#xff0c;简称跳表&#xff0c;其就是使用关键节点作为索引的一种数据结构。 可以通过以下方式更快查找到有序链表的某一节点&#xff1a; 利用类似索引的思想&#xff0c;提取出链表中的部分关键节点。比如&#xff0c;给定一个…

C语言 ——— 指针笔试题(中篇)

指针加减整数和解引用的笔试题 笔试题1&#xff1a; int a[5][5]; int(*p)[4]; p a;printf("%p %d", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);问&#xff1a;打印的结果为&#xff1f;&#xff08;分别以 %d 和 %p 的形式打印&#xff09; …

十六、maven git-快速上手(智慧云教育平台)

&#x1f33b;&#x1f33b; 目录 一、概述及项目管理工具介绍1.1 项目介绍1.2 maven 介绍及其配置1.2.1 maven 介绍1.2.2 maven 下载与配置 1.3 pom 中常见标签的使用1.4 后端项目环境的搭建1.5 Git 简介1.6 Git 的基本使用1.6.1 码云的注册与仓库创建1.6.2 上传代码到码云仓库…

【2024】InfluxDB v2 介绍和安装使用(1)

目录&#x1f4bb; 一、介绍1、时序数据库介绍特点&#xff1a;常见的时序数据库时序库受欢迎度排名 2、InfluxDB介绍**InfluxDB 1.x 和 2.0 的主要区别**InfluxDB行协议 二、docker安装 InfluxDB v2三. Web UI常用功能介绍以及使用1、页面介绍2、功能使用2.1、创建bucket2.2、…

如何设计一个测试用例

前言&#x1f440;~ 上一章我们介绍了什么是软件测试以及软件测试的一些基础概念&#xff0c;今天来聊聊如何设计一个测试用例&#xff0c;涉及到黑盒测试的测试方法 基于需求进行测试用例的设计 基于需求的具体设计方法 等价类 边界值 判定表法 正交表法 场景设计法 …