热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

缓存的三个问题

缓存的作用是在内存中临时存储来自外部系统(如数据库)的数据,以便让请求更快的得到响应。如果请求数据在缓存中不存在,或者已经超时失效,那么也要从外部系统查询,然后放入缓存中,这个过程

缓存的作用是在内存中临时存储来自外部系统(如数据库)的数据,以便让请求更快的得到响应。如果请求数据在缓存中不存在,或者已经超时失效,那么也要从外部系统查询,然后放入缓存中,这个过程叫刷新缓存。

这是缓存的基本使用逻辑,但是实际当中可能出现三种异常情况,它们会导致缓存起不到预期的使用效果,以至于系统性能明显下降。

缓存命中率过低

缓存命中率指的是从缓存中找到数据的请求占所有请求的比重。例如 100 个请求当中有 90 个请求的结果可以直接从缓存中获得,那么命中率就是 90%。剩下 10% 的请求就要从外部系统查询数据,填入缓存,然后再返回。

什么情况下缓存命中率高呢?请求的数据比较集中的时候,例如 80% 的请求集中在 20% 的数据上,这部分数据也被称作热点之类的。热点越热,缓存命中率越高。

因此之所以出现缓存命中率过低,自然就是因为热点不够热,请求的数据非常分散。命中率过低的后果就是很多请求的数据仍需从外部系统查询,假如是数据库的话,数据库的压力就会非常大,同时系统的响应也明显变慢。

要缓解缓存命中率过低的问题,最直接的办法当然是加大缓存。本地缓存不够,就用分布式缓存,多台机器分开存储。

特例一:分散攻击

有时候系统正常情况下是存在热点数据的,但突然有一天出现大量的分散请求,导致缓存命中率直线下降。这些异常的请求可以看作是有意的攻击行为,目的就是让系统无法响应。

而遇到攻击行为的话,加大缓存可能是徒劳的,这时候需要去识别请求,对于被归类为攻击的请求主动延长响应时间,甚至拒绝返回结果。

比如说一个论坛,突然遇到大量请求,均匀的访问五年内的帖子内容,导致数据库负载很大,此时可以将访问老帖子的请求(帖子ID通常是递增的,ID越小表示发帖时间越久)返回时间适当延长,比如延长到五分钟。不过使用这种做法时千万不要简单的暂停线程,这会导致没有多余的线程来处理正常的请求。

特例二:无效的 key

有时候系统收到大量请求,这些请求的数据非但缓存中没有,连数据库也没有,那么每个请求不但因为缓存未命中而去查询数据库,而且因为数据库没有记录而无法填充到缓存。这是更加恶劣的情况。

遇到这种情况,同样需要鉴别无效的请求。对于 key 自增的情况,可以通过值范围来鉴别;而对于使用 UUID 的情况,就需要低成本的鉴别方式,布隆过滤器是一个选择。

大量缓存项同时刷新

缓存通常都是存在失效时间的,需要避免的一种情况就是大量缓存项在同一个时间点失效,如果此时对这些数据的请求量大,那么这些请求就会同时去刷新各自的缓存,这就将压力传递到了外部系统上。避免这种情况的办法就是在预定的失效时间基础上加上一个随机值,以错开缓存项的失效时间。

大量请求刷新同一个缓存项

一个请求遇到缓存失效,于是去刷新缓存,而在这个过程中又有大量请求来访问正在刷新的缓存项,导致该缓存项完成本次刷新后,又立刻被另一个线程刷新,实质上每个请求都因为缓存未命中而去访问了外部系统。

出现这个现象的原因是设计上的不合理。当一个缓存正在刷新时,访问该缓存项的其他线程应该等待刷新完毕,这样它们就可以直接从缓存获得结果了。线程同步当然是用锁。如果是分布式系统,那就用分布式锁。


推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • MybatisPlus入门系列(13) MybatisPlus之自定义ID生成器
    数据库ID生成策略在数据库表设计时,主键ID是必不可少的字段,如何优雅的设计数据库ID,适应当前业务场景,需要根据需求选取 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 14亿人的大项目,腾讯云数据库拿下!
    全国人 ... [详细]
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
author-avatar
纪志鹏大利集客_776
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有