- 博客(21)
- 问答 (1)
- 收藏
- 关注
原创 【Mysql】事务的实现原理
如果trxId==创建事务id,说明数据是这个事务更改的,如果trx预分配id,则不可以访问,因为这个事务是在readview创建后提交的,如果在min和max之间且属于活跃id,也不可以访问。1.当前活跃的事务ids,2.最小活跃事务Id,3.预分配事务id,4.创建这个readview的事务id。看一下undolog版本链,undolog记录了同一个事务和不同事务的修改信息,生成一条链表,链表头部是最新数据,尾部是最旧数据。rowId是没有主键时自动生成的。
2025-01-13 17:43:10
561
原创 【JUC】wait/notify
当owner里的线程长时间占用cpu,但是它不满足解锁的条件,于是可以调用wait()方法,于是进入waitset,状态也调整为waiting。而entrylist里blocked的线程就从此刻被唤醒,竞争owner。我之前写过sychronized的原理,讲到了monitor里的owner和entrylist。当owner里的线程调用notify()的时候,waitset里waiting的线程被唤醒,进入entrylist重新竞争。一个是在waitset中随机挑一个唤醒,一个是在waitset全部唤醒。
2025-01-03 22:23:04
216
原创 【JUC】synchronized
等到thread1运行结束,和monitor的owner断开关联,于是monitor的entrylist中的线程被唤醒开始竞争,竞争成功的线程成为monitor的owner。当thread1调用sychronized给对象加锁,该对象头的markword就会指向monitor对象(java对象关联上monitor对象),markword的锁状态由01变成10,并且monitor的owner变成thread1。a锁的是静态方法即整个类,而b锁的是this,所以锁的不是同一个对象,不存在互斥。
2024-12-16 16:18:52
884
原创 【黑马RabbitMQ】MQ高级
比如用户下单后订单状态改变对可靠性有要求。(不能下单后订单状态不变)所以要保证发送的消息至少消费一次。消息可能丢失的地方:发送的过程、MQ处理、消费者接受消息的过程。因此我们要解决这三个地方的可靠性问题。
2024-12-09 15:31:08
568
原创 【Easy云盘】Day3 视频切割、文件预览
利用ffmpeg切割视频,先将视频转成ts格式,再将ts文件切割成多个ts文件,再生成m3u8索引文件(用于描述切片序列和播放顺序)。切割的好处:流式播放,实现边看边加载。最后将一开始转成的ts文件删除。第一次根据视频文件名称拼接出获取m3u8文件。之后跟据m3u8按序读取ts文件。缩略图的原理就是将图片的尺寸调小以及压缩图片。依旧使用FFmpeg的命令实现。根据图片后缀生成对应的 Content-Type,以便浏览器正确显示图片。使用 readFile 方法将图片数据从服务器传输到客户端。
2024-12-03 19:29:33
356
原创 【Easy云盘】Day2 文件秒传、分片上传、异步合并
session存储的用户信息,fileId(传第一个分片的时候没有,由代码生成,传其它分片的时候使用),file,filename,fileMd5(验证文件使用),chunkIndex(第几个分片),chunks(分片数)新建fileinfo文件表(用户id,文件id,文件类型(文件或文件夹),父级id,文件md5,文件大小,名称,路径,文件种类,状态(上传中,上传失败,已上传),删除标记(未被删除,在回收站中,彻底删除),回收时间)更新头像:判断头像文件夹是否存在,不存在就创建,然后新建头像文件。
2024-12-02 18:49:40
876
原创 【Easy云盘】Day1 生成验证码、邮箱发送验证码、用AOP实现拦截器和参数校验
登陆上传文件(断点续传、大文件的分片上传、秒传、文件预览)文件分级、文件删除、文件下载、文件移动、回收站还原分享文件(被分享到的文件可以保存到自己的网盘,如果是自己分享的文件就不需要,可以取消分享)管理员:用户管理(分配空间)
2024-11-29 16:07:17
896
原创 【Spring注解】@Retention
是 Java 中的元注解,用于指定注解的保留策略。它定义了注解在编译后的生命周期,以及可以通过何种方式访问它。
2024-11-29 14:39:27
206
原创 【BUG记录】redis一直连接不到服务器
买了服务器,准备连一下redis,但是每次都是连到本地的redis服务器上。redis没有放在spring底下。修改成下面这样就可以了。
2024-11-27 17:15:43
236
原创 【苍穹外卖】Day01-03 用户登陆、Swagger、ThreadLocal、公共字段自动填充、OSS
当项目上线后可能有多个后端服务器,这个时候利用nginx作为负载均衡器,将前端请求合理分发给不同的后端服务器。根据用户名查询数据库的用户信息,如果不存在,抛出异常,如果存在,进行密码比对,查看是否被锁定。利用Nginx反向代理,前端将请求发送给Nginx,Nginx再发送给后端tomcat服务器。Nginx可以缓存后端的数据,在第二次发送同一个请求时,无需再次访问后端。每个请求是一个线程,每个线程有自己的存储空间,即ThreadLocal。保证后端服务安全,后端服务器放在公司内网,前端无法直接请求后端。
2024-11-25 19:33:55
1883
原创 【JUC】Day1线程基础
同时线程里是指令流,将一条条指令交给CPU,各个线程处理不同的任务。一个类去实现这个runnable接口,重写run方法,再将这个类作为参数传入thread的构造器,创建thread实例后start。在单核CPU下,如果有两个任务A、B,并发的情况是CPU先处理一部分A,再处理一部分B,反复交替。对于依赖性任务,如果任务之间存在强依赖性(例如需要等待前一个任务的结果),并行化可能导致资源浪费。在多核CPU下,可以实现真正的并行。并行是多个CPU同时运行,并发是多个线程使用一个CPU。
2024-11-21 17:09:20
418
原创 【redis】原子性的实现--lua脚本
Lua 脚本可以将多条 Redis 命令写在一个脚本中。Redis 会将这个脚本作为一个整体执行,确保脚本内的所有命令是原子操作。脚本会检查 Redis 中的键是否等于传入的值,如果相等,则删除该键。
2024-10-25 19:20:41
332
原创 【秒杀】超卖和一人一单的问题
在高并发情况下,由于查询库存和减库存之间存在时间差异,导致查询的数据不是真正的数据,导致的问题。在修改数据的同时查询数据:如果查询到的数据和之前查询到的数据一致,库存减1,新增订单。但是会产生问题,多个线程同时查询的数据都是已经被修改的数据,所以大量线程会执行失败。和超卖不同,一人一单是插入不存在的数据而不是修改数据,因此不适用于乐观锁。在扣减库存之前判断当前用户是否已存在当前订单。仍然会出现并发问题。因此需要修改策略:判断库存是否大于0。使用悲观锁解决并发问题。
2024-10-25 16:25:27
178
原创 <c++>pat乙级 1014 福尔摩斯的约会
大侦探福尔摩斯接到一张奇怪的字条:我们约会吧!3485djDkxh4hhGE2984akDfkkkkggEdsbs&hgsfdkd&Hyscvnm大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间星期四 14:04,因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母 D,代表星期四;第 2 对相同的字符是 E ,那是第 5 个英文字母,代表一天里的第 14 个钟头(于是一天的 0 点到 23 点由数字 0 到 9、以及大写字母 A 到 N 表示)
2021-12-01 21:02:57
86
原创 <c++>pat乙级 1015德才论
宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。”现给出一批考生的德才分数,请根据司马光的理论给出录取排名。输入格式:输入第一行给出 3 个正整数,分别为:N(≤10的5次方),即考生总数;L(≥60),为录取最低分数线,即德分和才分均不低于 L 的考生才有资格被考虑录取;H(<100),为优先录取线——德分和才分均不低于此线的被定义为“才德全尽”,此类考
2021-12-01 16:17:23
87
原创 <c++> int转string的方法
int转string的方法做pat乙级1002 的时候看柳神用到了to_string的方法,但发现我的devcpp版本不能用,于是找了其它的方法。#include<bits/stdc++.h>using namespace std;int main() {int a = 135;stringstream ss;ss<<a;string s1 = ss.str();cout<<s1;}...
2021-11-29 20:12:08
452
空空如也
想问下各位,为什么测试点过不去
2021-12-01
TA创建的收藏夹 TA关注的收藏夹
TA关注的人