高并发编程

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

相关推荐
少控科技13 分钟前
QT第6个程序 - 网页内容摘取
开发语言·qt
darkb1rd14 分钟前
八、PHP SAPI与运行环境差异
开发语言·网络安全·php·webshell
南极企鹅15 分钟前
springBoot项目有几个端口
java·spring boot·后端
历程里程碑16 分钟前
Linux20 : IO
linux·c语言·开发语言·数据结构·c++·算法
郝学胜-神的一滴18 分钟前
深入浅出:使用Linux系统函数构建高性能TCP服务器
linux·服务器·开发语言·网络·c++·tcp/ip·程序人生
清风拂山岗 明月照大江21 分钟前
Redis笔记汇总
java·redis·缓存
承渊政道22 分钟前
Linux系统学习【Linux系统的进度条实现、版本控制器git和调试器gdb介绍】
linux·开发语言·笔记·git·学习·gitee
xiaoxue..36 分钟前
合并两个升序链表 与 合并k个升序链表
java·javascript·数据结构·链表·面试
JQLvopkk1 小时前
C# 轻量级工业温湿度监控系统(含数据库与源码)
开发语言·数据库·c#
忧郁的Mr.Li1 小时前
SpringBoot中实现多数据源配置
java·spring boot·后端