秒杀:页面优化

作者: Aniwer | 来源:发表于2020-11-13 12:16 被阅读0次

    缓存

    页面缓存

    页面缓存的有效期比较短,因为页面具有即时性

    1. 取缓存
    2. 手动渲染模版
    3. 结果输出

    URL缓存

    与页面缓存的区别就是不同的页面有不同的id啦

    对象缓存

    根据缓存取一个对象,对象缓存期望永久有效

    1. 取缓存
    2. 若缓存中没有,取数据库,并且加载进缓存
    3. 如果是更新操作,一定要记得处理缓存
      service之间一定是调别人的service,不要调用别人的dao,因为在service中可能会涉及缓存操作,而dao是纯数据库

    Cache Aside Pattern

    失效:从cache中取数据,如果没取到,则从数据库中取,成功后放入缓存
    命中:从cache中取到了数据,取到后返回
    更新:先把数据存到数据库中,成功后再让缓存失效
    一定不能先让缓存失效,再更新数据库

    页面静态化,前后端分离

    页面为纯HTML,使用js ajax请求数据来渲染页面
    常用技术AngularJs、Vue.js
    静态数据可以缓存到客户端,从服务器只需下载动态数据

    GET POST的区别
    get是幂等的,从服务端获取数据时无论调用多少次结果都一样,不会对服务端产生任何影响
    post向服务端提交数据,会对服务端数据产生改变

    304
    客户端向服务端询问静态页面有没有发生变化,没有变化服务端就返回304表示从而让客户端可以直接使用本地缓存
    但尽管304客户端和服务端还是会有一次交互,怎么客户端直接从浏览器取数据,不需要询问服务端呢? spring有相关的配置,可以直接取浏览器缓存

    超卖问题的解决

    • 秒杀service中,步骤为减库存、下订单,如果两个线程同时进入秒杀方法,要减库存,就会出现超卖问题。
      数据库update时增加stock_count > 0限制条件。因为数据库会自动加锁,不会有两个线程同时进入。
    • 一个用户通过抓取接口同时发起两个请求,秒杀到两个商品。
      在数据库的秒杀订单表上,为用户Id和商品Id建立唯一索引,防止用户插入重复记录。但现实中,会使用验证码解决,不让用户发出两个请求。

    静态资源优化

    1. JS/CSS压缩,减少流量
    2. 多个JS/CSS组合,减少连接数

    CDN优化

    内容分发网络,约等于缓存,在整个互联网上有很多节点,把数据在每个节点上都做一次缓存。根据用户的位置,将用户的请求定位到最近的CDN镜像上。

    总结

    解决并发大
    瓶颈在于数据库,最有效的办法是加缓存
    用户发起请求,浏览器上通过页面静态化直接把页面缓存到浏览器端;请求到达网站之前,可以部署CDN节点让请求首先访问CDN;网站方面nginx也可以加缓存;应用程序里页面缓存,页面缓存再细粒度一点就是对象缓存。最后才到数据库。削减到数据库的数量。

    相关文章

      网友评论

        本文标题:秒杀:页面优化

        本文链接:https://www.haomeiwen.com/subject/pcpvbktx.html