最近工做上遇到个问题,从用户A切换到用户B,结果用户B显示的仍是用户A的数据;前端
问题的缘由很简单,用户B使用的仍是用户A的缓存数据,解决方案也很简单,独立保存一份缓存便可;redis
可是,不禁的想问,缓存测试这块,须要注意什么?数据库
那先慢慢了解,到底什么是缓存?后端
缓存是咱们在生活中常常听到一个词,如怎么清理浏览器的缓存
,手机空间不够了,得删除缓存
,硬盘的缓存是否是越大越好
等等的问题;浏览器
其实这些缓存
能够分红3种:缓存
后两种更像是一种技术或者是服务;bash
缓存是临时存放数据(使用频繁的数据)的地方,介于外部请求和真实数据之间;服务器
从一个用户的角度来看,体验最好的确定是无论什么状况下,都能成功访问这个页面,而且打开的速度很快,也就是保证正常工做的前提下时间尽量短;网络
若是没有缓存,咱们的体验多是这样的:并发
用户请求一个数据,这个数据得从数据库中去取,随着用户愈来愈多和数据量愈来愈大,每次用户请求的时间就会愈来愈长,并且数据库无时不刻都在工做;
这样用户和数据库都很痛苦,时间一长,就有可能发生下面两件事情:
1)用户很烦,抱怨页面加载太慢或者打不开,最后放弃了这个应用;
2)数据库满负荷工做,偶尔崩溃(致使页面错误);
分析缘由,是因为数据库的链接数和链接时长是有限制的,但请求过多,超出了数据库能承受的范围,致使数据库崩溃;
那为何不把一部分数据放在别的地方,这样有用户请求这些数据时,就不用从数据库中取了?
复制代码
当客户端向服务器请求一个资源时,服务器首先在缓存中找,若是在缓存中,那么直接返回,不须要链接数据库;
若是请求的资源不在缓存中,这时再去数据库中找,找到后返回给客户端,并将这个资源加入缓存中;
这样下次请求相同资源时,就不须要链接数据库了。并且若是把缓存放在内存中,由于对内存的操做要比对数据库操做快得多,这样请求时间也会缩短;
复制代码
因此,经过使用缓存,就能够保证知足用户的需求,在正常工做的前提下响应时间尽量短;
特别须要注意缓存失效的场景,如:
缓存分为两类:强制缓存和协商缓存,定义以下:
缓存由http报文的内容决定,关系以下:
max-age
或者expires
都决定了缓存的过时时间,会使客户端再次请求数据时先判断缓存是否过时,未过时则直接从缓存中读取数据(强制缓存);
二者的区别是前者是个相对值,相对于客户端的时间,后者直接定义了截止时间,且相对于服务端的时间;
协商缓存由Last-Modified
、If-Modified-Since
或 ETag
、If-None-Match
两组报文决定;
字段的意思分别以下:
Last-Modified
:表示服务器上某文件最近的修改时间,存在于响应报文;If-Modified-Since
:值等于Last-Modified
,存在于请求报文,用于将Last-Modified
值返回给服务端做比较;首次请求资源:
非首次请求资源:
在第一次请求资源后,浏览器会将资源连同响应报文一块儿缓存到本地,其中响应报文可能包含了关于缓存的头信息;
于是后续请求的时候,浏览器能够根据本地缓存的头信息知道资源的缓存决策,判断是否强制缓存,或者移交服务器判断是否协商缓存;
在服务器缓存里面,有3个特殊的名词:缓存穿透、缓存击穿、缓存雪崩;
这3个究竟是什么?
正常状况下,查询的数据都存在,若是请求一个不存在的数据,也就是缓存和数据库都查不到这个数据,每次都会去数据库查询,这种查询不存在数据的现象称为缓存穿透;
穿透带来的问题
若是每次都拿一个不存在的id去查询数据库,可能会致使你的数据库压力增大;
如何发现缓存穿透
解决办法--缓存空值
之因此发生穿透,是由于缓存中没有存储这些数据的key,从而每次都查询数据库;
能够为这些key在缓存中设置对应的值为null,后面查询这个key的时候就不用查询数据库了;
固然为了健壮性,咱们要对这些key设置过时时间,以防止真的有数据;
复制代码
在高并发的状况下,大量的请求同时查询同一个key时,此时这个key正好失效了或者不存在,就会致使同一时间,这些请求都会去查询数据库,这样的现象称为缓存击穿;
好比请求一些特殊字符,就会出现该状况;
引发的缘由
带来的问题
会形成某一时刻数据库请求量过大;
解决办法
采用分布式锁,只有拿到锁的第一个线程去请求数据库,而后插入缓存,若其它线程获取锁失败,则等待一段时间后重试;
当某一时刻发生大规模的缓存失效的状况,好比缓存服务宕机了;
解决方法
在设置缓存的时候,通常会给缓存设置一个失效时间,过了这个时间,缓存就失效了;
对于一些热点的数据来讲,当缓存失效之后会存在大量的请求过来,而后打到数据库去,从而可能致使数据库崩溃的状况;
解决办法
功能:
自动化:
性能及稳定性:
扩容:
环境:
无网络&有数据:
无网络&无数据:
有网络&有数据:
有网络&无数据:
缓存存储:
异常状况:
以前没深刻了解过缓存,真的没有覆盖那么多场景,基本都须要了解技术细节,才能设计出这样的测试场景,偏后台内部逻辑的测试;