精华内容
下载资源
问答
  • 2021-05-23 17:09:02

    昨天跟高中同学聊天,大厂需要高并发经验进不去,只能进小作坊,小作坊里又不需要处理高并发,如此死循环。高并发的经验,在面试场景里永远不会过时,有着举足轻重的作用,秒杀场景流量削峰就是高并发之一。

     

    什么是高并发?

    高并发指在同一个时间点,大量的客户请求,访问服务器,update的修改数据库数据,这时候update会锁表,等待执行完毕才能处理下一个请求,当客户请求累计到一定数量,超过数据库链接限制,则会返回链接超时,也会因为请求过多,同一条数据添加两次,不能保证数据的一致性。高并发请求核心要素则是必须保证大量请求高可用,一致性,高性能。从上面可以看出,保证系统的稳定性,可以减少直接对DB层数据的请求更新。

     

    1、如何保证高性能呢?

    客户层可以采用用户答题输入验证码等方法,限制请求次数,防止0点秒杀的时刻,峰值全部集中在一起,这样最主要是可以防止有人作弊秒杀,而且也可以延缓客户请求,吧请求分布在不同的时间段。

    业务层可以限制接口的调用次数。

    也可以采用流量削峰来实现,如今已经有大量优秀的开源框架支撑流量削峰功能,如RabbitMq和kafka等。RabbitMq的消息队列除了有解耦和异步的功能外,还可以实现流量削峰,将大量用户请求先存储在mq队列中,之后就可以分摊在其他时间段进入数据库。

    2、如何保证一致性?

    当消费仓库存货时,可以在每次消费之前,判断一次count>0,当有存货的时候,才能继续消费执行,否则回滚。

    如何实现高可用?

    最后,为了保证服务器的高可用,肯定是需要部署在多个服务器上保证其中一个宕机,系统还能正常运行。

    服务降级

    当请求到达系统承受能力,可以对其他不核心的功能先关闭,尽可能吧系统内存全部给秒杀功能,保证秒杀的正常运行。

    服务限流

    限流是接口的访问请求进行限流,也可以用rabbitmq进行限流,mq会对队列进行排队限流,一旦超过过期时间,则会丢弃,客户端快速失败进行第二轮重试。

    拒绝请求

    当服务降级和服务限流不能解决的情况下,最后就只能返回一个错误页面给用户,比如“用户请求过多”“服务繁忙,稍后再试”等,只会发生在服务器过载时候启用,只会存在短暂不可用情况,一旦正常运行的服务器负载降下来,则可以正常请求。

     

    更多相关内容
  • 列举Java高并发面试题附答案解析

    千次阅读 2021-03-17 21:45:05
    Java高并发面试题是程序员面试过程中的必修课,只有熟练掌握这些技术要点,在我们的学习中才会脱颖而出,在这里,达内石家庄Java培训老师作深入解答。Java并发面试题附答案1. 什么是原子操作?在Java Concurrency API...

    Java高并发面试题是程序员面试过程中的必修课,只有熟练掌握这些技术要点,在我们的学习中才会脱颖而出,在这里,达内石家庄Java培训老师作深入解答。

    Java并发面试题附答案

    1. 什么是原子操作?在Java Concurrency API中有哪些原子类(atomic classes)?

    原子操作是指一个不受其他操作影响的操作任务单元。原子操作是在多线程环境下避免数据不一致必须的手段。

    int++并不是一个原子操作,所以当一个线程读取它的值并加1时,另外一个线程有可能会读到之前的值,这就会引发错误。

    为了解决这个问题,必须保证增加操作是原子的,在JDK1.5之前我们可以使用同步技术来做到这一点。到JDK1.5,java.util.concurrent.atomic包提供了int和long类型的装类,它们可以自动的保证对于他们的操作是原子的并且不需要使用同步。

    2. Java Concurrency API中的Lock接口(Lock interface)是什么?对比同步它有什么优势?

    Lock接口比同步方法和同步块提供了更具扩展性的锁操作。他们允许更灵活的结构,可以具有完全不同的性质,并且可以支持多个相关类的条件对象。

    它的优势有:

    · 可以使锁更公平

    · 可以使线程在等待锁的时候响应中断

    · 可以让线程尝试获取锁,并在无法获取锁的时候立即返回或者等待一段时间

    · 可以在不同的范围,以不同的顺序获取和释放锁

    3. 什么是Executors框架?

    Executor框架同java.util.concurrent.Executor 接口在Java 5中被引入。Executor框架是一个根据一组执行策略调用,调度,执行和控制的异步任务的框架。

    无限制的创建线程会引起应用程序内存溢出。所以创建一个线程池是个更好的的解决方案,因为可以限制线程的数量并且可以回收再利用这些线程。利用Executors框架可以非常方便的创建一个线程池。

    4. 什么是阻塞队列?如何使用阻塞队列来实现生产者-消费者模型?

    java.util.concurrent.BlockingQueue的特性是:当队列是空的时,从队列中获取或删除元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。

    阻塞队列不接受空值,当你尝试向队列中添加空值的时候,它会抛出NullPointerException。阻塞队列的实现都是线程安全的,所有的查询方法都是原子的并且使用了内部锁或者其他形式的并发控制。BlockingQueue 接口是java collections框架的一部分,它主要用于实现生产者-消费者问题。

    5. 什么是Callable和Future?

    Java 5在concurrency包中引入了java.util.concurrent.Callable 接口,它和Runnable接口很相似,但它可以返回一个对象或者抛出一个异常。

    Callable接口使用泛型去定义它的返回类型。Executors类提供了一些有用的方法去在线程池中执行Callable内的任务。由于Callable任务是并行的,我们必须等待它返回的结果。java.util.concurrent.Future对象为我们解决了这个问题。在线程池提交Callable任务后返回了一个Future对象,使用它我们可以知道Callable任务的状态和得到Callable返回的执行结果。Future提供了get()方法让我们可以等待Callable结束并获取它的执行结果。

    6. 什么是FutureTask?

    FutureTask是Future的一个基础实现,我们可以将它同Executors使用处理异步任务。通常我们不需要使用FutureTask类,单当我们打算重写Future接口的一些方法并保持原来基础的实现是,它就变得非常有用。我们可以仅仅继承于它并重写我们需要的方法。

    7.什么是并发容器的实现?

    Java集合类都是快速失败的,这就意味着当集合被改变且一个线程在使用迭代器遍历集合的时候,迭代器的next()方法将抛出ConcurrentModificationException异常。

    并发容器支持并发的遍历和并发的更新。主要的类有ConcurrentHashMap, CopyOnWriteArrayList 和CopyOnWriteArraySet。

    8. Executors类是什么?

    Executors为Executor,ExecutorService,ScheduledExecutorService,ThreadFactory和Callable类提供了一些工具方法。

    Executors可以用于方便的创建线程池。

    展开全文
  • 高并发面试题

    千次阅读 2020-09-16 14:35:13
    高并发面试题 1.项目如何拆分的,分为几个子系统 分布式思想 概念: 将系统按照指定的规则进行拆分.形成了多个业务的子系统. 优势:如果其中一个宕机,则不会影响整个项目的正常运行. 作用: 为了降低系统架构的耦合性....

    文章目录

    高并发相关问题

    1.项目如何拆分的,分为几个子系统

    分布式思想
    概念: 将系统按照指定的规则进行拆分.形成了多个业务的子系统.
    优势:如果其中一个宕机,则不会影响整个项目的正常运行.
    作用: 为了降低系统架构的耦合性.
    弊端: 之前可能只需要运维一个服务器. 现在需要运维多个服务器. 运维的成本变高了.

    1.1 按照功能模块拆分(垂直拆分)

    在这里插入图片描述

    垂直拆分之后,项目实现了松耦合.当一个模块出现问题.不会影响整个项目运行.

    1.2 按照层级进行拆分(水平拆分)

    在这里插入图片描述

    在垂直拆分的基础之上进行水平拆分,按照代码的层级进行拆分,将层级拆分为具体项目。一般大项目才会进行水平拆分.因为多人维护同一个项目时容易出错。

    2.NGINX的原理,负载均衡的策略

    2.1 nginx介绍

    Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
    特点: 占有内存少 不超过2M ,并发能力强 3-5万次/秒

    2.1 Nginx的优缺点?

    • 优点:
    1. 占内存小,可实现高并发连接,处理响应快
    2. 可实现http服务器、虚拟主机、方向代理、负载均衡
    3. Nginx配置简单
    4. 可以不暴露正式的服务器IP地址
    • 缺点:
      动态处理差:nginx处理静态文件好,耗费内存少,但是处理动态页面则很鸡肋,现在一般前端用nginx作为反向代理抗住压力,

    2.3 Nginx应用场景

    1. http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
    2. 虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。
    3. 反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。
    4. nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。

    2.3 为什么要做动静分离?

    • Nginx是当下最热的Web容器,网站优化的重要点在于静态化网站,网站静态化的关键点则是是动静分离,动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们则根据静态资源的特点将其做缓存操作。

    • 让静态的资源只走静态资源服务器,动态的走动态的服务器

    • Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术。

    • 对于静态资源比如图片,js,css等文件,我们则在反向代理服务器nginx中进行缓存。这样浏览器在请求一个静态资源时,代理服务器nginx就可以直接处理,无需将请求转发给后端服务器tomcat。
      若用户请求的动态文件,比如servlet,jsp则转发给Tomcat服务器处理,从而实现动静分离。这也是反向代理服务器的一个重要的作用。

    2.4 Nginx负载均衡的算法怎么实现的?策略有哪些?

    为了避免服务器崩溃,大家会通过负载均衡的方式来分担服务器压力。将对台服务器组成一个集群,当用户访问时,先访问到一个转发服务器,再由转发服务器将访问分发到压力更小的服务器。

    Nginx负载均衡实现的策略有以下五种:

    2.4.1 轮询(默认)

    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某个服务器宕机,能自动剔除故障系统。

    upstream backserver { 
     server 192.168.0.12; 
     server 192.168.0.13; 
    } 
    
    

    2.4.2 权重 weight

    weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。其次是为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。

    upstream backserver { 
     server 192.168.0.12 weight=2; 
     server 192.168.0.13 weight=8; 
    } 
    
    

    权重越高,在被访问的概率越大,如上例,分别是20%,80%。

    2.4.3 ip_hash( IP绑定)

    每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题

    upstream backserver { 
     ip_hash; 
     server 192.168.0.12:88; 
     server 192.168.0.13:80; 
    } 
    

    弊端:

    1. 用户与服务器进行绑定,当服务器宕机时则可能影响用户的使用.
    2. 由于访问是通过算数计算的结果,可能导致严重的负载不均的现象.

    2.4.4 fair(第三方插件)

    • 必须安装upstream_fair模块。

    • 对比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,响应时间短的优先分配。

    upstream backserver { 
     server server1; 
     server server2; 
     fair; 
    } 
    

    哪个服务器的响应速度快,就将请求分配到那个服务器上

    2.4.5 url_hash(第三方插件)

    • 必须安装Nginx的hash软件包
    • 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。
    upstream backserver { 
     server squid1:3128; 
     server squid2:3128; 
     hash $request_uri; 
     hash_method crc32; 
    } 
    

    3.Tomcat集群

    4.Redis的原理,支持的数据类型,分片/哨兵/集群的原理和优缺点,持久化,实际项目应用

    4.1 缓存的基本思想

    缓存的基本思想其实很简单,就是我们非常熟悉的空间换时间。不要把缓存想的太高大上,虽然,它的确对系统的性能提升的性价比非常高。

    其实,我们在学习使用缓存的时候,你会发现缓存的思想实际在操作系统或者其他地方都被大量用到。 比如 CPU Cache 缓存的是内存数据用于解决 CPU 处理速度和内存不匹配的问题,内存缓存的是硬盘数据用于解决硬盘访问速度过慢的问题。 再比如操作系统在 页表方案 基础之上引入了 快表 来加速虚拟地址到物理地址的转换。我们可以把块表理解为一种特殊的高速缓冲存储器(Cache)。

    回归到业务系统来说:我们为了避免用户在请求数据的时候获取速度过于缓慢,所以我们在数据库之上增加了缓存这一层来弥补。

    4.2缓存机制的介绍

    说明:使用缓存机制主要的目的就是为了降低用户访问物理设备的频次.从缓存服务器中直接获取数据,快速的响应用户,提高整体的查询速度.用户体验更好.

    如何实现:
    1.缓存机制应该采用什么样的数据结构 进行构建? K-V结构 K必须唯一
    2.应该使用什么语言进行开发? C语言
    3.缓存的运行环境是哪? 内存
    4.内存断电即擦除, 如何保证数据的安全性?? 实现持久化(写入磁盘)操作
    5.内存中的数据如何进行优化 (不能一直存? ) 内存优化的算法 LRU算法

    4.3 Redis介绍

    Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability).
    速度快:

    • tomcat: 150-220/秒
    • nginx: 3-5万/秒
    • redis: 写:8.6万/秒;读:11.2万/秒 ~ 平均10万次/秒

    注意:Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念

    4.3.1 各个数据类型应用场景

    类型简介特性场景
    String二进制安全可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M
    Hash(字典)键值对集合,即编程语言中的Map类型适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去)存储、读取、修改用户属性
    List(列表)链表(双向链表)增删快,提供了操作某一段元素的API1、最新消息排行等功能(比如朋友圈的时间线) ;2、消息队列
    Set(集合)哈希表实现,元素不重复1、添加、删除,查找的复杂度都是O(1) ;2、为集合提供了求交集、并集、差集等操作1、共同好友 ;2、利用唯一性,统计访问网站的所有独立ip;’3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐
    Sorted Set(有序集合)将Set中的元素增加一个权重参数score,元素按score有序排列数据插入集合时,已经进行天然排序1、排行榜;2、带权重的消息队列

    4.3.2 redis使用场景

    4.4 Redis持久化

    Redis中的数据都保存在内存中.如果服务关闭或者宕机则内存资源直接丢失.导致缓存失效.
    Redis中默认的持久化的方式为RDB模式.

    4.4.1持久化的方式

    4.4.1.1 RDB模式
    • 特点说明:
      1.RDB模式采用定期持久化的方式. 风险:可能丢失数据.
      2.RDB模式记录的是当前Redis的内存记录快照. 只记录当前状态. 持久化效率最高的
      3.RDB模式是默认的持久化方式.

    • 持久化命令:
      命令1: save 同步操作. 要求记录马上持久化. 可能对现有的操作造成阻塞
      名来2: bgsave 异步操作. 开启单独的线程实现持久化任务.

    • 持久化周期:
      save 900 1 在900秒内,如果执行一次更新操作,则持久化一次.
      save 300 10 在300秒内,如果执行10次更新操作,则持久化一次.
      save 60 10000 在60秒内,如果执行10000次更新操作,则持久化一次.
      save 1 1 ???不可以 容易阻塞 性能太低.不建议使用.
      用户操作越频繁,则持久化周期越短.

    4.4.1.2 AOF模式
    • 特点:
      1.AOF模式默认是关闭状态 如果需要则手动开启.
      2.AOF能够记录程序的执行过程 可以实现数据的实时持久化. AOF文件占用的空间较大.恢复数据的速度较慢.
      3.AOF模式开启之后.RDB模式将不生效.

    • AOF配置:
      在这里插入图片描述
      持久化周期配置:
      appendfsync always 实时持久化.
      appendfsync everysec 每秒持久化一次 略低于rdb模式
      appendfsync no 自己不主动持久化(被动:由操作系统解决)

    4.5 Redis内存优化策略

    Redis运行的空间是内存.内存的资源比较紧缺.所以应该维护redis内存数据,将改让redis保留热点数据.

    4.5.1 LRU算法

    LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。
    维度: 自上一次使用的时间T
    最为理想的内存置换算法.

    4.5.2 LFU算法

    LFU(least frequently used (LFU) page-replacement algorithm)。即最不经常使用页置换算法,要求在页置换时置换引用计数最小的页,因为经常使用的页应该有一个较大的引用次数。但是有些页在开始时使用次数很多,但以后就不再使用,这类页将会长时间留在内存中,因此可以将引用计数寄存器定时右移一位,形成指数衰减的平均使用次数。
    维度: 引用次数

    4.5.3 RANDOM算法

    随机算法

    4.5.4 配置redis内存策略优化

    1. volatile-lru 在设定了超时时间的数据, 采用lru算法进行删除.
    2. allkeys-lru 所有数据采用lru算法
    3. volatile-lfu 在设定了超时时间的数据, 采用LFU算法进行删除.
    4. allkeys-lfu 所有数据采用LFU算法
    5. volatile-random 设定超时时间数据采用随机算法
    6. allkeys-random 所有数据采用随机算法
    7. volatile-ttl 设定了超时时间的数据 根据ttl规则删除. 将剩余时间少的提前删除
    8. noeviction 内存满了 不做任何操作.报错返回.

    4.6 分片/哨兵/集群的原理和优缺点

    4.6.1 一致性hash算法

    一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题 [2] 。

    4.6.1.1 一致性hash原理

    1. 首先求出redis服务器(节点)的哈希值,并将其配置到0~232的圆(continuum)上。
    2. 然后采用同样的方法求出存储数据的键的哈希值,并映射到相同的圆上。
    3. 然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过232仍然找不到服务器,就会保存到第一台redis服务器上。
      在这里插入图片描述
    4.6.1.1.1添加节点带来的影响

    如果现在node2和node4节点中间增加一个node5节点,那么在node4和node2之间的这些数据要存储的节点就会有所变化。在图中的黄色区域的数据将会从原来的node4节点挪到node5节点。
    在这里插入图片描述

    4.6.1.1.2 删除节点带来的影响

    删除了node2节点后,原本在node2节点上的数据就会被重新定位node4上。这样就产生一个影响:原来node2的数据转移到node4上,这样node4的内存使用率会骤增,如果node2上存在热点数据,node4会扛不住甚至会可能挂掉,挂掉之后数据又转移给node3,如此循环会造成所有节点崩溃,也就是前面所说的雪崩的情况。
    在这里插入图片描述

    4.6.1.1.3节点太少造成的影响

    节点太少的话可能造成数据倾斜的情况,如图中中只有俩节点,可能会造成大量数据存放在node A节点上,而node B节点存储很少的数据。
    在这里插入图片描述

    4.6.1.1.4 虚拟节点

    为了解决雪崩现象和数据倾斜现象,提出了虚拟节点这个概念。就是将真实节点计算多个哈希形成多个虚拟节点并放置到哈希环上,定位算法不变,只是多了一步虚拟节点到真实节点映射的过程
    以雪崩现象来说明:如下图节点real1节点又俩个虚拟节点v100和v101,real2有俩个虚拟节点v200和v201,real3节点有v300和v301俩个虚拟节点。
    在这里插入图片描述
    当real1节点挂掉后,v100和v101节点也会随即消失,这时k1数据就会被分配到v301上,k4就会被分配到了v200上,这就解决了雪崩的问题,当某个节点宕机后,其数据并没有全部分配给某一个节点,而是被分到了多个节点。
    在这里插入图片描述
    正因为加入了虚拟节点机制,数据倾斜的问题也随之解决
    注意:真实节点不放置到哈希环上,只有虚拟节点才会放上去。

    4.6.1.2一致性hash 特性

    4.6.1.2.1 平衡性(Balance)

    平衡性是指hash的结果应该平均分配到各个节点,这样从算法上解决了负载均衡问题
    在这里插入图片描述
    说明:引入虚拟节点,实现数据的平衡但是平衡是相对的。不是绝对的。

    4.6.1.2.2 单调性(Monotonicity)

    单调性是指在新增或者删减节点时,不影响系统正常运行。
    在这里插入图片描述

    4.6.1.2.3 分散性(Spread)

    分散性是指数据应该分散地存放在分布式集群中的各个节点(节点自己可以有备份),不必每个节点都存储所有的数据。
    鸡蛋不要放到一个篮子里。

    4.6.2 分片

    redis可以通过修改内存的大小实现数据的保存。但是内存的资源不宜设置的过大,因为很多的时间都浪费在内存的寻址中;
    如果有海量的数据,需要redis存储,那么应该如何处理?我们可以采用Redis分片机制实现内存数据的扩容。
    优点:可以实现redis内存的动态扩容.
    缺点:没有实现高可用(当其中一台redis服务器发生宕机,则会影响整个分片使用)

    4.6.3 哨兵

    4.6.3.1 哨兵机制原理

    在这里插入图片描述

    1. 首先启动Redis哨兵.由哨兵监控整个Redis主从状态. 主要监控M主机. 同时获取其从机的信息.
    2. 哨兵利用心跳检测机制(PING-PONG)的方式监控主机是否宕机. 如果连续3次主机没有响应.则哨兵判断主机宕机.
      之后开始进行选举.
    3. 根据从主机中获取的从机信息.之后利用选举机制算法.挑选新的主机.
    4. 之后将剩余的redis修改为当前主机的的从.并且修改配置文件.

    4.6.3.2 为什么要用到哨兵

    哨兵(Sentinel)主要是为了解决在主从复制架构中出现宕机的情况

    4.6.3.3 哨兵机制(sentinel)的高可用

    Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。
    在这里插入图片描述
    在Server1 掉线后:
    在这里插入图片描述
    利用选举机制算法,挑选Server2 为新的主服务器:
    在这里插入图片描述
    优点:实现Redis节点的高可用。
    缺点:哨兵本身没有高可用效果. 如果哨兵宕机则整个服务宕机;Redis中的数据不能实现内存的扩容。

    4.6.4 集群

    Redis集群相当于整合redis分片机制(内存扩容),redis哨兵机制(高可用).Redis集群由所有的主节点负责监控和选举.从而在不依赖第三方的基础之后实现了redis集群的高可用.
    细节:集群中的所有的节点都能互相通信.(PING-PONG)

    4.6.4.1为什么要搭建集群

    通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取。

    Redis是一个很好的Cache工具。大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿。

    由于内存大小的限制,使用一台 Redis 实例显然无法满足需求,这时就需要使用多台 Redis作为缓存数据库。但是如何保证数据存储的一致性呢,这时就需要搭建redis集群.采用合理的机制,保证用户的正常的访问需求.

    采用redis集群,可以保证数据分散存储,同时保证数据存储的一致性.并且在内部实现高可用的机制.实现了服务故障的自动迁移.

    4.6.4.2 Redis集群原理

    4.6.4.2.1Redis集群高可用推选原理

    在这里插入图片描述
    原理说明:
    Redis的所有节点都会保存当前redis集群中的全部主从状态信息。并且每个节点都能够相互通信。当一个节点发生宕机现象。则集群中的其他节点通过PING-PONG检测机制检查Redis节点是否宕机。当有半数以上的节点认为宕机,则认为主节点宕机。同时由Redis剩余的主节点进入选举机制。投票选举链接宕机的主节点的从机,实现故障迁移。

    4.6.4.2.2 Redis集群宕机条件

    特点:集群中如果主机宕机,那么从机可以继续提供服务,当主机中没有从机时,则向其它主机借用多余的从机(其他主机有多台从机,自己至少保留一台从机,其他可以外借)。继续提供服务。如果主机宕机时没有从机可用,则集群崩溃。
    答案:9个redis节点,节点宕机5-7次时集群才崩溃。
    如图所示:
    在这里插入图片描述
    问题分析:

    1. 如果有6台Redis搭建集群,问: 最少宕机多少台Redis集群崩溃??? 宕机2台集群崩溃
    2. 如果搭建9台Redis.3台主机, 问 :最少宕机Redis台 集群奔溃??? 宕机5台集群崩溃

    补充说明:如果想让集群尽可能不宕机,则适当增加从节点的数量. 2-3个从即可.

    4.6.4.2.3 集群主机为什么是奇数

    集群存活节点数量 > n/2
    3 > 1.5 3台可以搭建集群 宕机1台
    4 > 2 4台可以搭建集群 宕机1台
    通过上述证明,集群搭建的主机台数是奇数时,解是最优的。
    一般情况下的集群是奇数的要求. zookeeper Eureka集群

    4.6.4.2.4 如果选举平票如何处理?

    规定投票进行3次.如果连续平票的概率是1/8。概率偏低。如果适当增加主节点的数量则可以有效的降低平票导致脑裂的风险.
    在这里插入图片描述

    4.6.4.2.5 Redis hash槽存储数据原理

    redis cluster采用数据分片的哈希槽来进行数据存储和数据的读取。redis cluster一共有2^14(16384)个槽,所有的master节点都会有一个槽区比如0~1000,槽数是可以迁移的。master节点的slave节点不分配槽,只拥有读权限。但是注意在代码中redis cluster执行读写操作的都是master节点,并不是你想 的读是从节点,写是主节点。第一次新建redis cluster时,16384个槽是被master节点均匀分布的。

    RedisCluster采用此分区,所有的键根据哈希函数(CRC16[key]&16384)映射到0-16383槽内,共16384个槽位,每个节点维护部分槽及槽所映射的键值数据。根据主节点的个数,均衡划分区间。

    算法:哈希函数: Hash()=CRC16[key]&16384按位与。
    在这里插入图片描述
    当向redis集群中插入数据时,首先将key进行计算.之后将计算结果匹配到具体的某一个槽的区间内,之后再将数据set到管理该槽的节点中。

    Redis分区只负责数据应该存储到哪里的问题。至于是否能存储的下,完全由Redis内存决定。
    在这里插入图片描述

    4.6.4.2.6 Redis hash槽与一致性 hash算法的区别

    一致性哈希用于解决分布式缓存系统中的数据选择节点存储问题和数据选择节点读取问题以及在增删节点后减少数据缓存的消失范畴,防止雪崩的发生。

    哈希槽是在redis cluster集群方案中采用的,redis cluster集群没有采用一致性哈希方案,而是采用数据分片中的哈希槽来进行数据存储与读取的。

    1. 运算位置不同:
      • redis分片机制在业务服务器中完成的运算.
      • redis分区算法在连接Redis之后,由redis进行计算.
    2. 算法不同:
      • 一致性hash算法
      • hash槽算法
    3. redis分片可以随意的进行数据的保存; redis分区不能随机存储,分区中只能保存属于我的key;

    参考文章:redis一致性hash和hash槽

    4.6.4.2.7 分片与集群总结
    1. 分片的运算发生在tomcat服务器中,数据直接计算完成之后保存到了具体的redis节点中.
    2. redis集群是将key在redis内部进行计算.之后保存数据,性能浪费在计算上.
    4.6.4.2.8 Redis面试题
    1. Redis集群中的主机最多 多少台?
      16384个。
    2. Redis中存储的数据最多16384个?
      不对的。16384只是分区的大小.至于能存储多少数据,完全由内存决定。

    5.缓存穿透,缓存雪崩,缓存击穿

    5.1 缓存穿透

    5.1.1 什么是缓存穿透?

    缓存穿透说简单点就是大量请求的 key 根本不存在于缓存中,导致请求直接到了数据库上,根本没有经过缓存这一层。举个例子:某个黑客故意制造我们缓存中不存在的 key 发起大量请求,导致大量请求落到数据库。
    影响:由于用户高并发访问,则数据库可能存在宕机的风险.

    5.1.2 如何避免缓存穿透?

    在这里插入图片描述

    • 方案1:使用API网关
      API Gateway很好的解决了微服务下调用、统一接入等问题,如下图所示:
      在这里插入图片描述
      一个API网关的基本功能包含了统一接入、协议适配、流量管理与容错、以及安全防护,这四大基本功能构成了网关的核心功能。网关首要的功能是负责统一接入,然后将请求的协议转换成内部的接口协议,在调用的过程中还要有限流、降级、熔断等容错的方式来保护网关的整体稳定,同时网关还要做到基本的安全防护(防刷控制),以及黑白名单(比如IP白名单)等基本安全措施,如下图所示:
      在这里插入图片描述
    • 方案2:限定IP访问次数
      参考文章
    • 方案3:缓存无效key
      如果缓存和数据库都查不到某个 key 的数据就写一个到 Redis 中去并设置过期时间,具体命令如下: SET key value EX 10086 。这种方式可以解决请求的 key 变化不频繁的情况,如果黑客恶意攻击,每次构建不同的请求 key,会导致 Redis 中缓存大量无效的 key 。很明显,这种方案并不能从根本上解决此问题。如果非要用这种方式来解决穿透问题的话,尽量将无效的 key 的过期时间设置短一点比如 1 分钟。
      另外,这里多说一嘴,一般情况下我们是这样设计 key 的: 表名:列名:主键名:主键值
      如果用 Java 代码展示的话,差不多是下面这样的:
    public Object getObjectInclNullById(Integer id) {
        // 从缓存中获取数据
        Object cacheValue = cache.get(id);
        // 缓存为空
        if (cacheValue == null) {
            // 从数据库中获取
            Object storageValue = storage.get(key);
            // 缓存空对象
            cache.set(key, storageValue);
            // 如果存储数据为空,需要设置一个过期时间(300秒)
            if (storageValue == null) {
                // 必须设置过期时间,否则有被攻击的风险
                cache.expire(key, 60 * 5);
            }
            return storageValue;
        }
        return cacheValue;
    }
    
    • 方案4:使用布隆过滤器
      布隆过滤器是一个非常神奇的数据结构,通过它我们可以非常方便地判断一个给定数据是否存在于海量数据中。我们需要的就是判断 key 是否合法,有没有感觉布隆过滤器就是我们想要找的那个“人”。
      具体是这样做的:把所有可能存在的请求的值都存放在布隆过滤器中,当用户请求过来,先判断用户发来的请求的值是否存在于布隆过滤器中。不存在的话,直接返回请求参数错误信息给客户端,存在的话才会走下面的流程。
      加入布隆过滤器之后的缓存处理流程图如下。
      在这里插入图片描述

    但是,需要注意的是布隆过滤器可能会存在误判的情况。总结来说就是: 布隆过滤器说某个元素存在,小概率会误判。布隆过滤器说某个元素不在,那么这个元素一定不在。
    为什么会出现误判的情况呢? 我们还要从布隆过滤器的原理来说!
    我们先来看一下,当一个元素加入布隆过滤器中的时候,会进行哪些操作:

    1. 使用布隆过滤器中的哈希函数对元素值进行计算,得到哈希值(有几个哈希函数得到几个哈希值)。
    2. 根据得到的哈希值,在位数组中把对应下标的值置为 1。
      我们再来看一下,当我们需要判断一个元素是否存在于布隆过滤器的时候,会进行哪些操作:
    3. 对给定元素再次进行相同的哈希计算;
    4. 得到值之后判断位数组中的每个元素是否都为 1,如果值都为 1,那么说明这个值在布隆过滤器中,如果存在一个值不为 1,说明该元素不在布隆过滤器中。
      然后,一定会出现这样一种情况:不同的字符串可能哈希出来的位置相同。 (可以适当增加位数组大小或者调整我们的哈希函数来降低概率)
      更多关于布隆过滤器的内容可以看我的这篇原创:《不了解布隆过滤器?一文给你整的明明白白!》 ,强烈推荐,个人感觉网上应该找不到总结的这么明明白白的文章了。

    5.2 缓存雪崩

    5.2.1 什么是缓存雪崩?

    在这里插入图片描述
    由于高并发的环境下.大量的用户访问服务器. 缓存中大量的数据在同一时间超时(删除),导致后面的请求都直接落到了数据库上,造成数据库短时间内承受大量请求。

    5.2.2 如何避免缓存雪崩

    针对 Redis 服务不可用的情况:

    1. 采用 Redis 集群,避免单机出现问题整个缓存服务都没办法使用。
    2. 限流,避免同时处理大量的请求。

    针对热点缓存失效的情况:
    3. 设置不同的失效时间比如随机设置缓存的失效时间。
    4. 缓存永不失效。

    5.3 缓存击穿

    5.3.1 什么是缓存击穿

    在这里插入图片描述
    由于用户高并发的访问. 访问的数据刚开始有缓存,但是由于特殊原因 导致缓存失效.(数据是单个)

    缓存击穿是指热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求打到db。

    5.3.2 如何避免缓存击穿

    • 设置热点数据永远不过期。

    • 加互斥锁,互斥锁参考代码如下:
      在这里插入图片描述说明:
      1)缓存中有数据,直接走上述代码13行后就返回结果了
      2)缓存中没有数据,第1个进入的线程,获取锁并从数据库去取数据,没释放锁之前,其他并行进入的线程会等待100ms,再重新去缓存取数据。这样就防止都去数据库重复取数据,重复往缓存中更新数据情况出现。
      3)当然这是简化处理,理论上如果能根据key值加锁就更好了,就是线程A从数据库取key1的数据并不妨碍线程B取key2的数据,上面代码明显做不到这点。

    6.dubbo的原理,RPC通信原理,zookeeper和eureka的区别,dubbo支持的协议

    6.1 dubbo的原理,RPC通信原理

    参考文章

    6.2zookeeper和eureka的区别

    都可以作为注册中心的Zookeeper和Eureka,想要理解两种注册中心的区别,首先要理解CAP理论。

    CPA理论:C–>Consistency(一致性):数据一致更新,所有数据变动都是同步的。A–>Availability(可用性):好的相应性能。P–>Partition tolerance(分区容忍性):可靠性。
    一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。由于分区容错性在分布式系统中是必须要保证的,因此我们只能在A和C之间权衡。

    故在此Zookeeper保证的是CP,而Eureka则保证的是AP。

    • Zookeeper:
      当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。但是Zookeeper会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30s~120s,并且选举期间整个Zookeeper集群都是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因网络问题是得Zookeeper集群失去master节点是较大概率会发生的事,虽然服务能够最终恢复,但是漫长的选举时间导致的注册长期不可用是不能容忍的。

    • Eureka:
      Eureka看明白了这点,因此在设计师就有限保证可用性,Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册时如果发现连接失败,会自动切换至其他节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。除此之外,Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:
      1、Eureka不再从注册列表中溢出因为长时间没有收到心跳而应该过期的服务。
      2、Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点上(即保证当前节点依然可用)。
      3、当网络稳定是,当前实例新的注册信息会被同步到其他节点中。
      因此,Eureka可以很好的应对网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使整个注册服务瘫痪

    6.3 dubbo支持的协议

    Dubbo支持dubbo、rmi、hessian、http、webservice、thrift、redis等多种协议,但是Dubbo官网是推荐我们使用Dubbo协议的。

    7.消息队列的原理,五种工作模式,实际应用哪种(路由模式比较多,重点了解)

    8.springcloud的核心组件

    9 补充

    9.1 反向代理/正向代理

    9.1.1 反向代理

    反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
    特点:

    1. 反向代理服务器位于用户和目标服务器之间.
    2. 反向代理服务器就相当于目标服务器.(用户以为代理服务器就是真实服务器)
    3. 用户通过反向代理服务器获取资源 而不是直接访问真实服务器.
    4. 用户不清楚真实的服务器到底是谁.
    5. 反向代理是服务器端代理.保护真实服务器信息.

    特征: 用户不清楚真实目标服务器是谁.

    反向代理服务器的优点是什么?
    反向代理服务器可以隐藏源服务器的存在和特征。它充当互联网云和web服务器之间的中间层。这对于安全方面来说是很好的,特别是当您使用web托管服务时。

    9.1.2 正向代理

    正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
    特点:
    1.代理服务器位于用户和服务器之间
    2.用户发起请求之前已经清楚的知道谁的目标服务器.
    3.用户通过代理服务器到指定的目标服务器获取资源.
    4.正向代理保护的是客户端信息**,是客户端代理**
    在这里插入图片描述

    9.1.3关于正向/反向代理总结

    正向代理是客户端代理,用户清楚的知道访问的服务器是谁. 保护了客户端信息
    反向代理是服务器端代理.用户不清楚访问的真实服务到底是谁. 保护了服务端信息\

    展开全文
  • 面试经典情景高并发解决方案

    千次阅读 多人点赞 2019-09-21 11:54:19
    面试经典情景高并发解决方案 情景模拟:在很多个用户同时访问网站的时候,例如:抢购或者双十一的时候。如何避免服务器宕机或者数据库挂掉的问题,请你提供几种解决方案。 1、静态资源与后台服务进行分离 ...

    面试经典情景题:高并发解决方案

    情景模拟:在很多个用户同时访问网站的时候,例如:抢购或者双十一的时候。如何避免服务器宕机或者数据库挂掉的问题,请你提供几种解决方案。

    1、静态资源与后台服务进行分离

    静态资源主要包括图片、视频、js、css和一些资源文件等,这些文件因为没有状态所以分离比较简单,直接存放到响应的服务器就可以了,一般会使用专门的域名去访问。通过不同的域名可以让浏览器直接访问资源服务器而不需要再访问应用服务器了。
    这样在高并发的情况下是很有必要这样做的,可以想象一下,双十一的时候,浏览商品的并发量是远远高于下单的并发量的。架构图如下:
    架构图

    2、做页面静态化

    静态化的意思就是将数据渲染后的动态页面变成一个html静态页面的保存起来,如果以后需要再次访问该页面,则将该请求重定向到静态页面。这样就不需要再向数据库或者缓存中拿去数据然后再进行渲染页面,返回到客户端。大大的提高了响应速度,减轻了服务端的负担。这个原理其实和缓存一样,只是将整个页面进行了缓存。nginx就自带了页面静态化的解决方案。

    3、分布式和集群

    分布式就是对整个系统进行水平拆分和垂直拆分。垂直拆分就是每一个功能模块都拆分成一个可以独立运行的微服务,从客户端发来的请求会根据所请求的功能转发到不同的微服务,这就避免了单体应用服务每一个请求都会请求同一个应用服务的问题。而且微服务还实现了模块与模块之间的解耦合,这样就避免了后期优化的时候,因为不知道谁调用谁而不敢修改代码的问题。而且如果一个微服务的并发量太大,可以对微服务进行水平扩展,也就是增加提供该服务的应用服务器数量,提高并发量,这就是我们所说的集群。水平拆分就是将每个微服务进行分层,实现微服务内部的解耦合。例如分为web层,service层,mapper层等等。分布式和集群是解决高并发的核心,它是整个系统架构的高并发解决方案。

    4、反向代理

    反向代理就是我们直接访问的服务器并不提供真正的系统服务,它只是个代理服务器,将发来的请求转发到真正的系统服务器里,一般比较常用的是nginx。它可以做负载均衡,避免集群里的应用服务分配请求不均匀导致的个别应用服务器宕机问题。

    5、数据库集群和拆分

    一个数据库的并发数是有限的,我们需要用多个数据库来提供服务,增加并发量,这是就需要对数据库做一个集群。
    数据库本身也是需要进行优化的,我们需要对数据库进行垂直拆分和水平拆分。垂直拆分就是将数据表按照功能模块来进行划分,分别存储在不同的数据库服务器中。水平拆分就是对数据表进行读写分离,一个数据表或许有很多字段,但是有些字段可能在有些页面中读取较多,有些字段在其他页面写入修改较多,这时候我们就应该进行读写分离,将读较多的字段拆分为一个数据表,将写较多的字段拆分为另一个数据表。

    6、使用缓存

    这个在一定程度上是可以提高用户的并发量的,但是如果访问量大的话,有可能会因为缓存数据过大,造成内存空间不足导致应用服务器挂掉。

    7、消息队列流量削峰

    前面处理高并发的方案都是通过优化后台服务来是实现的,那我们换个角度,我们对请求进行处理。我们先来模拟一个场景,就是怎么处理抢购的时候的一秒内数十万的高并发。在那么短的时间内,那么高的并发,那很有可能或让代理服务器瘫痪。为了避免这种情况,我们需要使用消息队列来进行流量削峰。原理也很简单,就是我们比如说抢购的商品只有1000件,但是却有10万个人抢购,那我们就用消息队列缓存先到的1000个请求,将后面的那些请求直接响应请求,提示抢购失败,然后慢慢的对缓存中的请求进行处理。


    作者:yuanfu
    来源:CSDN
    原文:https://blog.csdn.net/qq_36929638/article/details/101102230
    版权声明:本文为博主原创文章,转载请附上博文链接!


    展开全文
  • 高并发常见的面试题

    万次阅读 多人点赞 2019-02-28 23:45:06
    1. 什么是进程 进程是指运行中的应用程序,每个进程都有自己独立的地址空间(内存空间)。 ...目前操作系统都支持多进程。 2. 什么是线程 ...而线程则是进程中执行运算的最小单位,即执行处理机调度...
  • 15个Java线程并发面试题和答案(java高级) 面试Java开发者时常问的15个Java多线程和并发问题 1. 现在有线程 T1、T2 和 T3。你如何确保 T2 线程在 T1 之后执行,并且 T3 线程在 T2 之后执行? 这个线程面试题通常在...
  • Java高并发面试题大全含答案

    千次阅读 2019-08-08 09:45:45
    编译器也可以进行锁粒度粗化操作,将临近的多个同步代码用一个锁合并起来,不仅可以减少多个同步带来的不必要的开销,同时还能使优化器处理更大的代码块,带来进一步的优化。锁自旋,当线程发生阻塞时,可能会自旋...
  • 多线程和高并发的常见面试题整理

    千次阅读 2020-07-12 11:46:03
    消息队列的可靠性怎么保证 了解高并发吗,多线程里怎么保证线程安全 Fork/Join Fork/Join就是利用了分治的思想组建的框架,平日里很多场景都能利用到分治思想。框架的核心ForkJoinPool,因为含有任务队列和窃取的...
  • java并发面试题(一)

    2021-01-09 13:57:06
    答:并发是指多个任务在同一个CPU上执行,然后按照划分时间片来交替执行,在同一个时间段内,多个任务都在执行,是属于相同实体上的多个事件,并发是为了更好的利用处理器的每个核,以达到更的性能。 使用多线程...
  • java 高并发面试题

    千次阅读 2018-11-02 16:09:31
    newCachedThreadPool :创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.  线程没有任务要执行时,便处于空闲状态,处于空闲状态的线程并不会被立即销毁(会被缓存...
  • 文件服务器顾名思义,文件服务器就是将文件系统单独拿出来提供专注于处理文件的存储访问系统,甚至于对个文件服务器。因为对于图片这种资源的访问存储是web服务最耗资源的地方,将文件服务器单独部署既可以...
  • 高并发解决方案相关面试题

    万次阅读 多人点赞 2019-09-06 20:48:16
    占用内存少,并发量强,支持多种并发连接,效率. 2.能够作为负载均衡服务器和(内部直接支持 Rails 和 PHP)代理服务器。Nginx用C编写开销和CPU占有小. 3.安装启动简单,配置简洁,bug少,一般几个月不需要重新启动...
  • 并发编程篇:java 高并发面试题

    万次阅读 多人点赞 2018-02-28 21:43:18
    适用场景:处理任务速度 > 提交任务速度,耗时少的任务(避免无限新增线程) newFixedThreadPool :创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 newScheduledThreadPool:创建一个定长线程池...
  • 15个PHP关于高并发面试题(总结)

    千次阅读 2020-10-22 09:51:20
    774 一 、PHP基础部分 1、PHP语言的一大优势是跨平台,什么是跨平台? PHP的运行环境最优搭配为Apache+MySQL...2、WEB开发中数据提交方式有几种?...(2)可缓存性:get 方式是可以缓存的,post 方式不可以缓存。...(3.
  • 并发原则 ⽆状态 ⽆状态应⽤,便于⽔平扩展 有状态配置可通过配置中⼼实现⽆状态 实践: Disconf、Yaconf、Zookpeer、Consul、Confd、Diamond、 Xdiamond等 拆分 系统维度:按照系统功能、业务拆分,如购物⻋,结算...
  • 1. ⾼并发原则 ⽆状态: ⽆状态应⽤,便于⽔平扩展 有状态配置可通过配置中⼼实现⽆状态 实践: Disconf、Yaconf、Zookpeer、Consul、Confd、Diamond、Xdiamond等 拆分: 系统维度:按照系统功能、业务拆分,如购物...
  • 高并发 PV 问题 他的文章标题是这样的: 首先他给出了一个业务场景:在一些需要统计 PV(Page View), 即页面浏览量或点击量高并发系统中,如:知乎文章浏览量,淘宝商品页浏览量等,需要统计相应数据做分析。 ...
  • 高并发必备之redis!!!!先从基础来一套
  • 并发编程面试题(2020最新版)

    万次阅读 多人点赞 2020-03-14 17:28:01
    文章目录基础知识并发编程的优缺点为什么要使用并发编程(并发编程的优点)并发编程有什么缺点并发编程三要素是什么?在 Java 程序中怎么保证多线程的运行安全?并行和并发有什么区别?什么是多线程,多线程的优劣?...
  • a面试大全2021是一套最新Java面试必问合集,这本面试手册包含了Java基础、Java...四、并发编程面试题 1、基础知识 2、并发理论 3、并发关键字 4、Lock体系 5、并发容器 6、线程池 7、原子操作类 8、并发工具 未完待续
  • 一份经典多线程并发面试题

    千次阅读 2019-05-07 19:49:28
    面试中关于 synchronized 关键字的 5 连击 1.1 说一说自己对于 synchronized 关键字的了解 synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在...
  • 这里写目录标题并发编程基础blocked 和 waiting 的区别线程的 run()和 start()有什么区别?为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?说说线程的生命周期及五种基本状态...
  • Java面试题——多线程高并发

    千次阅读 2018-12-28 14:36:33
    什么是线程? 线程是进程中的一个实体,是被系统独立调度和分派的基本单位,它被包含在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,...我们通过多线程编程,能更高效的提高系统内多个程序间并发执行...
  • JUC java并发面试题

    千次阅读 2020-05-28 12:36:31
    四:ConCurrentHashMap ConcurrentHashMap是java并发包下的一个性能的且线程安全的HashMap实现,它采用了分段锁机制,将hashmap的结构分成了多个segment,以ConcurrentLevel为16而言,ConcurrentHashmap最多支持...
  • 面试官问到高并发系统可以采用哪些手段来解决,或者被问到分布式系统如何解决一致性的问题,是不是一脸懵逼?确实,在一开始接触的时候,不少人都会分布式、高并发、多线程将三者混淆,误以为所谓的分布式高并发的...
  • 1、 秒杀带来的问题:高并发和超卖 1.高并发:大量用户同一时间抢购,网站瞬时访问量剧增,导致服务器压力大 2.超卖: 成功下订单买到商品的人数,超过数据库最大库存数量 2. 前端解决方案 A 扩容: 加机器,这是...
  • 阿里Java高并发面试题

    千次阅读 2020-12-02 13:01:36
    面试题 加锁和释放没有配对 锁自动释放导致的重复逻辑执行的问题 有什么方法来发现和解决这两种问题? 讲解 锁释放和重复执行问题:锁建议使用synchronized,在JDK1.6后,synchronized与Lock性能上差距很小了...
  • 互联网高并发解决方案相关面试题

    千次阅读 2019-09-07 21:33:36
    高并发服务限流特技有哪些算法? 传统计算器算法,滑动窗口计数器算法,令牌桶算法和漏桶算法。 传统计数器限流算法有什么弊端? 传统计数器限流方式不支持高并发,存在线程安全问题.若大量访问请求集中在计数器最后...
  • Java并发编程75道面试题及答案——稳了

    万次阅读 多人点赞 2017-11-16 14:46:09
    Java并发编程75道面试题及答案,看了就是稳。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 78,539
精华内容 31,415
关键字:

怎么处理高并发面试题