文档章节

关于缓存使用中的一些看法

saintatgod
 saintatgod
发布于 2015/12/03 18:16
字数 1087
阅读 2179
收藏 157

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

为什么使用缓存

一般情况下,在访问量达到一定规模后,数据库的读写会成为一个瓶颈,我们会采用一些手段来对数据库减压,让它可以正常的工作。可以考虑的手段包括读写分离、添加缓存服务器等,读写分离是为了尽量将对数据库的读写动作分开,减少互相之间的影响;添加缓存是为了读库的时候,减少直接读取数据库的动作,将查询的结果存放在缓存中,用户的请求被隔绝在数据库以外,从而减少数据库的压力。

这是一个理想状况下缓存工作的方式,但仅仅是理想

缓存穿透

所谓缓存穿透,是说用户请求在缓存系统中查找结果时候失效,接下来去后端存储系统中查找数据,这个时候,如果数据不存在,而且这个访问也比较大的情况下,大量的访问会直接命中数据库,这时候负责存储的服务器就悲剧了(如果左图),所以我们就需要做一些努力,使得当数据不存在,往缓存中写入一个标志抑或将空的查询结果存入缓存,减少这种无用的请求频繁命中数据库的情况(如右图)

也可以将确认为空或者空的查询结果存储到单独的缓存区域中。

缓存雪崩

这是另外一个问题,当系统使用的缓存发生意外(网络失败、宕机、服务挂掉、缓存集体丢失等等)之后,缓存集体失效,导致短时间内请求都到达数据库(数据存储层),使得数据库压力山大进而crash掉。

为了预防这种情况,我们采用一下几种方式:

1、我们采用多实例的方式来保证缓存的高可用性,尽量避免当个别实例出现问题之后,引起全局缓存的问题。这类方案很多,比如memcache的一致性hash,redis的cluster机制,来避免单点的故障,这类资料可以搜索一下关于redis或者memcache的高可用方案。

2、降级机制。这个方法在很多高可用设计中可能也有描述,简单一点说就是我们将用户与用户之间,资源与资源之间进行隔离,当某一部分数据产生问题之后或者对某一部分的请求到达一个阀值之后,根据预设的机制,对请求只返回热点数据,保证客户端不会产生天窗或者说一直无法响应的问题。

3、加锁。对于到达的请求,我们用锁的机制,来尽量使它们排队处理从而减少对数据库产生并发。可以参考的锁方案有两种,一种是使用全局锁或者字符串锁等方案,是一个请求进行操作的时候,其他的请求处于等待状态,当这个请求处理完毕之后进行下一步的业务处理,但是这样的话如果一个请求挂掉,会对后面排队的请求产生影响,而且请求的处理可能不会短时间处理完毕,会导致请求阻塞的时间过长等问题,第二种方案就是在进行操作的时候,其他请求进来的时候判断是否有锁存在,如果存在直接跳过处理,返回热点数据。

需要说的是降级机制未必要放到图中这个位置,也可以放在缓存之前或其他的位置,它的主要目的是当出现问题时候隔离掉出现问题的资源不影响客户端的内容或者使一部分用户的请求无法到达真正的业务逻辑从而减少业务处理的压力。

如果有其他的看法欢迎与我交流:saintatgod@gmail.com


© 著作权归作者所有

saintatgod
粉丝 20
博文 32
码字总数 10455
作品 0
东城
程序员
私信 提问
加载中

评论(10)

张寒枫
张寒枫

引用来自“saintatgod”的评论

引用来自“张寒枫”的评论

引用来自“saintatgod”的评论

引用来自“Tex”的评论

有两个问题麻烦帮忙解答下
1.缓存穿透,如果有人恶意的随机访问某些资源该如何处理?
2.缓存雪崩里的返回热点资源是指缓存吗,不是说缓存都失效了吗?
1、恶意访问的问题,需要有ip黑名单机制,如果有可疑行为就可以考虑将这个ip暂时放到黑名单里。在设计用户登陆的时候,为了防止撞库采用个这个方案,那个博文里面有描述这个问题。 2、缓存雪崩返回热点数据的前提是资源隔离,提高缓存系统的高可用,热点数据可以放在缓存,也可以放在其他的nosql,主要目的是实现在出现并发高的情况下,可以使部分用户隔离在业务之外。 这是一点愚见,希望不会误导你。

