专栏首页Java学习录缓存淘汰、缓存穿透、缓存击穿、缓存雪崩、数据库缓存双写一致性

缓存淘汰、缓存穿透、缓存击穿、缓存雪崩、数据库缓存双写一致性

缓存淘汰

为什么需要缓存淘汰?你需要缓存30G的数据,但是Redis本身只能使用10G的内存,那你就得做个取舍了,毕竟鱼与熊掌不可兼得。为了利益最大化肯定要保留最重要的10个G。

Redis本身提供了6中缓存淘汰策略,以下属性表示允许使用的最大内存

server.maxmemory

当使用的内存超过限制内存时,Redis会根据配置的以下6中淘汰策略选择数据淘汰

  • volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
  • volatile-ttl:从已设置过期时间的数据集挑选将要过期的数据淘汰
  • volatile-random:从已设置过期时间的数据集中任意选择数据淘汰
  • allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
  • allkeys-random:从数据集中任意选择数据淘汰
  • no-enviction:内存不足时添加数据会报错(没人用这个吧?)

其他相关配置:

#指定数据淘汰算法
maxmemory-policy allkeys-lru
#LRU和最小TTL算法的样本个数
maxmemory-samples 5

缓存穿透

大量的请求瞬时涌入系统,而这个数据在Redis中不存在,从而所有的请求都落到了数据库上从而把数据库打死。造成这种情况的原因如下:

  • 系统设计不合理,缓存数据更新不及时
  • 爬虫等恶意攻击

解决方案:

  • 如果key在数据库中也不存在,那么就写一个空值到Redis中,并设置一个过期时间,避免一直占用内存
  • 查询缓存之前使用布隆过滤器拦截

缓存击穿

缓存击穿,就是常说的热点key问题,当一个正有非常巨大的访问量访问的key 在失效的瞬间,大量的请求击穿了缓存,直接落到了数据库上,然后所有从数据获取到数据的线程又都并发的想要把数据缓存到redis中。

解决方案:

  • 使用互斥锁,同一时刻只允许一个线程去构建缓存,其他线程等待构建完毕后去缓存取
  • 定时更新,假如缓存过期时间为60分钟,则单独设置一个线程每59分钟去负责更新缓存

缓存雪崩

由于Redis是基于内存的应用,可以很容易做到高性能、高并发从而起到保护数据库的作用。如果缓存意外挂了、所有的请求落到了数据上就形成了缓存雪崩。

解决方案:

数据库缓存双写一致性

当一个数据需要更新时因为不可能做到同时更新数据库和缓存、那么此时读取数据的时候就一定会发生数据不一致问题,而数据不一致问题在金融交易领域的系统中是肯定不允许的。

解决方案:

  • 读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。
  • 更新的时候,先更新数据库,然后再删除缓存。

参考自公众号:石杉的架构笔记

本文分享自微信公众号 - Java学习录(Javaxuexilu)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 为什么一线大厂面试必问redis,有啥好问的?

    除了5种常用类型,还有bitmaps、hyperloglogs 、geospatial等类型。

    Java学习录
  • 如何将自己的jar包发布到mavan中央仓库

    这里有一个小小的坑就是如果你没有域名的话groupId可以写com.github.你的github名或者io.github.你的github名。如果你写域名的...

    Java学习录
  • MySQL架构与SQL执行流程

    负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客户端请求都会被分配(...

    Java学习录
  • Redis 缓存问题(13) 原

    因为这些数据是很少修改的,所以在绝大部分的情况下可以命中缓存。但是,一旦被缓存的数据发生变化的时候,我们既要操作数据库的数据,也要操作Redis的数据,所以问题...

    兜兜毛毛
  • 这几道 Redis 面试题都不懂,怎么拿 Offer?

    随着系统访问量的提高,复杂度的提升,响应性能成为一个重点的关注点。而缓存的使用成为一个重点。redis 作为缓存中间件的一个佼佼者,成为了面试必问项目。

    芋道源码
  • 高并发请求的缓存设计策略

    前几天,我司出了个篓子。当时正值某喜闻乐见的关键比赛结束,一堆人打开我司app准备看点东西,结果从来没有感受到过这么多关注量的该功能瞬间幸福到眩晕,触发了熔断,...

    老白
  • 这几道Redis面试题都不懂,怎么拿offer?

    随着系统访问量的提高,复杂度的提升,响应性能成为一个重点的关注点。而缓存的使用成为一个重点。redis 作为缓存中间件的一个佼佼者,成为了面试必问项目。本文分享...

    java思维导图
  • 这几道Redis面试题都不懂,怎么拿offer?

    随着系统访问量的提高,复杂度的提升,响应性能成为一个重点的关注点。而缓存的使用成为一个重点。redis 作为缓存中间件的一个佼佼者,成为了面试必问项目。本文分享...

    Spark学习技巧
  • 这么简单的Redis面试题都不懂,怎么拿offer?

    随着系统访问量的提高,复杂度的提升,响应性能成为一个重点的关注点。而缓存的使用成为一个重点。redis 作为缓存中间件的一个佼佼者,成为了面试必问项目。本文分享...

    lyb-geek
  • 面试被问频率最高的几道Redis面试题

    Redis相关面试题确实很多,主要是因为知识点很多,但是面试的时候,不可能都问个遍,所以本文就来总结一下,面试被问频率最高的几道Redis的面试题。

    用户4143945

扫码关注云+社区

领取腾讯云代金券