高并发编程

一台64G内存的服务器QPS可以达到9W,TPS(事务)可以达到5K,每个TPS大约包含18个QPS.只读的话QPS可以达到30~40万.阿里云有相关测试工具、测试方法、测试结果。

1、volatile 保证可见性,禁止指令重排,避免多线程环境下乱序执行

(1)及时通知

(2)变量前后加内存屏障,前加读屏障,后加写屏障

2、automicInteger 原子性:

原理:调用unsafe类,使用底层原语直接操作内存地址+1

3、有序性:编译器指令重排

指令并行的重排

如何禁止指令重排:在关键变量前加volatile或sycnizied

************************锁****************

1、重量级锁:又叫悲观锁。java的jvm中启动一个线程,一定在操作系统中启动一个线程,所以叫重量级锁。

叫重量级是因为要结果系统处理。

go语言中几百几千个协程才会在系统中创建一个线程。

在队列中等待系统调用,此时不占用系统资源。

2、轻量级锁:又叫自旋锁/乐观锁/CAS。一般用while循环实现,此时占用系统资源。

叫轻量级是因为不需要经过系统调度处理,在程序中自行解决。

cas如下图:compareAndSwap

cas会存在A->B->A问题,解决方法,加版本号。

cas另外一个问题:比较后修改前,工作被其它线程打断并修改了......--->调用c++的unsafe方法:unsafe_compareAndSwap-->Atomic::cmpxchg汇编语言(LOCK_IF_MP:如果是多核就上锁)

**所以执行时间较长的,用户数较多的不适合轻量级锁,因为会导致cpu不停的切换。

***************内存屏障

inter cpu:lfence,sfence,mfence

jvm虚拟机:

loadLoadBarrier:读语句和读语句之间的屏障

LoadStoreBarrier:读语句和写语句之间的屏障

StoreLoadBarrier:写语句和读语句之间的屏障

StoreStoreBarrier:写语句和写语句之间的屏障

*****************IOC 控制反转

***************************Bean的生命周期

*************************spring中用了哪些設計模式

**************************循環依賴****************************

************************AOP实现原理****************************

******************************spring 事务回滚**************************

****************************jvm****************************

服务器调优:

阿里巴巴开源调优工具:Arthas

通过内核查看内存信息:sudo cat /proc/meminfo | grep -i slab

设置打开文件数限制到100万:ulimit -n 1024000

查看可以端口范围(默认是32768~ 60999):$ sysctl -a | grep net.ipv4.ip_local_port_range

设置可用端口范围:

sudo sysctl -w net.ipv4.ip_local_port_range="1026 61999"

**********并发连接时间会越来越长的问题解决******************

linux优先给 bind(o)分配奇数端口,如果奇数端口号分配完了,才去尝试分配偶数端口

linux优先给connect 分配偶数端口。如果偶数端口号分配完了,才去尝试分配奇数端口

所以每次要遍历端口,花的时间就越来越长。解决的办法就是手动指定绑定端口和连接端口一致。

客户端机器测试并发时,可以虚拟ip:ifconfig enp0s31f6:i {IPS$i} netmask $NETMASK up

Redis:setNx解决重复下单等幂等性问题,记得加过期时间,如3秒

Bitmap可以解决是否签到等场景中数据存储问题

Redis中Sintersiore可以把两个set中的交集放在新的set中

Neo4j可以用来存储社交好友的问题

visualVM查看java内存

idea中jclasslib工具可查看jvm指令码

改为原子性,来保证线程安全,比synchronized效率更高

原子性的具体使用方法:

*************************************锁**************************************

悲观锁:synchronized、lock

乐观锁:并发的概率不高的情况下使用,读多写少。

占用cpu时间比较久的时候,可以用互斥锁(synchronized);反之用自旋锁(即cas)

2、ReentrantLock:

2.1显式锁

2.2ReentrantLock尝试锁tryLock

2.3ReentrantLock可以中断

******************************************************

Mysql中,尽量先用explain分析一下sqk语句

**********************************************

Redis监控:普罗米修斯

*********************************************Spring*******************************************

相关推荐
SL-staff14 分钟前
智慧园区2000+设备统一管理:JVS-IoT如何降低运维成本40%
java·开发语言·物联网·智慧园区·设备管理·运维优化·jvs-iot
咖啡八杯1 小时前
GoF设计模式——模板方法模式
java·后端·spring·设计模式
爱笑的源码基地1 小时前
一款全开源的信创云PACS影像云平台解决方案,支持多模态医学影像处理(CT/MR/DR/超声/病理等)
java·源码·国产化·pacs·云影像·区域pacs
我命由我123452 小时前
Android 开发问题:ClickableSpan 的点击事件没有生效
java·java-ee·android studio·android jetpack·android-studio·android runtime
2zcode2 小时前
基于MATLAB图像处理的饮料瓶灌装液位检测系统设计与实现
开发语言·图像处理·matlab
万亿少女的梦1682 小时前
基于Python的高考志愿填报辅助系统设计与实现
java·spring boot·python·mysql·vue
微信开发api-视频号协议2 小时前
企业微信外部群开发自动化实践过程
java·前端·微信·自动化·企业微信·ipad
犀利豆3 小时前
#AI in Harness(一)
java·ai编程
极***涯3 小时前
深度拆解:多源BFS路径重构难题——跳出单层遍历误区,搞定高阶最短路径全量解
java·重构·宽度优先
必须得开心呀3 小时前
QT解决中文乱码问题
开发语言·qt