
高并发
文章平均质量分 81
chuixue24
这个作者很懒,什么都没留下…
展开
-
LVS/Nginx/HAProxy原理及应用场景介绍
Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占用内存少、并发能力强,加上丰富的插件功能模块,当前是云端Web类应用中首选的一款软件。HAProxy是一个使用C语言编写的自由及开放源代码软件,是一款主要作用在七层HTTP和四层TCP上的负载均衡软件。和LVS一样,主要是一个专业级的负载均衡。转载 2023-05-18 20:45:10 · 1484 阅读 · 0 评论 -
硬核剖析ThreadLocal源码
ThreadLocal底层使用ThreadLocalMap存储数据,而ThreadLocalMap内部是一个数组,数组里面存储的是Entry对象,Entry对象里面使用key-value存储数据,key是ThreadLocal实例对象本身,value是ThreadLocal的泛型对象值。弱引用的对象拥有更短暂的生命周期,在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。而线性探测法没有引入任何额外的数据结构,直接不断遍历数组。转载 2023-05-07 18:05:53 · 146 阅读 · 0 评论 -
Redis 系列(5)— 常见缓存问题
我们在使用 Redis 缓存的时候,必然会面对的一个问题就是缓存和数据库的一致性问题。这个一致性问题产生的原因主要在于更新数据库和更新Redis是两个步骤,那就有可能一个更新成功,一个更新失败,这时数据不一致性就产生了。转载 2023-04-23 10:16:30 · 330 阅读 · 0 评论 -
Redis 系列(4)— 切片集群
系列专栏:Redis系列专栏切片集群数据扩展模式如果Redis要缓存的总数据量不是很大,比如5GB数据,一般使用 主从模型 + 哨兵集群保证高可用 就可以满足。但如果Redis要缓存的总数据量比较大,或者未来可能会增大,比如20GB、50GB数据,那一个主库就无法满足了,这时一般有两种模式来扩展:纵向扩展和横向扩展。纵向扩展纵向扩展就是升级单个Redis实例的配置,增加服务器内存容量、磁盘容量、使用更高配置的CPU。比如之前使用的 4C 8GB 50GB ,升级到 8C 32GB转载 2023-04-21 18:53:51 · 360 阅读 · 0 评论 -
Redis系列(3) — 哨兵高可用
上篇文章介绍了Redis主从架构模式,在这个模式下,主库存在着单点问题,如果主库发生故障,那客户端就无法发送写请求,而且从库也无法进行数据复制同步了。所以一般部署Redis主库架构时,还会部署哨兵(Sentinel)集群来保证Redis的高可用性,在主库发生故障时,可以自动进行故障转移,将从库切换为新的主库。这篇文章就来看看如何部署哨兵集群,以及其工作的原理。转载 2023-04-21 18:36:43 · 202 阅读 · 0 评论 -
Redis系列(2) — 主从读写分离
这里就会有一个问题,由于复制积压缓冲区是一个固定大小的环形缓冲区,那么可能在 slave 重连后,未同步的数据可能被覆盖了,即 slave_offset+1 之后的数据在缓冲区中已经不存在了,这时就会执行全量同步。slave 接收了 N 字节的数据,slave 的偏移量就会加上 N。命令时,master 将发现 slave 当前的复制偏移量少于自己的复制偏移量,然后 master 就会根据 slave 提交的复制偏移量,在复制积压缓冲区里面找到 slave 缺少的数据,并将这些数据重新发送给 slave。转载 2023-04-21 17:32:41 · 536 阅读 · 0 评论 -
Redis性能瓶颈揭秘:如何优化大key问题?
Redis大key问题指的是某个key对应的value值所占的内存空间比较大,导致Redis的性能下降、内存不足、数据不均衡以及主从同步延迟等问题。到底多大的数据量才算是大key?没有固定的判别标准,通常认为字符串类型的key对应的value值占用空间大于1M,或者集合类型的k元素数量超过1万个,就算是大key。Redis大key问题的定义及评判准则并非一成不变,而应根据Redis的实际运用以及业务需求来综合评估。例如,在高并发且低延迟的场景中,仅10kb可能就已构成大key;转载 2023-04-21 10:32:52 · 1245 阅读 · 0 评论 -
Redis为什么能抗住10万并发
本文介绍了Redis为什么如此快的原因。首先,Redis使用内存存储数据,避免了磁盘I/O的开销,提高了数据访问的速度。其次,Redis拥有丰富的对象类型,包含八种类型,满足不同的需求。此外,Redis采用了高效的数据结构,减少了内存占用和计算复杂度。Redis还使用单线程模型,避免了多线程之间的上下文切换和竞争条件,提升了CPU利用率。最后,Redis使用非阻塞I/O多路复用机制,充分利用CPU和网络资源,提高了并发处理能力。转载 2023-04-21 10:00:25 · 308 阅读 · 0 评论 -
happen-before原则
Ahappens-beforeB,定义1要求A执行结果对B可见,并且A操作的执行顺序在B操作之前,但与此同时利用定义中的第二条,A,B操作彼此不存在数据依赖性,两个操作的执行顺序对最终结果都不会产生影响,在不改变最终结果的前提下,允许A,B两个操作重排序,即happens-before关系并不代表了最终的执行顺序。(5)start()规则如果线程A执行操作ThreadB.start()(启动线程B),那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作。...转载 2022-07-21 10:11:45 · 1010 阅读 · 0 评论 -
为什么会有 AtomicReference
我们之前了解过了 AtomicInteger、AtomicLong、AtomicBoolean 等原子性工具类,下面我们继续了解一下位于 包下的工具类。关于 AtomicInteger、AtomicLong、AtomicBoolean 相关的内容请查阅一场 Atomic XXX 的魔幻之旅我们这里再聊起老生常谈的账户问题,通过个人银行账户问题,来逐渐引入 AtomicReference 的使用,我们首先来看一下基本的个人账户类个人账户类只包含两个字段:accountName 和 money,这两个字转载 2022-07-14 10:17:57 · 156 阅读 · 0 评论 -
一道业务计算题:根据超时时间和业务实际耗时计算QPS
已知条件: 1)系统中一个业务操作需要调用10个服务协作来完成; 2)该业务操作的总超时时间是10s; 3)每个服务的处理时间平均是0.5s; 4)集群中每个服务均部署了20个实例副本。 求解以下问题: ·单个用户访问,完成一次业务操作,需要耗费系统多少处理器 时间? 答:0.5×10=5 ·集群中每个服务每秒最大能处理多少个请求? 答:(1÷0.5)×20=40 ·假设不考虑顺序且请求分发是均衡的,在保证不超时的前提 下,整个集群能持续承受最多每秒多少笔业务原创 2022-04-27 18:08:48 · 368 阅读 · 0 评论 -
常见限流算法及其简单实现
计数器法计数器法是限流算法里最简单也是最容易实现的一种算法。比如我们规定,对于A接口来说,我们1分钟的访问次数不能超过100个。那么我们可以这么做:在一开始的时候,我们可以设置一个计数器counter,每当一个请求过来的时候,counter就加1,如果counter的值大于100并且该请求与第一个 请求的间隔时间还在1分钟之内,那么说明请求数过多;如果该请求与第一个请求的间隔时间大于1分钟,且counter的值还在限流范围内,那么就重置 counter。具体算法的伪代码: /**原创 2022-04-19 14:23:21 · 549 阅读 · 0 评论 -
Java并发:线程池如何设置线程数
目录 一、理论分析 二、实际应用为了加快程序处理速度,我们会将问题分解成若干个并发执行的任务。并且创建线程池,将任务委派给线程池中的线程,以便使它们可以并发地执行。在高并发的情况下采用线程池,可以有效降低线程创建释放的时间花销及资源开销,如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及“过度切换”(在JVM中采用的处理机制为时间片轮转,减少了线程间的相互切换)。但是有一个很大的问题摆在我们面前,即我们希望尽可能多地创建任务,但由于资源所限我们又不能创建过多的线程。.转载 2022-02-08 17:38:27 · 1865 阅读 · 0 评论 -
Netty线程模型及源码图
线程模型图:源码图:原创 2021-12-01 20:31:27 · 297 阅读 · 0 评论 -
MQ应用场景
应用解耦:提高系统容错性和可维护性异步提速:提升用户体验和系统吞吐量削峰填谷:提高系统稳定性MQ全称 Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。1.应用解耦2.异步提速3. 削峰填谷...原创 2021-11-10 12:59:04 · 302 阅读 · 0 评论 -
内核如何阻塞与唤醒进程?
进程和线程我们先从 Linux 的进程谈起,操作系统要运行一个可执行程序,首先要将程序文件加载到内存,然后 CPU 去读取和执行程序指令,而一个进程就是“一次程序的运行过程”,内核会给每一个进程创建一个名为task_struct的数据结构,而内核也是一段程序,系统启动时就被加载到内存中了。进程在运行过程中要访问内存,而物理内存是有限的,比如 16GB,那怎么把有限的内存分给不同的进程使用呢?跟 CPU 的分时共享一样,内存也是共享的,Linux 给每个进程虚拟出一块很大的地址空间,比如 32 位机器转载 2021-11-05 13:43:21 · 1178 阅读 · 0 评论 -
redis6:redis缓存设计与性能优化
多级缓存架构缓存设计 缓存穿透 缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储层查不到数据则不写入缓存层。 缓存穿透将导致不存在的数据每次请求都要到存储层去查询, 失去了缓存保护后端存储的意义。 造成缓存穿透的基本原因有两个: 第一, 自身业务代码或者数据出现问题。 第二, 一些恶意攻击、 爬虫等造成大量空命中。 缓存穿透问题解决方案:1、缓存空对象 String get(String key) { .原创 2021-10-29 09:01:20 · 231 阅读 · 0 评论 -
redis原理2:Redis持久化、主从与哨兵架构详解
Redis持久化 RDB快照(snapshot) 在默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。 你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次 数据集。 比如说, 以下设置会让 Redis 在满足“ 60 秒内有至少有 1000 个键被改动”这一条件时, 自动保存一次 数据集: # save 60 1000 //关闭RDB只需要将所有的save保存策略注释掉即可 还可以.原创 2021-10-23 23:48:33 · 220 阅读 · 0 评论 -
redis原理1:数据类型及其应用场景
5种数据类型:String应用场景:Hash应用场景:Hash结构优缺点:List应用场景:Set应用场景:Zset应用场景:Redis的单线程和高性能Redis是单线程吗? Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外 提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行...原创 2021-10-23 22:55:16 · 253 阅读 · 0 评论 -
LockSupport中的park与unpark原理
关于LockSupportconcurrent包的基础Doug Lea 的神作concurrent包是基于AQS (AbstractQueuedSynchronizer)框架,AQS框架借助于两个类:Unsafe(提供CAS操作)和LockSupport(提供park/unpark操作)。因此,LockSupport可谓构建concurrent包的基础之一。理解concurrent包,就从这里开始。两个重点操作对象归根结底,LockSupport调用的Unsafe中的native代码:.转载 2021-10-12 09:41:24 · 1039 阅读 · 1 评论 -
亿级流量电商网站中台微服务架构
转载 2021-09-10 14:25:58 · 552 阅读 · 1 评论 -
Servlet 3.0/3.1 中的异步处理
在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理。如果一个请求需要进行IO操作,比如访问数据库、调用第三方服务接口等,那么其所对应的线程将同步地等待IO操作完成, 而IO操作是非常慢的,所以此时的线程并不能及时地释放回线程池以供后续使用,在并发量越来越大的情况下,这将带来严重的性能问题。即便是像Spring、Struts这样的高层框架也脱离不了这样的桎梏,因为他们都是建立在Servlet之上的。为了解决这样转载 2021-04-29 12:26:19 · 290 阅读 · 0 评论 -
防雪崩利器:熔断器 Hystrix 的原理与使用
前言分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况, 这种现象被称为服务雪崩效应. 为了应对服务雪崩, 一种常见的做法是手动服务降级. 而Hystrix的出现,给我们提供了另一种选择.服务雪崩效应的定义服务雪崩效应是一种因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程.如果所示:上图中, A为服务提供者, B为A的服务调用者, C和D是B的服务调用者. 当A的不可用,引起B的不可用,并将不可用逐渐放大C和D时, 服务雪崩就形成了....转载 2021-04-28 14:56:53 · 266 阅读 · 0 评论 -
深入解析 volatile 、CAS 的实现原理
在分析说明 volatile 和 CAS 的实现原理前,我们需要先了解一些预备知识,这将是对 volatile 和 CAS 有深入理解的基石。预备知识缓存现代处理器为了提高访问数据的效率,在每个CPU核心上都会有多级容量小,速度快的缓存(分别称之为L1 cache,L2 cache,多核心共享L3 cache等),用于缓存常用的数据。缓存系统中是以缓存行(cache line)为单位存储的。缓存行是 2 的整数幂个连续字节,一般为 32-256 个字节。最常见的缓存行大小是 64个字节。转载 2021-03-22 12:45:38 · 298 阅读 · 0 评论 -
Java多线程Condition接口原理详解
Condition接口提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式,但是这两者在使用方式以及功能特性上还是有差别的Condition接口详解Condition定义了等待/通知两种类型的方法,当前线程调用这些方法时,需要提前获取到Condition对象关联的锁。Condition对象是由Lock对象(调用Lock对象的newCondition()方法)创建出来的,换句话说,Condition是依赖Lock对象的。Lock lock = new ReentrantLoc转载 2021-01-03 11:22:59 · 167 阅读 · 0 评论 -
volatile关键字解析
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volati.转载 2020-12-31 00:24:59 · 208 阅读 · 1 评论 -
redis+lua脚本+令牌桶算法 实现限流
最完整清晰的redis+lua脚本 + 令牌桶算法 实现限流控制在网上看了好多博客,感觉不是很清楚,于是决定自己手撸一个。一、自定义一个注解,用来给限流的方法标注@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface RateLimit { //限流唯一标示 String key() default ""; //限流单位.转载 2020-11-20 13:27:32 · 1004 阅读 · 2 评论 -
ReentrantReadWriteLock读写锁的使用
类ReentrantLock具有完全互斥排他的效果,即同一时间只有一个线程在执行ReentrantLock.lock()后面的代码。这样虽然保证了线程的安全性,但是效率低下。JDK提供了ReentrantReadWriteLock读写锁,使用它可以加快效率,在某些不需要操作实例变量的方法中,完全可以使用读写锁ReemtrantReadWriteLock来提升该方法的运行速度。 读写锁表示有两个锁,一个是读操作相关的锁,也称为共享锁;另一个是写操作相关的锁,也叫排他锁。也就是多个读锁之间不互斥,读锁与写转载 2020-11-12 14:38:49 · 299 阅读 · 0 评论 -
log4j2的性能为什么这么好?都是因为disruptor
一、logback和log4j2压测比较1、logback压测数据logback压测数据,50个线程,500万条日志写入时间。 logback:messageSize = 5000000,threadSize = 50,costTime = 27383ms logback:messageSize = 5000000,threadSize = 50,costTime = 26391ms logback:messageSize = 5000000,threadSize.转载 2020-10-30 11:32:11 · 834 阅读 · 2 评论 -
nacos的1.1.3版本java客户端导致TIME_WAIT状态tcp连接太多
参考文章:https://www.jianshu.com/p/d782f663ac72bug信息:https://github.com/alibaba/nacos/issues/20181.1.3版本:修改为1.2.1后:原创 2020-08-27 12:44:57 · 1599 阅读 · 0 评论 -
HTTP Client中ConnectTimeout、SocketTimeout、ConnectionRequestTimeout区别
ConnectTimeout: 链接建立的超时时间;SocketTimeout:响应超时时间,超过此时间不再读取响应;ConnectionRequestTimeout: http clilent中从connetcion pool中获得一个connection的超时时间;转载 2020-08-14 16:13:09 · 1877 阅读 · 0 评论 -
Java阻塞队列
本篇文章主要是介绍Java并发包中的几种阻塞队列和阻塞原理背景阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。2)支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。.转载 2020-08-03 13:55:16 · 203 阅读 · 0 评论 -
ReentrantReadWriteLock用法
介绍ReentrantLock是互斥排他锁,同一时间只能有一个线程在执行任务,ReentrantLock支持锁的重入功能,虽然保证了线程的安全性,但是效率不高,实际上应该是写操作互斥,读操作共享。而jdk提供了读写锁ReentrantReadWriteLock。读读共享public class MyTask { private ReentrantReadWriteLo...转载 2020-04-27 18:12:33 · 690 阅读 · 0 评论 -
java线程池实例(利用多线程将400万数据导入到Elasticsearch)
项目中需要用到ES,在写完接口后,对ES进行测试时,需要导入100万,400万,500万数据,分三次导入。在用java代码导入时,100万数据用时40分钟。后边还有两次400万和500万的数据导入。所以利用多线程提高导入效率。我本地机器测试时,线程池的大小设为100时,性能最佳。导入100万数据时单线程写法:导入耗时:2439796毫秒=2439.7秒=40.7分钟...原创 2020-02-25 00:20:40 · 3293 阅读 · 3 评论 -
高并发系统之限流特技
在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰或者问题解决后再打开;而有些场景并不能用缓存和降级来解决,比如稀缺资源(秒杀、抢购)、写服务(如评论、下单)、频繁的复杂查询(评论的最后几页),因此需有一种手段来限制这些场景的并发/请求量,即限...转载 2018-05-03 19:32:31 · 166 阅读 · 0 评论 -
RateLimiter
RateLimiter是Guava的concurrent包下的一个用于限制访问频率的类.1.限流每个API接口都是有访问上限的,当访问频率或者并发量超过其承受范围时候,我们就必须考虑限流来保证接口的可用性或者降级可用性.即接口也需要安装上保险丝,以防止非预期的请求对系统压力过大而引起的系统瘫痪.通常的策略就是拒绝多余的访问,或者让多余的访问排队等待服务,或者引流.如果要准确的控制QPS,简单的做法...转载 2018-05-03 19:34:38 · 527 阅读 · 0 评论 -
伪共享(false sharing),并发编程无声的性能杀手
在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素。前段时间学习了一个牛X的高性能异步处理框架 Disruptor,它被誉为“最快的消息框架”,其 LMAX 架构能够在一个线程里每秒处理 6百万 订单!在讲到 Disruptor 为什么这么快时,接触到了一个概念——伪共享( false sharing ),其中提...转载 2018-05-04 11:01:13 · 175 阅读 · 0 评论 -
Spring boot中使用aop详解
aop是spring的两大功能模块之一,功能非常强大,为解耦提供了非常优秀的解决方案。现在就以springboot中aop的使用来了解一下aop。 一:使用aop来完成全局请求日志处理创建一个springboot的web项目,勾选aop,pom如下: [html] view plain copy print?<?xml version="1.0" encoding="UTF-8"?>...转载 2018-05-25 13:42:15 · 505 阅读 · 0 评论 -
并发限流器
package com.richinfo.sipop.web.admin.aop;import java.util.concurrent.ExecutionException;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicLong;import javax.servlet.ht...原创 2018-05-26 10:28:49 · 369 阅读 · 0 评论 -
linux内核调优tcp_max_syn_backlog和somaxconn的区别
The behavior of the backlog argument on TCP sockets changed with Linux 2.2. Now it specifies the queue length for completely established sockets waiting to be accepted, instead of the number ...转载 2018-05-28 18:30:27 · 19342 阅读 · 0 评论