面试题——高并发

处理高并发的六种方法

  1. 系统拆分,将一个系统拆分为多个子系统,用dubbo来搞。然后每个系统连一个数据库,这样本来就一个库,现在多个数据库,这样就可以抗高并发。
  2. 缓存,必须得用缓存。大部分的高并发场景,都是读多写少,那你完全可以在数据库和缓存里都写一份,然后读的时候大量走缓存不就得了。毕竟人家redis轻轻松松单机几万的并发啊。没问题的。所以你可以考的虑考虑你的项目里,那些承载主要请求读场景,怎么用缓存来抗高并发。
  3. MQ(消息队列),必须得用MQ。可能你还是会出现高并发写的场景,比如说一个业务操作里要频繁搞数据库几十次,增删改增删改,疯了。那高并发绝对搞挂你的系统,人家是缓存你要是用redis来承载写那肯定不行,数据随时就被LRU(淘汰掉最不经常使用的)了,数据格式还无比简单,没有事务支持。所以该用mysql还得用mysql啊。那你咋办?用MQ吧,大量的写请求灌入MQ里,排队慢慢玩儿,后边系统消费后慢慢写,控制在mysql承载范围之内。所以你得考虑考虑你的项目里,那些承载复杂写业务逻辑的场景里,如何用MQ来异步写,提升并发性。MQ单机抗几万并发也是ok的。
  4. 分库分表,可能到了最后数据库层面还是免不了抗高并发的要求,好吧,那么就将一个数据库拆分为多个库,多个库来抗更高的并发;然后将一个表拆分为多个表,每个表的数据量保持少一点,提高sql跑的性能。
  5. 读写分离,这个就是说大部分时候数据库可能也是读多写少,没必要所有请求都集中在一个库上吧,可以搞个主从架构,主库写入,从库读取,搞一个读写分离。读流量太多的时候,还可以加更多的从库。
  6. solrCloud:SolrCloud(solr 云)是Solr提供的分布式搜索方案,可以解决海量数据的 分布式全文检索,因为搭建了集群,因此具备高可用的特性,同时对数据进行主从备份,避免了单点故障问题。可以做到数据的快速恢复。并且可以动态的添加新的节点,再对数据进行平衡,可以做到负载均衡。
### Java高并发解决方案 #### 数据库层面优化 为了应对高并发场景下的数据库压力,可以采用多种技术手段。分布式数据库是一种常见的方式,通过主从复制、读写分离以及负载均衡来分担流量压力[^4]。具体来说,在M-M-S架构中,两个主节点只有一个处于活动状态(Active),当其中一个节点失效时,另一个能够迅速接管其职责。此外,对于大规模数据表,可以通过库表散列将其拆分为多个子表或存储于不同的物理设备上,从而提升访问效率并减少单点瓶颈。 #### 缓存机制引入 除了传统的数据库操作外,还可以借助缓存层缓解后台系统的负担。例如Redis作为高效的键值对存储工具被广泛应用于实际项目当中,用来保存热点数据副本,避免频繁地查询磁盘上的持久化记录[^4]。与此同时,合理配置数据库连接池参数也很重要,这样既可以满足瞬时高峰需求又不会浪费资源。 #### 并发控制与同步原语 针对多线程环境下的资源共享问题,则需依赖诸如`volatile`这样的轻量级修饰符确保变量修改后的即时可见性;而深入理解JMM(java memory model)有助于开发者正确判断哪些情况下可能发生指令重排序现象及其规避措施——即遵循happens-before关系定义逻辑执行顺序[^1]。另外,利用阻塞队列(BlockedQueue)家族成员构建生产者-消费者模型也是处理异步任务流的有效途径之一,因为它们本身具备良好的线程安全性保障[^3]。 #### 动态内存管理特性 值得一提的是,尽管堆空间提供了灵活可变大小的优点便于程序运行期间按需申请额外容量,但由于每次分配都需要消耗一定时间成本故而在极端条件下仍可能导致性能波动甚至GC停顿等问题出现[^2]。因此设计之初就应该充分考虑目标应用场景特点,并据此做出适当权衡调整。 ```java // 使用ReentrantLock代替synchronized块实现显式锁定 public class Counter { private int count = 0; private final ReentrantLock lock = new ReentrantLock(); public void increment() { lock.lock(); // 获取锁 try { count++; } finally { lock.unlock(); // 确保最终释放锁 } } public int getCount(){ return count; } } ``` 以上代码片段展示了如何运用显示锁(`ReentrantLock`)而非隐式的`sychronized`关键字来进行细粒度的互斥保护,这往往能带来更好的灵活性和扩展能力特别是在复杂业务流程里头。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值