整理完毕的笔记,收获很大
视频 https://www.bilibili.com/video/av667586995/
提交订单
1. Redis里查库存-库存充足-扣减成功-更新库存
并发测试三单,从50变成49(其实为47),库存会超卖
2. synchroinzed(productID) 上锁
单机可以,多机器就拉倒了
synchroinzed JVM级别的锁
3. 分布式锁
锁标记productID,多方机器共享锁标记
SETNX
p1.lock
p2.业务
p3.unlock
J1.运行角度
场景:死锁,锁进程挂了,其他线程都拿不到锁了
way1.try catch finally
way2.服务器挂了 redis 超时机制30秒
SETNX PX 一次性设置时间保证程序原子性
J2.集成角度
场景:A程序员key 123 加锁,B程序员123 删除锁,A程序员的锁失效了
way1.锁标记 value设置为UUID
private ThreadLocal threadLocal = new ThreadLocal();//相当于map。(29分钟处要点)
private String uuid;//线程不安全,其他线程覆盖uuid????不是private了么
String uuid=UUID.randomUUID.toString();
threadLocal.set(UUID);//线程的内部共享
场景:主函数,调用了子函数,子函数(是个老的函数,用了很多处了)
问题1.子函数也有拿锁逻辑,那么子函数就拿不到锁了
可重入锁 (synchroinzed 1.4以后是可以重入调用的)
if(threadLocal.get()==nulll){
加锁
}else{
返回锁
}
问题2.子函数释放了锁,主函数怎么办。
弄个次数+1,释放的时候-1,等于0才完全释放
J3.业务角度
场景1:抢单100个人购买1个人用了5秒 99人返回了error,让99人一直等着下
锁:阻塞,非阻塞
用阻塞,让大家等着,拿锁的线程 while(true)
场景2.一个线程业务时间过长,过期了30秒,31秒,锁过期,锁失效
异步run 定时10秒去延长锁时间
异步续命
释放锁的时候要把这个线程关闭,根据线程ID来处理这个线程
总结:
1.互斥性
2.锁超时
3.阻塞和非阻塞
4.可重入
5.高可用
#######################################################################
分布式问题:主从架构下,主服务挂了,从服务器顶上,锁又出问题了 红锁
redlock
RedissonRedLock redLock = new RedissonRedLock(rLock1,rLock2,rLock3);
超过一半加锁成功
红锁不推荐,
1.因为效率下降了,相当于zookeeper
2.redlock必须请求多个主节点得到rLock1,rLock2(主节点也不是主从关系)
老师讲解重量级秒杀不用分布式锁,说明有更好的解决方案来做秒杀
场景:假设1000个商品50万人来秒杀 1秒50万,redis节点崩了
QPS:query per second
分而治之
forkjoin
ConcurrentHashMap 1.7 高性能线程安全,分段锁
商品拆分,虚拟商品ID
123_0
123_1
123_2
...
123_9
每个ID分配100件,存在对应的服务器上。拿到以后本地缓存
每次请求负载轮询,不同的请求分布到不同的实例上。这样单机器就需要抗5万。10台50万。
#######################################################################
分布式设计理论
Consistency 一致性
Avalilability 可用性
Partition tolerance 分区容错性
Redis 是 AP架构
Zookeeper CP架构
分区容错性:任何一个节点挂了,不影响整体集群的服务P一定是保证的
发现PPT也写的极好
#########################################
BAT基础技术
.分布式技术
.数据库技术
.应用开发
.互联网开源框架--二次开发
工作技术
.Java并发编程
.消息中间件
.源码分析能力
.微服务器技术
提升技术
.JVM调优
.设计模式
.数据结构和算法
.数据库调优
方向比努力重要
找到一个方向,列一个很细的计划--思维导图
Spring不是单单的搭建,和用过,而是底层如何实现的
Netty架构师必备底层技能
1:23分大量关于redis技能梳理
ElasticSearch 最近很火的东西
FastDFS 分布式文件存储
消息中间件,削峰
分库分表ShardingSphere
数据结构
并发编程
学习是为了工作中遇到问题,快速响应
MYSQL底层索引
https://ke.qq.com/course/2770537?taid=9867433962260073
#######################################################################
问题:B线程可以删除A线程的这个key么。
回答:实际java代码测试可以删除A线程设置的SETNX的key
代码思考角度
1. 程序运行角度
异常
2. 开发继承角度(别人用的时候,如果不规范是否有问题)
3. 业务角度
小知识:
自动化测试Apache JMeter压力并发测试工具
PostMan
小技巧:看开源的源码,看源码,先看全局变量