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