前言

Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。提供了完善的认证机制和方法级的授权功能。是一款非常优秀的权限管理框架。它的核心是一组过滤器链,不同的功能经由不同的过滤器。这篇文章就是想通过一个小案例将Spring Security整合到SpringBoot中去。要实现的功能就是在认证服务器上登录,然后获取Token,再访问资源服务器中的资源。

Cache aside

Cache aside也就是旁路缓存,是比较常用的缓存策略。

(1)读请求常见流程

应用首先会判断缓存是否有该数据,缓存命中直接返回数据,缓存未命中即缓存穿透到数据库,从数据库查询数据然后回写到缓存中,最后返回数据给客户端。

(2)写请求常见流程

首先更新数据库,然后从缓存中删除该数据。

看了写请求的图之后,有些同学可能要问了:为什么要删除缓存,直接更新不就行了?这里涉及到几个坑,我们一步一步踩下去。

Cache aside踩坑

Cache aside策略如果用错就会遇到深坑,下面我们来逐个踩。

踩坑一:先更新数据库,再更新缓存

如果同时有两个写请求需要更新数据,每个写请求都先更新数据库再更新缓存,在并发场景可能会出现数据不一致的情况。

如上图的执行过程:

(1)写请求1更新数据库,将 age 字段更新为18;

(2)写请求2更新数据库,将 age 字段更新为20;

(3)写请求2更新缓存,缓存 age 设置为20;

(4)写请求1更新缓存,缓存 age 设置为18;

执行完预期结果是数据库 age 为20,缓存 age 为20,结果缓存 age为18,这就造成了缓存数据不是最新的,出现了脏数据。

踩坑二:先删缓存,再更新数据库

如果写请求的处理流程是先删缓存再更新数据库,在一个读请求和一个写请求并发场景下可能会出现数据不一致情况。

如上图的执行过程:

(1)写请求删除缓存数据;

(2)读请求查询缓存未击中(Hit Miss),紧接着查询数据库,将返回的数据回写到缓存中;

(3)写请求更新数据库。

整个流程下来发现数据库中age为20,缓存中age为18,缓存和数据库数据不一致,缓存出现了脏数据。

踩坑三:先更新数据库,再删除缓存

在实际的系统中针对写请求还是推荐先更新数据库再删除缓存,但是在理论上还是存在问题,以下面这个例子说明。

如上图的执行过程:

(1)读请求先查询缓存,缓存未击中,查询数据库返回数据;

(2)写请求更新数据库,删除缓存;

(3)读请求回写缓存;

整个流程操作下来发现数据库age为20缓存age为18,即数据库与缓存不一致,导致应用程序从缓存中读到的数据都为旧数据。

但我们仔细想一下,上述问题发生的概率其实非常低,因为通常数据库更新操作比内存操作耗时多出几个数量级,上图中最后一步回写缓存(set age 18)速度非常快,通常会在更新数据库之前完成。

如果这种极端场景出现了怎么办?我们得想一个兜底的办法:缓存数据设置过期时间。通常在系统中是可以允许少量的数据短时间不一致的场景出现。

Read through

在 Cache Aside 更新模式中,应用代码需要维护两个数据源头:一个是缓存,一个是数据库。而在 Read-Through 策略下,应用程序无需管理缓存和数据库,只需要将数据库的同步委托给缓存提供程序 Cache Provider 即可。所有数据交互都是通过抽象缓存层完成的。

如上图,应用程序只需要与Cache Provider交互,不用关心是从缓存取还是数据库。

在进行大量读取时,Read-Through 可以减少数据源上的负载,也对缓存服务的故障具备一定的弹性。如果缓存服务挂了,则缓存提供程序仍然可以通过直接转到数据源来进行操作。

Read-Through 适用于多次请求相同数据的场景,这与 Cache-Aside 策略非常相似,但是二者还是存在一些差别,这里再次强调一下:

  • 在 Cache-Aside 中,应用程序负责从数据源中获取数据并更新到缓存。
  • 在 Read-Through 中,此逻辑通常是由独立的缓存提供程序(Cache Provider)支持。

Write through

Write-Through 策略下,当发生数据更新(Write)时,缓存提供程序 Cache Provider 负责更新底层数据源和缓存。

缓存与数据源保持一致,并且写入时始终通过抽象缓存层到达数据源。

Cache Provider类似一个代理的作用。

Write behind

Write behind在一些地方也被成为Write back, 简单理解就是:应用程序更新数据时只更新缓存, Cache Provider每隔一段时间将数据刷新到数据库中。说白了就是延迟写入

如上图,应用程序更新两个数据,Cache Provider 会立即写入缓存中,但是隔一段时间才会批量写入数据库中。

这种方式有优点也有缺点:

  • 优点是数据写入速度非常快,适用于频繁写的场景。

  • 缺点是缓存和数据库不是强一致性,对一致性要求高的系统慎用。

总目录展示

该笔记共八个节点(由浅入深),分为三大模块。

高性能。 秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。该笔记将从设计数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化这4个方面重点介绍。

一致性。 秒杀中商品减库存的实现方式同样关键。可想而知,有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分为“拍下减库存”“付款减库存”以及预扣等几种,在大并发更新的过程中都要保证数据的准确性,其难度可想而知。因此,将用一个节点来专门讲解如何设计秒杀减库存方案。

高可用。 虽然介绍了很多极致的优化思路,但现实中总难免出现一些我们考虑不到的情况,所以要保证系统的高可用和正确性,还要设计一个PlanB来兜底,以便在最坏情况发生时仍然能够从容应对。笔记的最后,将带你思考可以从哪些环节来设计兜底方案。


