【redis】redis缓存更新策略

news/2024/11/17 22:49:01/

目录

        • 一、缓存更新策略
        • 二、主动更新策略
        • 三、Cache Aside Pattern
          • 3.1 删除缓存还是更新缓存?
          • 3.2 如何保证缓存与数据库的操作同时成功或失败?
          • 3.3 先操作缓存还是先操作数据库
            • 3.3.1 先删缓存再删库
            • 3.3.2 先删库再删缓存

一、缓存更新策略

  • 1.内存淘汰:不用自己维护,利用redis的内存淘汰机制,当内存不足时自动淘汰部分数据,下次查询时更新缓存,一致性差,没有维护成本
  • 2.超时剔除:给缓存数据添加TTL时间,到期后自动删除缓存。下次查询时更新缓存,一致性一般,维护成本低
  • 3.主动更新:编写业务逻辑,在修改数据库的同时,更新缓存,一致性好,维护成本高
  • 4.低一致性需求可以使用内存淘汰机制
  • 5.高一致性需求可以主动更新,并以超时剔除作为兜底方案

二、主动更新策略

  • 1.Cache Aside Pattern 旁路缓存模式,在更新数据库的同时更新缓存
  • 2.Read/Write Through Pattern 读写穿透模式,缓存与数据库整合为一个服务,由服务来维护一致性。调用者调用该服务,无需关心缓存一致性问题
  • 3.Write Behind Caching Pattern 异步缓存写入模式,调用者只操作缓存,由其它线程异步的将缓存数据持久化到数据库,保证最终一致

三、Cache Aside Pattern

3.1 删除缓存还是更新缓存?
  • 1.每次更新数据库都更新缓存,无效的写操作较多;
  • 2.更新数据库让缓存失效,查询时再更新缓存更好
3.2 如何保证缓存与数据库的操作同时成功或失败?
  • 1.单体系统中将缓存和数据库操作放在同一个事务中
  • 2.分布式系统利用TCC (Try、Confirm、Cancel)等分布式事务方案
3.3 先操作缓存还是先操作数据库
  • 1.先删缓存再删数据库
  • 2.先删数据库再删缓存
  • 3.先删数据库再删缓存比较好,这种发生的概率相对来说小一点,然后给缓存加上一个过期时间,一旦不一致时,缓存失效也再次查询数据库
3.3.1 先删缓存再删库

正常情况(示例)

  • 1.有线程A和线程B操作缓存和数据库
  • 2.线程A想把姓名改为张三,先删缓存,然后更新数据库,姓名是张三,执行完毕
  • 3.线程B查询缓存,未命中,查询数据库,将张三写入缓存,拿到张三
  • 4.此时数据库和缓存的数据都是张三

异常情况(示例)

  • 1.有线程A和线程B操作缓存和数据库
  • 2.线程A想把姓名李四改为张三,先删缓存,删除缓存成功,准备更新数据库为张三
  • 3.线程B开始查缓存,未命中,查询数据库为李四,将李四写入缓存,执行完毕
  • 4.线程A更新数据库为张三成功,执行完毕
  • 5.此时数据库数据为张三,但缓存是李四
3.3.2 先删库再删缓存

正常情况(示例)

  • 1.有线程A和线程B操作缓存和数据库
  • 2.线程A想把姓名李四改为张三,先更新数据库,姓名改为张三,删除缓存,执行完毕
  • 3.线程B查询缓存,未命中,查询数据库,将张三写入缓存,拿到张三
  • 4.此时数据库和缓存的数据都是张三

异常情况(示例)

  • 1.有线程A和线程B操作缓存和数据库
  • 2.线程B查询缓存,未命中,查询数据库,拿到李四,还没来的及写入缓存
  • 3.线程A想把姓名李四改为张三,先更新数据库,姓名改为张三,删除缓存,执行完毕
  • 4.线程B将李四写入缓存,执行完毕
  • 5.此时数据库数据为张三,缓存为李四

http://www.ppmy.cn/news/35148.html

相关文章

Flutter-Scaffold组件

在Flutter开发当中,我们可能会遇到以下的需求:实现页面组合使用,比如说有悬浮按钮、顶部菜单栏、左右抽屉侧边栏、底部导航栏等等效果。Scaffold组件可以帮我们实现上面需求说的效果。这篇博客主要分享容器组件的Scaffold组件的使用&#xff…

【数据结构篇C++实现】- 堆

文章目录🚀一、堆的原理精讲⛳(一)堆的概念⛳(二)看图识最大堆⛳(三)详解堆是用数组表示的树🚀二、堆的向下调整算法🚀三、堆的向上调整算法🚀四、将任意一棵…

古茗科技面试:为什么 ElasticSearch 更适合复杂条件搜索?

文章目录 ElasticSearch 简介倒排索引联合索引查询跳表合并策略Bitset 合并策略MySQL 最多使用一个条件涉及的索引来过滤,然后剩余的条件只能在遍历行过程中进行内存过滤。 上述这种处理复杂条件查询的方式因为只能通过一个索引进行过滤,所以需要进行大量的 I/O 操作来读取行…

STM32-9 STM32CubeMX的使用方法

一、 说明 本项目是基于FreeRTOS项目的STM32CubeMX开发方式,说明了具体配置与相关参数,以及mdk使用,裸机也可以参考本配置。 二、项目建立步骤 1、新建项目 2、选择芯片型号 3、配置时钟 RCC 设置,选择 HSE(外部高速时钟) 和L…

【C#学习记录】如何让界面控件实现自适应布局(Winform)

小伙伴们大家好,我是雷工! 在软件界面设计中,客户常常要求设计的界面可以随意缩放,缩放过程中,界面中的按钮等控件也会随着窗体变大缩小自动调整显示位置和尺寸大小。在C#的Winform窗体中如何实现这个效果,下面我们一起学习下。 一、样例开发环境 本样例的程序运行环境…

软件测试学习书籍【附电子版】

零基础学软件测试需要读哪些书籍?软件测试经典书籍推荐什么?对于学习软件测试而言,取得一本好书做指导,那是相当的有价值,好书相当于一位好老师,带你入门,带你走进知识深处,下面小编就给大家推荐一些软件…

MySQL-事务

目录 🍁什么是事务 🍁隔离级别 🍃未提交读 🍃已提交读 🍃可重复读 🍃可串行化 🦐博客主页:大虾好吃吗的博客 🦐MySQL专栏:MySQL专栏地址 什么是事务 多条sql语…

【Python入门第三十八天】Python丨NumPy 简介

什么是 NumPy? NumPy 是用于处理数组的 python 库。 它还拥有在线性代数、傅立叶变换和矩阵领域中工作的函数。 NumPy 由 Travis Oliphant 于 2005 年创建。它是一个开源项目,你可以自由使用它。 NumPy 指的是数值 Python(Numerical Pyth…