缓存的设计

news2024/11/29 4:37:00

文章目录

  • 1. 缓存的更新机制
    • 1.1 被动更新
    • 1.2 主动更新
      • 1.2.1 Cache Aside Pattern (更新数据库,再删除缓存)
      • 1.2.2 更新数据库,更新缓存
      • 1.2.3 先删除缓存,在更新数据库
    • 1.3 Read/Write Through Pattern
    • 1.4 Write Behind Caching Pattern
  • 2. 缓存的清理机制
    • 2.1 时效性清理
    • 2.2 数目阀值清理机制
    • 2.3 软应用清理
    • 2.4 redis 的8中内存淘汰策略
    • 2.5 缓存清理机制的总结
  • 3. 缓存问题
    • 3.1 缓存穿透

1. 缓存的更新机制

1.1 被动更新

为缓存设定过期时间,失效从数据库读取,再次写入缓存

调用方 暂存方(缓存) 数据提供方

被动:有效期到后,再次写入。

  1. 客户端 查数据,缓存中没有,从提供方获取,写入缓存(有一个过期时间t)。

  2. 在t内,所有的查询,都由缓存提供。所有的写,直接写数据库。

  3. 当 缓存数据 t 到点了,缓存 数据 变没有。后面的查询,回到了第1步。

适合:对数据准确性和实时性要求不高的场景。比如:商品 关注的人数。

1.2 主动更新

1.2.1 Cache Aside Pattern (更新数据库,再删除缓存)

这是最常用的更新机制

  • 失效: 应用程序从cache中获取数据,没获取到,则从数据库中读取数据,成功后,放到缓存中
  • 命中: 应用程序从缓存中获取数据,得到后直接返回
  • 更新: 先把数据库中的数据更新,成功后,在将缓存删除

在这里插入图片描述

有可能产生的问题

比方一个读操作,一个写操作的并发,读操作没有了删除缓存的操作,直接命中拿的是缓存中的数据,写操作更新了数据库中的数据,并删除了缓存,读操作读的就是老的数据

但是这种情况只是理论上存在,实际上很少出现,因为这种情况的产生是需要读操作慢于写操作,一般情况下,写操作都是比读操作慢,并且要加事务锁表,所以很少出现这种情况

1.2.2 更新数据库,更新缓存

一般也不采用。
请求被阻塞,
业务要求:修改了数据库,缓存的值需要通过大量时间的计算才能进行更新,影响了响应时间,直接删了缓存,比较节省计算时间,当用户再次去查询的时候,发现缓存的值不存在,用户只要经过一次复杂的计算就能对缓存的值进行更新

1.2.3 先删除缓存,在更新数据库

一般不采用,因为大概率 读比写快。

一个读请求和一个写请求的并发,当写请求进来,把缓存删了,更新数据库这步操作还没完成,读请求进来,发现没缓存,往数据库中读取,这个时候数据库的数据还是老的数据,读请求把老的数据写入了缓存,然后写请求才把数据更新到数据库,这就造成了数据库和缓存的双写一致性问题
在这里插入图片描述

解决双写一致性问题:延迟双删

延迟双删

就是在更新晚数据库之后,sleep一段时间,再次进行删除缓存的操作,能极大的保证双写一致性

在这里插入图片描述

昨天被高德一个面试问:说,你这个延时双删有这么几步操作。如果其中某一步失败了这么办?
删除缓存
更新数据库:事务,回滚就OK。
第二次删除缓存
重试删除:当你前面的操作,无法回滚时,为了保证后续数据的一致性,
(最便宜的做法)硬着头皮往前走,重试。
借用中间件:消息队列,重发消息。
系统外订阅:canal。binlog。
二次删除key,和我们的业务代码解耦。

1.3 Read/Write Through Pattern

这个是直接更缓存打交道,所有的增删改查都在缓存上进行,不会出现数据一致性的问题,但是缓存挂了的话,数据容易丢失

在这里插入图片描述

1.4 Write Behind Caching Pattern

更新数据的操作直接在缓存中进行,然后再异步对数据库进行更新,带来的好处就是数据的IO操作非常的快。带来的问题就是可能产生数据的丢失

2. 缓存的清理机制

2.1 时效性清理

就是给缓存设置一个过期时间,到期自动清理

2.2 数目阀值清理机制

判断缓存中的缓存的数量 达到一定值 ,对缓存进行清理。
阈值:根据自己的业务来定。1g,1m,1024个, 800 80%。

2.3 软应用清理

当空间不足的时候,会被回收

2.4 redis 的8中内存淘汰策略