为啥不用bloomfilter,IP黑名单阈值很难设定,设置小了误杀,设置大了拦不住,互联网http代理非常多,别人挂代理来刷更拦不住,bloomfilter虽然也会误杀单是处理方式简单的多
恩,你的意思是来检查提交地址来路呢,还是说其他?

把查询条件数据用bloomfilter训练一下
rungo14
rungo14

引用来自“张寒枫”的评论

引用来自“saintatgod”的评论

引用来自“Tex”的评论

有两个问题麻烦帮忙解答下
1.缓存穿透,如果有人恶意的随机访问某些资源该如何处理?
2.缓存雪崩里的返回热点资源是指缓存吗,不是说缓存都失效了吗?
1、恶意访问的问题,需要有ip黑名单机制,如果有可疑行为就可以考虑将这个ip暂时放到黑名单里。在设计用户登陆的时候,为了防止撞库采用个这个方案,那个博文里面有描述这个问题。 2、缓存雪崩返回热点数据的前提是资源隔离,提高缓存系统的高可用,热点数据可以放在缓存,也可以放在其他的nosql,主要目的是实现在出现并发高的情况下,可以使部分用户隔离在业务之外。 这是一点愚见,希望不会误导你。

为啥不用bloomfilter,IP黑名单阈值很难设定,设置小了误杀,设置大了拦不住,互联网http代理非常多,别人挂代理来刷更拦不住,bloomfilter虽然也会误杀单是处理方式简单的多

e
saintatgod
saintatgod 博主

引用来自“张寒枫”的评论

引用来自“saintatgod”的评论

引用来自“Tex”的评论

有两个问题麻烦帮忙解答下
1.缓存穿透,如果有人恶意的随机访问某些资源该如何处理?
2.缓存雪崩里的返回热点资源是指缓存吗,不是说缓存都失效了吗?
1、恶意访问的问题,需要有ip黑名单机制,如果有可疑行为就可以考虑将这个ip暂时放到黑名单里。在设计用户登陆的时候,为了防止撞库采用个这个方案,那个博文里面有描述这个问题。 2、缓存雪崩返回热点数据的前提是资源隔离,提高缓存系统的高可用,热点数据可以放在缓存,也可以放在其他的nosql,主要目的是实现在出现并发高的情况下,可以使部分用户隔离在业务之外。 这是一点愚见,希望不会误导你。

为啥不用bloomfilter,IP黑名单阈值很难设定,设置小了误杀,设置大了拦不住,互联网http代理非常多,别人挂代理来刷更拦不住,bloomfilter虽然也会误杀单是处理方式简单的多
恩,你的意思是来检查提交地址来路呢,还是说其他?
张寒枫
张寒枫

引用来自“saintatgod”的评论

引用来自“Tex”的评论

有两个问题麻烦帮忙解答下
1.缓存穿透,如果有人恶意的随机访问某些资源该如何处理?
2.缓存雪崩里的返回热点资源是指缓存吗,不是说缓存都失效了吗?
1、恶意访问的问题,需要有ip黑名单机制,如果有可疑行为就可以考虑将这个ip暂时放到黑名单里。在设计用户登陆的时候,为了防止撞库采用个这个方案,那个博文里面有描述这个问题。 2、缓存雪崩返回热点数据的前提是资源隔离,提高缓存系统的高可用,热点数据可以放在缓存,也可以放在其他的nosql,主要目的是实现在出现并发高的情况下,可以使部分用户隔离在业务之外。 这是一点愚见,希望不会误导你。

为啥不用bloomfilter,IP黑名单阈值很难设定,设置小了误杀,设置大了拦不住,互联网http代理非常多,别人挂代理来刷更拦不住,bloomfilter虽然也会误杀单是处理方式简单的多
王爵nice
王爵nice
收藏了
saintatgod
saintatgod 博主

引用来自“Tex”的评论

