- 博客(129)
- 收藏
- 关注
原创 马丁短链03用户信息脱敏
因为如果给前端做,请求返回数据之后未脱敏,只在网页显示上脱敏,攻击者可以做一些简单请求直接看到返回信息,只能防一些小白。所以要在服务器这里做。
2024-08-01 18:45:41
73
原创 马丁短链02异常码 异常拦截器
比如你捕获了一个runtime exception,但是你并不知道具体是什么错误,也就不知道要用哪一个具体的异常码(上面设计的),所以这里自定义详细异常以对应不同的异常码,这样拦截器捕获什么自定义异常就返回什么对应异常码。示例:客户端异常,,构造是1.只自定义一个错误码 2.可以自定义信息 + 默认一级宏观客户端错误码 3. 自定义信息 + 具体客户端错误码 4.什么都要。自定义一个抽象全局异常,然后三大类异常(分别对应三类异常码)继承抽象异常。A客户端异常 B服务端异常 C远程调用异常。
2024-08-01 18:09:10
105
原创 马丁短链系统01
shortlist-all分成三大模块:后台管理admin,生成短链project,网关gateway。一般用swagger,但作者用了api fox,因为swagger代码侵入性大,且有限制。dto(数据传输对象)是在control上用来封装 接收和返回request参数的对象。remote.dto是封装发送请求操纵远程的短链project服务的请求对象。util是一些模块独有的工具类,模块共享的工具类后面会讲。
2024-07-31 16:25:00
202
原创 java八股 多线程
一个key要往分段加数据会加可重入锁,如果高并发情况锁获取重了,会有一个CAS自旋二次保证。然后获取锁的进去添加。volatie关键字定义线程共享变量,然后用这个变量作为线程运行条件。屏障放在写的上面,读的下面。所以不能随便加,要根据读写操作的位置加,连续一个线程获取锁-->偏向锁(一次CAS,后续对比线程id)Owner和锁对象如何关联?不竞争的轮流获取锁-->轻量级锁(每次CAS)用数据当成版本号,比对,如果不对就不能写入。缺点,锁住性能低,分段不能扩容。没人用线程时-->无锁。CAS比较并交换id。
2023-12-28 04:26:44
1073
原创 java八股 集合
jdk1.8 链表的长度大于8且数组长度大于64,链表转换为红黑树。resize到临界值6会退化。红黑树会自平衡,所以是二叉排序树BST的plus自平衡版。1.7之前头插法,扩容运行完之后倒置了。
2023-12-27 03:35:32
399
原创 java八股 spring + mybatis
如果一个spring事务里两组数据库操作中间有一个异常操作,没有被try catch的话。如果把异常try catch处理了,容易导致事务失效,前一段数据库操作做了,异常后面一段没做,直接跳到catch里了。我项目中类内方法调用事务方法导致事务失效,因为this不被spring管理,要获取上下文代理对象去调用,就能执行事务。项目里可以说记录用户登录日志,利用request去获取姓名、ip、、请求方式、url,时间。把二级缓存半成品A当成对象注入半成品B中,可以先完成一个单例B,这时候A也能完成了。
2023-12-25 03:58:37
645
1
原创 java八股 mysql优化
这个trx_id是上面的db_trx_id,代表上一次插入或者修改记录的事务号。undo log是逻辑日志,记录和操作相反的语句,用来撤销。如果这个号不在活跃集合里,代表该事务修改完成提交已经结束。节点可以自动平衡保证log2 n的查找复杂度.redo log是物理日志,记录的是正向的操作。但因为是二叉树,数据多了层数还会多。问题还有一个丢失更新。
2023-12-24 21:24:07
999
原创 java八股 redis
多路复用IO会用一个select去轮询监听一个socket集合,一个socket能代表一个需要拷贝的数据,在第一阶段谁先就绪就谁来,可以看成并行,先来先服务,第二阶段循环调用recvfrom去处理各个socket。但哨兵选出了新的主节点,老主节点降成从节点并被主从复制,那么这段时间的操作会丢失。redis速度主要受网络IO影响,所以易受影响的部分加了多线程升级,但是最终命令执行还是串行的。主节点加锁宕机,从节点变主节点但是锁没来得及更新过来,那么其他线程可以获取锁。aof只记录写命令,不记录读命令。
2023-12-24 01:47:40
704
原创 java八股 设计模式
相对于简单模式的一个工厂生产所有咖啡,这里只定义了一个抽象咖啡工厂,然后针对每一种咖啡实现自己的工厂,那么以后添加新咖啡的时候就不会修改以前的咖啡工厂类了,只需要自己新建一个工厂。新加咖啡类的时候需要在唯一的那个工厂类里加代码,这样就耦合了。工厂模式只能应付同一类产品,如果要工厂多类产品,就要抽象工厂。做到对拓展开放,对修改关闭。
2023-12-22 23:50:53
497
原创 黑马点评09 秒杀功能总结
订阅锁的消息,一旦其他线程释放了锁,就会发布一个消息通知别人来抢。有一个剩余重试时间waitTime,所有抢锁时间加起来如果超过这个阈值,就会放弃重试,如果还有剩余重试时间,就继续等发布然后抢,等发布的时间就是当前剩余重试时间。可重入:锁底层是hash结构,hash的名字是,hash的key(field)是线程名字,value是重入次数。只有服务宕机之后,看门狗机制也停止,才会锁过期,但这不是误删问题(服务阻塞但没有宕机)。多获取一次锁次数加一,结束一次次数减一,只有次数为0线程才会释放锁。
2023-12-22 00:03:50
1118
原创 黑马点评08 秒杀优化 变阻塞队列为消息队列
可以让一个消息被单个消费者拿到,也可以被多个消费者拿到。BLPUSH和BRPOP在存取的时候会自动阻塞。Redis的list是一个双向链表,
2023-12-20 00:08:29
436
原创 黑马点评07 秒杀优化 加阻塞队列
因为之前每一步是串行操作的,其中有大量的数据库操作会很影响效率,所以把资格判断和下单业务分离开。在jmeter里指定该文件作为token来源,就能模拟1000个用户。这里使用的阻塞队列很简单,容易出现很多问题,所以后面引入消息队列。创建好1000个token(用户),放到txt文件。没有元素的时候取对象会阻塞,直到有新内容进来。
2023-12-19 18:13:27
421
原创 黑马点评05分布式锁 1互斥锁和过期时间
因为jvm内部的sychonized锁无法在不同jvm之间共享锁监视器,所以需要一个jvm外部的锁来共享。用set + 参数的方式同时设置锁和过期时间,保证不会因为过期时间没来及设置就宕机导致死锁。redis 的setnx不会自动释放锁,要是加锁后服务宕机,锁得不到释放可能死锁。在订单创建业务那里把sychnoized锁改成自己实现的分布式锁(获取+解锁)为了维持 释放锁时 判断线程id和释放锁操作的原子性,重写unlcok方法。提前读取好lua文件,避免频繁读取,等会调用。非阻塞式就是别人拿锁我就返回。
2023-12-15 22:49:53
1037
原创 一些java问题集合
用target去调方法,有传入对象就把传入对象变成target,否则自己就是target。一个框架自己的一个别人的标准,一个byTye一个byName。
2023-12-15 15:57:33
382
原创 黑马点评03一人一单
如果对整个方法加sychronized锁,那么锁监视器是this(当前对象),那么不管什么用户来,监视器都是this,相当于串行执行了,性能差。一人一单是同一个用户来造成的并发安全问题,所以需要用某个用户的特征作为锁监视器,锁住某个用户的并发操作,而不影响不同用户之间的操作。toString返回值会new一个String,所以每次都是新对象,即便是同一个用户,每次的锁监视器都不一样。但是没必要对整个方法加锁,所以这里把后面5,6,7封装到createVoucherOrder方法里。基本解决一人一单问题。
2023-12-15 00:44:12
462
原创 黑马点评01
非结构化数据库,和sql的区别在于没有数据库表之间的关系(主键外键),一般的存储形式是JSON。每个json里面都存储了该记录的所有数据,所以有一定重复性。
2023-12-13 15:41:47
452
原创 java学习part40collections工具类
162-集合框架-Collections工具类的使用_哔哩哔哩_bilibili感觉类似c++的algorithm包,提供了很多集合的操作方法
2023-12-07 22:50:44
377
原创 java学习part38一些常用类和api
151-常用类与基础API-其它常用类的使用:BigInteger、BigDecimal、Random等_哔哩哔哩_bilibili
2023-12-07 00:20:09
374
原创 java学习part36set
必须重写hash方法,否则调用object的方法随机算了一个hash值,即便内容相同算出来的值也不一样,因为和你的内容无关,是随机算的。而重写的方法要根据你所有的内容算一个独特hash值。如果hash一样且equals也是true就是重复 ,调equals是为了保险,保证排除hash碰撞的可能。加入集合的时候会先调用重写的hash方法计算hash值,不一样就加入。
2023-12-05 15:08:55
359
原创 java学习part32StringBuffer和StringBuilder
不够用:长度为 原长度*2+2;如果还不够,那么就扩容到目标需要的长度。
2023-12-03 20:28:21
399
原创 java学习part30callabel和线程池方式
140-多线程-线程的创建方式3、4:实现Callable与线程池_哔哩哔哩_bilibili实现类使用方式 返回值
2023-12-02 20:49:01
414
原创 java学习part28线程安全Lock锁方式
和以前的加锁一样,同步代码前加锁,代码后解锁,就表示锁住了这一块代码。lock是上面声明的静态常量。
2023-12-02 18:55:22
393
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人