a) 针对设置了过期时间的key做处理:

  1. volatile-ttl:在筛选时,会针对设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除。

  2. volatile-random:就像它的名称一样,在设置了过期时间的键值对中,进行随机删除。

  3. volatile-lru:会使用 LRU 算法筛选设置了过期时间的键值对删除。

  4. volatile-lfu:会使用 LFU 算法筛选设置了过期时间的键值对删除
    b) 针对所有的key做处理 :

  5. allkeys-random:从所有键值对中随机选择并删除数据。

  6. allkeys-lru:使用 LRU 算法在所有数据中进行筛选删除。

  7. allkeys-lfu:使用 LFU 算法在所有数据中进行筛选删除。
    c) 不处理:

  8. noeviction:不会剔除任何数据,拒绝所有写入操作并返回客户端错误信息"(error) OOM command not allowed when used memory",此时Redis只响应读操作。

LRU 算法(Least Recently Used,最近最少使用)
淘汰很久没被访问过的数据,以最近一次访问时间作为参考。(淘汰这段时间中最旧的key)

LFU 算法(Least Frequently Used,最不经常使用)
淘汰最近一段时间被访问次数最少的数据,以次数作为参考。(淘汰这段时间使用次数最少的key)

2.5 缓存清理机制的总结

  1. 时效性清理+数目阀值: 防止:短期内,密集查询,导致缓存空间的急剧增大
  2. lru+软引用:保证热数据,最大限度的提高缓存命中率

3. 缓存问题

3.1 缓存穿透

缓存中没有值,数据库中也没有这个值

产生可能原因

1、自身业务代码或者数据出现问题;
2、一些恶意攻击、 爬虫等造成大量空命中。

问题解决

1. 缓存空对象
注意:对于不存在的空对象,一定要设置过期时间!

String get(String key) {
    // 从缓存中获取数据
    String cacheValue = cache.get(key);
    // 缓存为空
    if (StringUtils.isBlank(cacheValue)) {
        // 从存储中获取
        String storageValue = storage.get(key);
        cache.set(key, storageValue);
        // 如果存储数据为空, 需要设置一个过期时间(300秒)
        if (storageValue == null) {
            cache.expire(key, 60 * 5);
        }
        return storageValue;
    } else {
        // 缓存非空
        return cacheValue;
    }
}

2. 布隆过滤器

布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存在。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/49270.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】权限管理