有两个问题麻烦帮忙解答下
1.缓存穿透,如果有人恶意的随机访问某些资源该如何处理?
2.缓存雪崩里的返回热点资源是指缓存吗,不是说缓存都失效了吗?
1、恶意访问的问题,需要有ip黑名单机制,如果有可疑行为就可以考虑将这个ip暂时放到黑名单里。在设计用户登陆的时候,为了防止撞库采用个这个方案,那个博文里面有描述这个问题。 2、缓存雪崩返回热点数据的前提是资源隔离,提高缓存系统的高可用,热点数据可以放在缓存,也可以放在其他的nosql,主要目的是实现在出现并发高的情况下,可以使部分用户隔离在业务之外。 这是一点愚见,希望不会误导你。
Tex
Tex
有两个问题麻烦帮忙解答下
1.缓存穿透,如果有人恶意的随机访问某些资源该如何处理?
2.缓存雪崩里的返回热点资源是指缓存吗,不是说缓存都失效了吗?
zhangqunshi
zhangqunshi
good
JasonSE
JasonSE
不错!
西南茂
西南茂
好评,新手就需要这样通俗易懂的文章
使用CDN是否会对网站产生负面影响

关于CDN的使用有两种看法,有的认为CDN可以提高网站的加载速度,提升用户体验,有的人认为网站使用CDN后会导致搜索引擎的抓取数据下降。CDN ip的多样性可能对蜘蛛并不友好。CDN的缓存特性可能...

上树的熊
2018/08/24
19
0
基础工具--Guava-Libraries学习笔记(一)

什么是Guava-Libraries? Guava-Libraries是google对java的一个扩展,主要涵盖集合、缓存、并发、I/O、反射等等。 它本来是Google内部所使用的一个类库,后来整理开源出来了。这套库的设计引...

长平狐
2013/11/25
4.7K
0
关于Spring的缓存问题

项目中应用了Spring的Cacheable,按照Spring的文档配置的,怎么就不起作用了呢?大家都Spring的缓存有什么看法,用着怎么样?文档说可以与ehcache整合到一起用,有用过的话,谈谈你的想法。如...

IT_小翼
2012/09/29
534
2
webpack使用的一些看法

最近在使用webpack来作为前端开发的自动构建工具,对webpack有一些理解,这里跟大家分享一下。 一、为什么要用webpack 一开始是处于好奇和学习的心态,但是在了解和学习的过程中发现,作为一...

subying
2016/05/19
1K
0
关于用引用计数法写缓存的一点看法

最近看了一个用go写的数据库NYADB2, github地址:https://github.com/qw4990/NYADB2。 看到作者关于存储模块的缓存用了引用计数法来写,而不是常用的LRU算法。 他在缓存部分用了二级缓存。 ...

SeaRise
2018/05/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周四乱弹 —— 浙江台的电话号码倒是记得挺牢

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :《Out On The Streets》 一直不理解北欧人对重金属和死亡摇滚的热情,听完这首歌好像理解了。#今日歌曲推荐# 《Out On The Stre...

小小编辑
今天
5
0
Leetcode PHP题解--D121 21. Merge Two Sorted Lists

D121 21. Merge Two Sorted Lists 题目链接 21. Merge Two Sorted Lists 题目分析 合并两个有序链表。 思路 逐个遍历两个链表,把小的数字塞入数组里。之后再拼起来。 最终代码 <?php/** *...

skys215
今天
5
0
mars-config 动态配置管理

mars-config 码云地址:https://gitee.com/fashionbrot/mars-config 介绍 spring mvc 、springboot 动态配置系统。http 轮训方式 更新 动态配置 软件架构 软件架构说明 后端使用技术 :sprin...

fashionbrot
今天
14
0
女朋友玩吃鸡手游被开挂老哥骗炮,我见义勇为将骗子绳之以法

大家好,我是乔哥。 晚上10点以后下班后我回到自如出租房里面,开始处理公众号粉丝发来的消息,一条一条处理,突然看到了这么几条消息,吸引了我的眼球: 然后我就和这位女粉丝小红(化名)聊...

gzc426
今天
9
0
两款软件

fadetop保护眼睛软件 Snipaste截图软件

伟大源于勇敢的开始
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部