高并发编程

一台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*******************************************

相关推荐
神仙别闹2 分钟前
基于java的改良版超级玛丽小游戏
java
Dream_Snowar12 分钟前
速通Python 第三节
开发语言·python
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭26 分钟前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫42 分钟前
泛型(2)
java
超爱吃士力架1 小时前
邀请逻辑
java·linux·后端
南宫生1 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石1 小时前
12/21java基础
java
高山我梦口香糖1 小时前
[react]searchParams转普通对象
开发语言·前端·javascript
李小白661 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp1 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea