点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

在系统设计时,如果能预先看到一些问题,并在设计层面提前解决,就会给后期的开发带来很大的便捷。

一、Session共享问题

单系统中的Session对象可以直接保存在内存中,但在分布式或集群环境下,多个不同的节点就要采取措施来共享Session对象,具体可以使用以下几种方式。

1.Session Replication

Session Replication 是指在客户端第一次发出请求后,处理该请求的服务端就会创建一个与之对应的Session对象,用于保存客户端的状态信息,之后为了让其他服务端也能保存一份此Session对象,就需要将此Session对象在各个服务端节点之间进行同步,如图1所示。

图1 Session Replication

2.Session Sticky

Session Sticky是通过Nginx等负载均衡工具对各个用户进行标记(例如对Cookie标记),使每个用户在经过负载均衡工具后都请求固定的服务节点,如图2所示。

图2 Session Sticky

3.独立Session服务器

可以将系统中所有的Session对象都存放到一个独立的Session服务中,之后各个应用服务再分别从这个Session服务中获取需要的Session对象,如图3所示。在大规模分布式系统中,就推荐使用这种独立Session服务方式。并且这种方式在存储Session对象时,既可以用数据库,也可以使用各种分布式或集群存储系统。

图3 独立Session服务器

 二、缓存穿透与缓存雪崩问题

缓存可以在一定程度上缓解高并发造成的性能问题,但在一些特定场景下缓存自身也会带来一些问题,比较典型的就是缓存穿透与缓存雪崩问题。

1.缓存穿透

缓存穿透是指大量查询一些数据库中不存在的数据,从而影响数据库的性能。例如Redis等KV存储结构的中间件可以作为MySQL等数据库的缓存组件,但如果某些数据没有被Redis缓存却被大量的查询,就会对MySQL带来巨大压力,如图4所示。

图4 缓存穿透

理解了缓存穿透的原因后,解决思路就已经明确了,举例如下。

1)拦截非法的查询请求,仅将合理的请求发送给MySQL。

如,可以使用验证码、IP限制等手段限制恶意攻击,并用敏感词过滤器等拦截不合理的非法查询。

2)缓存空对象。

如,假设在iphone9上市后,可能会导致大量用户搜索iphone9,但此时Redis和MySQL中还没有iphone9这个词。将数据库中不存在的iphone9也缓存在Redis中,如Key=iphone9,value=””。之后当用户再次搜索iphone9时,就可以直接从Redis中拿到结果,从而避免对MySQL的访问,如图5所示。

图5缓存空对象

提示:为了减少Redis对大量空对象的缓存,可以适当减少空对象的过期时间。

3)建立数据标识仓库。

将MySQL中的所有数据的name值都映射成hash值,例如可以将“商品表”中的商品名“iphone8”映射成MD5计算出来的hash值,然后再将全部name的hash值放入Redis中,从而构建出一个“数据库中所有可查数据的hash仓库”。

之后,每次在查询MySQL之前都会先查询这个hash仓库,如果要查询数据的hash值存在于仓库中,再进入MySQL做真实的查询,如果不存在则直接返回。需要注意的是,由于不同数据的hash值在概率上时可能相同的,因此可能会漏掉对个别数据的拦截,如图6中的“B”。

图6 不同数据的Hash值相同而造成的问题

2.缓存雪崩

除了缓存穿透以外,在使用缓存时还需要考虑缓存雪崩的情况。缓存雪崩是指由于某种原因造成Redis突然失效,从而造成MySQL瞬间压力骤增,进而严重影响MySQL性能甚至造成MySQL服务宕机。

可参考使用以下解决方案:

1)搭建Redis集群,保证高可用;

2)避免大量缓存对象的key集中失效,尽力让过期时间分配均匀一些,例如,可以给各个缓存的过期时间乘一个随机数;

3)通过队列、锁机制等控制并发访问MySQL的线程数。

往期推荐

支付宝的架构到底有多牛逼?

Java 常用构建对象的三种方式

Spring Boot 中的 @EnableAutoConfiguration 是如何处理的?

为什么不建议把数据库部署在docker容器内?

BeanUtils 是用 Spring 的还是 Apache 的好?

扫一扫,关注我

一起学习,一起进步

