在项目中缓存是如何使用的?缓存如果使用不当会造成什么后果?
(1)在项目中缓存是如何使用的?
这个,你结合你自己项目的业务来,你如果用了那恭喜你,你如果没用那不好意思,你硬加也得加一个场景吧
(2)为啥在项目里要用缓存呢?
用缓存,主要是俩用途,高性能和高并发
1)高性能

假设这么个场景,你有个操作,一个请求过来,吭哧吭哧你各种乱七八糟操作mysql,半天查出来一个结果,耗时600ms。但是这个结果可能接下来几个小时都不会变了,或者变了也可以不用立即反馈给用户。那么此时咋办?
缓存啊,折腾600ms查出来的结果,扔缓存里,一个key对应一个value,下次再有人查,别走mysql折腾600ms了。直接从缓存里,通过一个key查出来一个value,2ms搞定。性能提升300倍。
这就是所谓的高性能。
就是把你一些复杂操作耗时查出来的结果,如果确定后面不咋变了,然后但是马上还有很多读请求,那么直接结果放缓存,后面直接读缓存就好了。
2)高并发

mysql这么重的数据库,压根儿设计不是让你玩儿高并发的,虽然也可以玩儿,但是天然支持不好。mysql单机支撑到2000qps也开始容易报警了。
所以要是你有个系统,高峰期一秒钟过来的请求有1万,那一个mysql单机绝对会死掉。你这个时候就只能上缓存,把很多数据放缓存,别放mysql。缓存功能简单,说白了就是key-value式操作,单机支撑的并发量轻松一秒几万十几万,支撑高并发so easy。单机承载并发量是mysql单机的几十倍。
3)所以你要结合这俩场景考虑一下,你为啥要用缓存?
一般很多同学项目里没啥高并发场景,那就别折腾了,直接用高性能那个场景吧,就思考有没有可以缓存结果的复杂查询场景,后续可以大幅度提升性能,优化用户体验,有,就说这个理由,没有??那你也得编一个出来吧,不然你不是在搞笑么
(3)用了缓存之后会有啥不良的后果?
呵呵。。。你要是没考虑过这个问题,那你就尴尬了,面试官会觉得你头脑简单,四肢也不发达。你别光是傻用一个东西,多考虑考虑背后的一些事儿。
常见的缓存问题有仨(当然其实有很多,我这里就说仨,你能说出来也可以了)
1)缓存与数据库双写不一致
2)缓存雪崩
3)缓存穿透
4)缓存并发竞争
场景一、商品分类导航缓存
需求分析
为了提升首页的加载速度,减轻数据库访问压力,我们将首页的商品分类导航数据加载在缓存中。
实现思路
为了避免缓存穿透、击穿等问题,我们采用缓存预热的方式实现对分类导航数据的缓存。
考虑到商品分类导航数据不经常变动,所以我们不设置过期时间。
场景二、广告轮播图缓存
需求分析
为了提升首页的加载速度,减轻数据库访问压力,我们将首页的广告轮播图数据加载在缓存中。
实现思路
使用“缓存预热”的方式实现
广告数据不只是轮播图,我们可以使用hash来存储广告数据。
场景三、商品详细页价格缓存
需求分析
我们已经将商品的信息生成为静态页面,但是商品价格经常变动,如果每次价格变动后都对静态页重新生成会影响服务器性能。所以,对于商品价格,我们采用异步调用的方式来进行客户端渲染。
实现思路
(1)商品服务启动后加载全部价格数据到缓存。使用hash存储,skuID作为小KEY
(2)从缓存从查询商品价格,封装为controller,并设置可跨域调用
什么叫跨域?
当协议、子域名、主域名、端口号中任意一个不相同时,都算作不同域。不同域之间相
互请求资源,就算作“跨域”。

JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。那什么是跨域呢,简单地理解就是因为JavaScript同源策略的限制,a.com域名下的js无法操作b.com或是c.a.com域名下的对象。
当协议、子域名、主域名、端口号中任意一个不相同时,都算作不同域。不同域之间相互请求资源,就算作“跨域”。
现在我们要实现的查询商品价格缓存功能就存在跨域问题。后端controller在http://www.qingcheng.com ,商品详细页在http://item.qingcheng.com
如何解决跨域问题?我们使用CORS实现跨域。
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest 请求,从而克服了AJAX只能同源使用的限制。使用非常简单,只需要在controller类上添加一个@CrossOrigin注解即可
(3)修改商品详细页模板,使用ajax读取价格,并进行客户端渲染。

浙公网安备 33010602011771号