文章目录一、shell 命令以及运行原理二、Linux的用户权限1、权限概念引入2、用户分类3、用户切换4、用户提权三、Linux 权限管理1、文件访问者的角色划分2、文件类型和访问权限a、文件类型(后缀理解 file 指令讲解)b、文件访问权限四、文件访问权限的更改1、chmod 指令(对拥有…

STM32CubeMX串口通讯

串口的简单介绍 RS-232与TTL 根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准。而STM32的串口是TTL电平标准的。如果需要使用到RS-232则需要一个电平转换芯片。 单工通信、半双工通信和全双工通信 讲到串口,我们还需要具备这些基…

嵌入式分享合集113

一、 模拟输入信号的保护电路问题 四种模拟输入信号的保护电路的实现方法。 近由于工作的需要,涉及到了模拟输入信号的保护电路问题。结合以往的工作实践以及网络文献资料的查找。现在就保护电路作一简单的说明。 电源钳位保护 上述电路存在可靠性的问题。如果输…

JavaScript_DOM

JavaScript_DOM 概述 简单说就是用来操作HTML的方法,详情看官方文档。 对于我们只需要会使用下面的这个Element对象就可以了。 获取 Element对象 HTML 中的 Element 对象可以通过 Document 对象获取,而 Document 对象是通过 window 对象获取。 Doc…

焱融科技为国家重点实验室打造海量高性能存储

中国科学院大气物理研究所大气科学和地球流体力学数值模拟国家重点实验室(英文缩写 LASG)是国家级重点实验室。LASG 主要研究方向为地球气候系统模式的研发与应用;天气气候动力学理论、气候系统变化规律及其异常发生机制;天气气候…

排行榜谁最稳?

在 RedMonk 编程语言排行榜中,前端JavaScript 编程语言从2015年开始便稳居榜首,可以说是所有编程语言中最稳定的一个。 01 JavaScript 常年居于榜首原因 JavaScript 编程语言可以常年居于排行榜榜首位置,和它是前端工程师使用的唯一编程语言…

【树莓派】刷机、基础配置及多种方式登录

目录一、树莓派刷机二、树莓派登录1、HDMI线连接显示器登录2、串口方式登录(1)USB-TTL模块连接树莓派串口(2)修改系统配置,启用串口(3)用secureCRT登录树莓派3、网络方式登录(1&…

基于51单片机霍尔传感器测速(仿真+源程序)

资料编号:196 下面是该资料仿真演示视频: 196-基于51单片机霍尔传感器测速(仿真源程序全套资料)功能简介: 51单片机计数测速转速测量,在仿真中等价于测量外部脉冲频率;如果修改输入脉冲的频率&…

前端小白科普:小程序组件与插件有啥区别?怎么用?

一直以为小程序组件和小程序插件是一回事,只是措辞不一样,导致造成乌龙,其实完全是两回事,插件是可以直接提供服务的,组件是给开发者提供的轮子,不能直接提供服务。 先看看微信是如何定义小程序插件的&…

[附源码]计算机毕业设计springboot健身房信息管理

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Flutter 离线数据方案 Flutter_Data 包

Flutter 离线数据方案 Flutter_Data 包 原文 https://levelup.gitconnected.com/flutter-offline-first-with-flutter-data-62bad61097be 前言 通过离线优先来改善您的用户体验 Flutter Data 是一个让你的应用程序先离线的软件包。 离线时,它在设备上使用 Hive 存储…

DirectX12 - Triangle Culling and Winding Order(三角形的剔除与绕序)

这里是SunshineBooming,GPU公司一枚小小的Driver工程师,主要工作是写DirectX12 Driver,我会持续更新这个DX12 Spec系列,可能比较冷门,但是都是干货和工作中的心得体会,有任何GPU相关的问题都可以在评论区互…

Chapter9.2:线性系统的状态空间分析与综合(下)

此系列属于胡寿松《自动控制原理题海与考研指导》(第三版)习题精选,仅包含部分经典习题,需要完整版习题答案请自行查找,本系列属于知识点巩固部分,搭配如下几个系列进行学习,可用于期末考试和考研复习。 自动控制原理(…

GJB 5000B二级-LD领导作用

概要:GJB 5000B将GJB 5000A三级中的LD领导作用划分为二级内容,将组织类目标下沉至二级 借鉴GJB 9001C中的领导作用,结合各个行业优秀的实践,将5000A中的共用目标、实践进行了提炼、总结最终形成GJB 5000B中的领导作用实践域。 目的:进一步强化上层的领导作用,由高层、中层…

DOPE修饰岩藻多糖 Fucoidan-DOPE 岩藻多糖-二油酰基磷脂酰乙醇胺

DOPE修饰岩藻多糖 Fucoidan-DOPE 岩藻多糖-二油酰基磷脂酰乙醇胺 中文名称:岩藻多糖-二油酰基磷脂酰乙醇胺 英文名称:Fucoidan-DOPE 别称:DOPE修饰岩藻多糖,DOPE-岩藻多糖 外观:固体或粘性液体,取决于分子量 PEG分…

天问一号(Tianwen-1)详细介绍

天问一号(Tianwen-1)是中国第二个火星探测项目。2020年4月24日,中国行星探测任务被命名为“天问系列”,火星探测任务被命名为天问一号,后续行星探测任务依次编号。中国首次火星探测任务标识为“揽星九天”。 火星探测任…

基于stm32的智能药盒

提示:记录2022年4月做的毕设 文章目录前言一、任务书1.1设计(研究)目标:1.2设计(研究)内容:二、框架思路三、硬件四、联系我们五、相关功能介绍六、喜欢请点赞哦!前言 基于STM32的智能药盒,主控使用STM32F103(正点原子战舰板子&a…

word 中添加图片目录、内部链接

目录1. 图片、表格添加目录1.1 插入题注1.2 添加目录2. 添加内部链接1. 图片、表格添加目录 1.1 插入题注 只有正确地插入题注,图表目录才能快速生成。 (1)两个方法调用“题注”功能(任选1个) 方法一:在菜…

【论文阅读 ICTIR‘2022】Revisiting Open Domain Query Facet Extraction and Generation

文章目录Revisiting Open Domain Query Facet Extraction and GenerationMotivationContributionsMethodFacet Extraction and GenerationFacet Extraction as Sequence LabelingAutoregressive Facet GenerationFacet Generation as Extreme Multi-Label ClassificationFacet …

【Pandas数据处理100例】(九十八):Pandas使用between_time()筛选出给定时间区间的数据

前言 大家好,我是阿光。 本专栏整理了《Pandas数据分析处理》,内包含了各种常见的数据处理,以及Pandas内置函数的使用方法,帮助我们快速便捷的处理表格数据。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPandas版本:1.3.5N…