java项目
文章平均质量分 77
BigOrangeSama
这个作者很懒,什么都没留下…
展开
-
黑马点评09 秒杀功能总结
订阅锁的消息,一旦其他线程释放了锁,就会发布一个消息通知别人来抢。有一个剩余重试时间waitTime,所有抢锁时间加起来如果超过这个阈值,就会放弃重试,如果还有剩余重试时间,就继续等发布然后抢,等发布的时间就是当前剩余重试时间。可重入:锁底层是hash结构,hash的名字是,hash的key(field)是线程名字,value是重入次数。只有服务宕机之后,看门狗机制也停止,才会锁过期,但这不是误删问题(服务阻塞但没有宕机)。多获取一次锁次数加一,结束一次次数减一,只有次数为0线程才会释放锁。原创 2023-12-22 00:03:50 · 1099 阅读 · 0 评论 -
黑马点评04集群下的并发安全
为了应对高并发,需要把项目部署到多个机器构成集群,所以需要配置nginx。原创 2023-12-15 16:30:03 · 529 阅读 · 0 评论 -
黑马点评08 秒杀优化 变阻塞队列为消息队列
可以让一个消息被单个消费者拿到,也可以被多个消费者拿到。BLPUSH和BRPOP在存取的时候会自动阻塞。Redis的list是一个双向链表,原创 2023-12-20 00:08:29 · 431 阅读 · 0 评论 -
黑马点评07 秒杀优化 加阻塞队列
因为之前每一步是串行操作的,其中有大量的数据库操作会很影响效率,所以把资格判断和下单业务分离开。在jmeter里指定该文件作为token来源,就能模拟1000个用户。这里使用的阻塞队列很简单,容易出现很多问题,所以后面引入消息队列。创建好1000个token(用户),放到txt文件。没有元素的时候取对象会阻塞,直到有新内容进来。原创 2023-12-19 18:13:27 · 420 阅读 · 0 评论 -
黑马点评06分布式锁 2Redisson
实战篇-21.分布式锁-Redisson的multiLock原理_哔哩哔哩_bilibili。原创 2023-12-17 13:27:55 · 1195 阅读 · 0 评论 -
黑马点评05分布式锁 1互斥锁和过期时间
因为jvm内部的sychonized锁无法在不同jvm之间共享锁监视器,所以需要一个jvm外部的锁来共享。用set + 参数的方式同时设置锁和过期时间,保证不会因为过期时间没来及设置就宕机导致死锁。redis 的setnx不会自动释放锁,要是加锁后服务宕机,锁得不到释放可能死锁。在订单创建业务那里把sychnoized锁改成自己实现的分布式锁(获取+解锁)为了维持 释放锁时 判断线程id和释放锁操作的原子性,重写unlcok方法。提前读取好lua文件,避免频繁读取,等会调用。非阻塞式就是别人拿锁我就返回。原创 2023-12-15 22:49:53 · 1028 阅读 · 0 评论 -
黑马点评03一人一单
如果对整个方法加sychronized锁,那么锁监视器是this(当前对象),那么不管什么用户来,监视器都是this,相当于串行执行了,性能差。一人一单是同一个用户来造成的并发安全问题,所以需要用某个用户的特征作为锁监视器,锁住某个用户的并发操作,而不影响不同用户之间的操作。toString返回值会new一个String,所以每次都是新对象,即便是同一个用户,每次的锁监视器都不一样。但是没必要对整个方法加锁,所以这里把后面5,6,7封装到createVoucherOrder方法里。基本解决一人一单问题。原创 2023-12-15 00:44:12 · 455 阅读 · 0 评论 -
黑马点评02优惠券秒杀(超卖问题)
因为以上原因要用。原创 2023-12-14 23:19:22 · 935 阅读 · 0 评论 -
黑马点评01
非结构化数据库,和sql的区别在于没有数据库表之间的关系(主键外键),一般的存储形式是JSON。每个json里面都存储了该记录的所有数据,所以有一定重复性。原创 2023-12-13 15:41:47 · 450 阅读 · 0 评论