高并发系统设计的 2 个要点,一定要看!相关推荐

  1. 高并发系统设计六(池化技术)

    来想象这样一个场景,一天,公司 CEO 把你叫到会议室,告诉你公司看到了一个新的商业机会,希望你能带领一名兄弟,迅速研发出一套面向某个垂直领域的电商系统. 在人手紧张,时间不足的情况下,为了能够完成任 ...

  2. 面试:高并发系统设计

    面试:高并发系统设计 总览 在高并发的情景下进行系统设计, 可以分为以下 6 点: 系统拆分 熔断 降级 缓存 MQ 分库分表 读写分离 ElasticSearch 系统拆分 将一个系统拆分为多个子系 ...

  3. 惨遭腾讯面试官吊打高并发系统设计,回来学习2400小时后成功复仇!

    去年的金九银十,我和大多数的同行一样加入了升职涨薪的潮水,我早在2个月前就开始准备,我觉得自己在技术方面完全没有问题,于是这两个月我每天在公司摸鱼2小时,回家刷2小时,前前后后刷了几千到面试题,Lee ...

  4. 高并发系统设计十六(消息队列削峰)

    在前面章节,我们了解了高并发系统设计的三个目标:性能.可用性和可扩展性,而在提升系统性能方面,我们一直关注的是系统的查询性能.也用了很多的篇幅去讲解数据库的分布式改造,各类缓存的原理和使用技巧.究其原 ...

  5. 高并发系统设计:通用的设计方法及架构分层

    1.通用设计方法 高并发系统通用的设计方法为拓展.缓存及异步. Scale-out(横向扩展):分而治之是一种常见的高并发系统设计方法,采用分布式部署的方式把流量分流开,让每个服务器都承担一部分并发和 ...

  6. 接招吧,最强“高并发”系统设计 46 连问,分分钟秒杀一众面试者

    接招吧!最强 "高并发" 系统设计 46 连问,分分钟秒杀一众面试者! 谈起 "高并发" 系统设计 相关知识,我想你必须要认知到的一个问题是:它是你获取一线大厂 ...

  7. 接招吧!最强“高并发”系统设计 46 连问,分分钟秒杀一众面试者

    谈起 "高并发" 系统设计 相关知识,我想你必须要认知到的一个问题是:它是你获取一线大厂Offer 必不可少的利器!!对于各大公司(比如阿里.腾讯.今日头条等)来说,仅仅懂得CRU ...

  8. 接招吧。最强“高并发”系统设计 46 连问,分分钟秒杀一众面试者

    java学习思维导图骆驼祥子思维导图 - GitMind<-- 谈起 "高并发" 系统设计 相关知识,我想你必须要认知到的一个问题是:它是你获取一线大厂Offer 必不可少的 ...

  9. 高并发系统设计40问 - 学习/实践

    1.应用背景 用于学习和掌握开发高并发高可用[易维护]系统的知识体系,并快速高效开发三高的系统. 2.学习 目录 开篇词 (1讲) 开篇词 | 为什么你要学习高并发系统设计? 基础篇 (6讲) 01 ...

最新文章

  1. ERROR: Manifest merger failed : uses-sdk:minSdkVersion 24 cannot be smaller than version 27 declared
  2. mysql2005备份_创建完整数据库备份 - SQL Server | Microsoft Docs
  3. 我的服务器有硬件防火墙,而且只开了80端口,是不会有网络安全问题的
  4. ethereumjs/ethereumjs-vm-4-tests
  5. 关键路径法及C语言实现
  6. DLX (Dancing Links/舞蹈链)算法——求解精确覆盖问题
  7. secureCRT中文字符乱码
  8. 【注册机】ColorSchemer Studio 2.1.0 注册机
  9. BZOJ 3282 Link Cut Tree (LCT)
  10. Django 配置出错模板
  11. 江西 高职 分数 计算机,快讯!江西高职(专科)批次各高校投档分数线出炉…...
  12. 如何在分组报表中实现组内数据补空行及组内页码
  13. 接上一篇:Java实现导出Excel并附带水印
  14. pr cc 2018的快捷键整理
  15. ajax传参中文乱码问题解决
  16. 【五年】Java打怪升级之路
  17. php获取企业微信聊天内容,微信企业号开发获取用户信息的介绍
  18. 人工智能实践:Tensorflow2.0笔记 北京大学MOOC(1-1)
  19. 我也就是尝试了一下斗图的快乐
  20. JS计算字符串在浏览器中显示的宽度

热门文章

  1. golang 判断目录是否为空
  2. golang post get 请求 简介
  3. linux shell 把一个文件的前n行 拷贝到另一个文件中
  4. linux cpu拓扑查看工具 hwloc 简介
  5. linux 问题 value too large for defined data type 解决方案
  6. linux ATT汇编 与 Intel汇编 语法格式对比
  7. linux IO多路复用 select epoll
  8. java设计模式---模板方法模式
  9. Android 控件学习--自定义SeekBar
  10. TCP/IP详解--学习笔记(12)-TCP的超时与重传