篇幅有限,无法一个模块一个模块详细的展示(这些要点都收集在了这份《高并发秒杀顶级教程》里),觉得有需要的码友们,麻烦各位转发一下(可以帮助更多的人看到哟!)点这里,即可获得免费下载的方式!!

由于内容太多,这里只截取部分的内容。需要这份《高并发秒杀顶级教程》的小伙伴,麻烦各位帮忙点赞分享支持一下(可以帮助更多的人看到哟!)
(img-edcfcUk7-1620618426896)]

[外链图片转存中…(img-lOVFTDRe-1620618426896)]

由于内容太多,这里只截取部分的内容。需要这份《高并发秒杀顶级教程》的小伙伴,麻烦各位帮忙点赞分享支持一下(可以帮助更多的人看到哟!)

五面拿下阿里飞猪offer,思维图+核心+架构让你一步到位,全网首发!相关推荐

  1. 五面拿下阿里飞猪offer,kafka生产者参数配置

    Netty实战 无论是想要学习Spring 5 .Spark.Cassandra等这样的系统,还是通过学习Netty来构建自己的基于Java的高性能网络框架,或者是更加具体的高性能Web或者游戏服务器 ...

  2. 五面拿下阿里飞猪offer,熬夜整理Java高频面试题

    前言 Spring如何解决的循环依赖,是近两年流行起来的一道Java面试题.其实笔者本人对这类框架源码题还是持一定的怀疑态度的.如果笔者作为面试官,可能会问一些诸如"如果注入的属性为null ...

  3. 2022最新大厂Java面试集合,五面拿下阿里飞猪offer

    开头 关于程序员,除了做项目.看视频来提高自身的技术之外,还有一种提升自己的专业技能就是:多!看!书!MySQL俨然已经成为了IT技术人员必须掌握的核心技能之一! <MySQL从入门到精通> ...

  4. 五面拿下阿里飞猪offer,java基础入门pdf百度云

    01 如何理解高并发? 高并发意味着大流量,需要运用技术手段抵抗流量的冲击,这些手段好比操作流量,能让流量更平稳地被系统所处理,带给用户更好的体验. 我们常见的高并发场景有:淘宝的双11.春运时的抢票 ...

  5. 五面拿下阿里飞猪offer,java电子书百度云

    01 如何理解高并发? 高并发意味着大流量,需要运用技术手段抵抗流量的冲击,这些手段好比操作流量,能让流量更平稳地被系统所处理,带给用户更好的体验. 我们常见的高并发场景有:淘宝的双11.春运时的抢票 ...

  6. 五面拿下阿里飞猪offer,mongodbmysqlredis

    消息中间件合集:MQ(ActiveMQ/RabbitMQ/RocketMQ)+Kafka+笔记 最近有好多朋友都去投岗秋招提前批,面完回来跟我说碰到消息中间件一类的问题就挂了.额,有点不知所措,于是乎 ...

  7. 五面拿下阿里飞猪offer,java开发程序员

    谈起MyBatis,我先提个问:什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数 ...

  8. 五面拿下阿里飞猪offer,java发送notes邮件

    Redis主从复制 概念 Redis的主从复制概念和MySQL的主从复制大概类似.一台主机master,一台从机slaver.master主机数据更新后根据配置和策略,自动同步到slaver从机,Ma ...

  9. 五面拿下阿里飞猪offer,java图形界面设置背景颜色

    前言 原来,一瞬间,一句话,真的可以改变一个人的命运. 说一个前几年一个热门话题:"是否应该跳出舒适圈." 一时间,这个话题便引发众人议论: 支持方:愿意挑战不擅长领域的人,勇气可 ...

最新文章

  1. 零基础入门学习Python(26)-文件1
  2. 【带你重拾Redis】Redis 主从架构
  3. 接口自动化框架(java)--2.接口用例POST请求,参数配置
  4. html tab选项卡 控件,tab选项卡插件
  5. Centos 6.4搭建svnadmin服务器
  6. MonkeyFest2018 微软最有价值专家讲座
  7. 广州科目三考试 不得不看的十条提醒(图)
  8. 国科大高级人工智能+prml4-CNN
  9. imreadraw的注册
  10. 加快 DHTML 的一组技巧
  11. 空窗2年,中文系萌妹拿下39W测试岗,还和面试官约上了烧烤?!
  12. 36个顶级数据分析方法与模型,学会任意1种,都能让你超越95%的人
  13. Win10应用商店无法加载页面,错误代码0x80131500怎么办
  14. rviz点云渲染卡顿问题
  15. Ultra Light Support
  16. java简单实现布谷鸟过滤器的
  17. 3D灯光教程仅需三个步骤,用ThingJS体验极速开发!
  18. Oracle 日期时间查询
  19. 幽门螺旋杆菌反反复复,该怎么办?
  20. 北大邮箱收件服务器,北京大学网络服务

热门文章

  1. PHP正则表达式之\A、\Z、 \z、^、$
  2. 【mysql 索引】mysql 添加索引
  3. 爬虫“入侵”王者六周年,拿来吧你
  4. mac nginx重启 及相关配置目录
  5. 小马哥------高仿小米Mi Note 出现市场 精仿机 拆机主板图与开机界面图与鉴别方法 真假难辨 购买警惕
  6. 用户画像的设计、开发与应用
  7. 2022升降机司机考试试题模拟考试平台操作
  8. http常见的form表单请求方式
  9. AI数字人:基于VITS模型的中文语音生成训练
  10. 兼容各个浏览器唤起下载APP