文档章节

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

清尘V
 清尘V
发布于 2016/04/13 11:36
字数 1080
阅读 137
收藏 5
点赞 1
评论 0

为什么使用缓存

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

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

缓存穿透

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

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

缓存雪崩

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

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

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

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

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

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

友情链接:个人博客,www.whereta.com

本文转载自:http://my.oschina.net/liuke1556/blog/539010

共有 人打赏支持
清尘V
粉丝 43
博文 107
码字总数 47780
作品 0
青岛
程序员

暂无相关文章

Day 17 vim简介与一般模式介绍

vim简介 vi和Vim的最大区别就是编辑一个文件时vi不会显示颜色,而Vim会显示颜色。显示颜色更便于用户编辑,凄然功能没有太大的区别 使用 yum install -y vim-enhanced 安装 vim的三种常用模式...

杉下 ⋅ 58分钟前 ⋅ 0

【每天一个JQuery特效】根据可见状态确定是否显示或隐藏元素(3)

效果图示: 主要代码: <!DOCTYPE html><html><head><meta charset="UTF-8"><title>根据可见状态确定 是否显示或隐藏元素</title><script src="js/jquery-3.3.1.min.js" ty......

Rhymo-Wu ⋅ 今天 ⋅ 0

OSChina 周四乱弹 —— 初中我身体就已经垮了,不知道为什么

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @加油东溪少年 :下完这场雨 后弦 《下完这场雨》- 后弦 手机党少年们想听歌,请使劲儿戳(这里) @马丁的代码 :买了日本 日本果然赢了 翻了...

小小编辑 ⋅ 今天 ⋅ 12

浅谈springboot Web模式下的线程安全问题

我们在@RestController下,一般都是@AutoWired一些Service,由于这些Service都是单例,所以并不存在线程安全问题。 由于Controller本身是单例模式 (非线程安全的), 这意味着每个request过来,...

算法之名 ⋅ 今天 ⋅ 0

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部