缓存
页面缓存
页面缓存的有效期比较短,因为页面具有即时性
- 取缓存
- 手动渲染模版
- 结果输出
URL缓存
与页面缓存的区别就是不同的页面有不同的id啦
对象缓存
根据缓存取一个对象,对象缓存期望永久有效
- 取缓存
- 若缓存中没有,取数据库,并且加载进缓存
- 如果是更新操作,一定要记得处理缓存
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建立唯一索引,防止用户插入重复记录。但现实中,会使用验证码解决,不让用户发出两个请求。
静态资源优化
- JS/CSS压缩,减少流量
- 多个JS/CSS组合,减少连接数
CDN优化
内容分发网络,约等于缓存,在整个互联网上有很多节点,把数据在每个节点上都做一次缓存。根据用户的位置,将用户的请求定位到最近的CDN镜像上。
总结
解决并发大
瓶颈在于数据库,最有效的办法是加缓存
用户发起请求,浏览器上通过页面静态化直接把页面缓存到浏览器端;请求到达网站之前,可以部署CDN节点让请求首先访问CDN;网站方面nginx也可以加缓存;应用程序里页面缓存,页面缓存再细粒度一点就是对象缓存。最后才到数据库。削减到数据库的数量。
网友评论