(拼多多问:Redis雪崩解决办法) 导读:互联网系统中不可避免要大量用到缓存,在缓存的使用过程中,架构师需要注意哪些问题?本文以 Redis 为例,详细探讨了最关键的 3 个问题. 一.缓存穿透预防及优化 缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,但是出于容错的考虑,如果从存储层查不到数据则不写入缓存层,如图 11-3 所示整个过程分为如下 3 步: 缓存层不命中 存储层不命中,所以不将空结果写回缓存 返回空结果 缓存穿透将导致不存在的数据每次请求都要到存储层去查询,失去…
缓存穿透 用户想要查询一个数据 在redis缓存数据库中没有获取到 就会向后端的数据库中查询. 当用户很多 都去访问后端数据库的话,这就会给数据库带来很大的压力. 常见场景:秒杀活动 等 解决方法: 1.布隆过滤器 2.缓存空对象 缓存击穿 缓存击穿 就是一个Key非常热.这个key在失效的瞬间 持续的大并发就会击穿缓存 直接请求数据库. 常见场景:微博热搜 等 解决办法: 1.设置热点数据永不过期 2.分布式锁 缓存雪崩 在某一个时间段 缓存集中过期失效,如过期时间到了 或者Redis服务器宕…
1.缓存更新策略 1.LRU/LFU/FIFO算法剔除:例如maxmemory-policy 2.超时剔除,过期时间expire,对于一些用户可以容忍延时更新的数据,例如文章简介内容改了几个字 3.主动更新:代码控制生命周期,对于一些必须实时更新的数据,例如金额 策略 一致性 维护成本 LRU/LFU/FIFO算法剔除 最差 低 超时剔除 较差 低 主动更新 强 高 2.缓存粒度问题 1.通用性:全量属性最好 2.占用空间:部分属性最好 3.代码维护:表面上看全量属性最好 大部分应用来说都是缓存…
穿透: 从缓存中查询一个数据,查到为空,需要每次都去数据库中查询.而从数据库中查询出来也为空,也就不写入缓存.导致一个不存在的数每次都去数据库中查询,造成db系统很大压力 造成缓存穿透 解决:如果从数据库中查询结果为空,我们也要缓存起来,避免下次访问缓存中没有,而去访问数据库 雪崩:缓存在一段是时间内失效,导致所有的查询都落在数据库上,甚至导致数据库宕机,造成缓存雪崩 解决:1.不同的key设置不同的过期时间 2.并发量不大的情况下,访问数据库的时候可以加锁排队 (高并发的情况下 不适用) 3…
redis作为一个内存数据库,在生产环境中使用会遇到许多问题,特别是像电商系统用来存储热点数据,容易出现缓存穿透,雪崩,击穿等问题.所以实际运用中需要做好前期处理工作. 一.缓存雪崩 1.概念 缓存雪崩,是指在某一个时间段,缓存集中过期失效.其实这个挺好理解的,举个例子,假如我们把首页的热点数据都设置为1小时过期,刚好这个时候有个秒杀活动,大量的用户请求直接打到数据库.数据库直接被打挂,如果没做好高可用策略,跟这个数据库相关的接口会报错.即使重启数据库,也会被新的用户请求打挂.这种大面积奔溃俗称…
最近已经推出了好几篇SpringBoot+Dubbo+Redis+Kafka实现电商的文章,今天再次回到分布式微服务项目中来,在开始写今天的系列五文章之前,我先回顾下前面的内容. 系列(一):主要说了使用IDEA对SpringBoot项目的创建,SpringBoot架构下Web项目Maven的基本依赖及实现. 系列(二):主要讲了Maven父子级项目创建依赖.分环境部署配置及服务端口号统一配置,Dubbo的集成接入.服务层(提供者)分模块实现,提供者(四个)和消费者(一个)的配置及服务调用,微服…
在实际项目中,MySQL数据库服务器有时会位于另外一台主机,需要通过网络来访问数据库:即使应用程序与MySQL数据库在同一个主机中,访问MySQL也涉及到磁盘IO操作(MySQL也有一些数据预读技术,能够减少磁盘IO读写,此部分后续继续研究),总之,直接从MySQL中读取数据不如直接从内存中读取数据来的效率高. 为了提高数据库访问效率,人们采用了各种各样的方法,其中方法之一就是使用一个给予内存的缓存系统放置在数据库和应用程序之间. 在查找数据的时候,首先从内存中查找,如果找到则使用,如果没有找到…
参考大佬 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难.作为一个在互联网公司面一次拿一次offer的面霸(请允许我使用一下夸张的修辞手法),打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚,在一个寂寞难耐的夜晚,我痛定思痛,决定开始写<吊打面试官>系列,希望能帮助各位读者以后面试势如破竹,对面试官进行360°的反击,吊打问你的面试官,让一同面试的同僚瞠目结舌,疯狂收割大厂offer!…
文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 上篇文章谈到了Redis分布式锁,实际上就是为了解释为什么做缓存采用Redis而不使用map/guava.缓存分为本地缓存和分布式缓存.以 Java 为例,使用自带的 map /guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 JVM 的销毁而结束.而且在多实例状态下缓存不具有唯一性.使用 Redis 作缓存称为分布式缓存,在多实例状态下共用一份缓存数据,缓存具有一致性.所以说在分布式…
前言 从学校出来,做开发工作也有一定时间了,最近有想系统地进一步深入学习,但发现基础知识不够扎实,故此来回顾基础知识,进一步巩固.加深印象. 最初开始接触编程时,总是自己跌跌撞撞.不断摸索地去学习,再一点点应用到实际项目中,知识点才更加清晰.后来,尝试写博客,把学到的知识试着分享出来,也是一次巩固的过程. 1.问:Redis雪崩了解吗? 答:我了解的.目前电商首页以及热点数据都会去做缓存,一般缓存都是定时任务去刷新,或者是查不到之后去更新,定时任务刷新就有一个问题. 举个简单例子:如果所有首页的…