java多线程    Java入门    vsftp    ftp    linux配置    centos    FRP教程    HBase    Html5缓存    webp    zabbix    分布式    neo4j图数据库    

redisson分布式锁原理学习笔记整理

整理完毕的笔记,收获很大
视频 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

小技巧:看开源的源码,看源码,先看全局变量


This entry was posted in JAVA and tagged , , . Bookmark the permalink.
月小升QQ 2651044202, 技术交流QQ群 178491360
首发地址:月小升博客https://java-er.com/blog/redisson-study-notes/
无特殊说明,文章均为月小升原创,欢迎转载,转载请注明本文地址,谢谢
您的评论是我写作的动力.

Leave a Reply