发表于: 2017-08-23 13:20:04

2 1080


一.今天完成的主要事情

1.模拟缓存穿透

先说说自己对缓存穿透的理解:缓存穿透就是如果用户查询一个既不在缓存,也不在数据库中的数据,项目接受到请求后,要先在缓存中查询,然后再到数据库中查询,这样缓存没有起到保护数据库的作用.如果请求的并发数比较高,那么会对数据库造成很大的压力.

首先,在controller接口中查询一个既不在缓存,也不在数据库中的数据

根据姓名查询,接口中查询一个根本不在数据库中的数据

其次,修改缓存代码,如图:

如果没有在缓存中查找到数据,就去数据库查找,如果查询数据库返回的结果为空,则不将结果存入缓存,缓存中存放的全部是有效的数据

用Jmeter运行10次查看结果:

可以看到,对每一次请求都会查询数据库,此时缓存没有起到保护数据库的作用.

解决方法:一般有两种,一种是就算数据库查询后的结果为空,那么也依然存放进缓存,这样下次如果查询该条数据,直接从缓存中返回空,还有一种是使用布隆过滤器拦截,即计算出所有有可能的数据的uid,放进一个hashMap中,如果查询的数据不在整个hashMap中,则直接返回空,将请求挡在数据库之外.

这里采用第一种方法,代码也很简单:

将所有从数据库中查询到的数据都放进缓存.运行结果日志:

可以看到,基本都是从缓存返回数据.

这样还有一个问题,如果访问不存在数据的请求量比较大,那么会造成过多的占用内存的情况,解决方式是对于这种请求,设置一个较短的失效时间,防止过多占用内存,所以最终的代码如下:

这样就解决了缓存穿透的问题,但是这也要求在更新数据库的时候一定要同步更新缓存,否则可能会出现缓存和数据库不一致的情况.

2.测试请求在500ms内返回时支持的并发数.

jsp接口

无缓存  无负载均衡

memcached缓存 无负载均衡

redis缓存  无负载均衡

无缓存  nginx负载均衡

memcached缓存   负载均衡

redis缓存   负载均衡

json接口

无缓存  无负载均衡

memcached缓存 无负载均衡

redis缓存  无负载均衡

无缓存  nginx负载均衡

memcached缓存   负载均衡

redis缓存   负载均衡

3.性能测试报告

二.明天计划完成的事情

1.完成任务之后的深度思考

2.提交任务六

3.开始任务七

三.遇到的问题

今天还是没搞明白为什么nginx的响应时间非常慢,在群里问了一圈也没反映,明天再查一查相关资料

师兄

四.收获

以上

五.是否有延期风险

已经延期了,明天结束任务六


返回列表 返回列表
评论

    分享到