Redis的缓存更新策略和缓存问题

news2024/10/7 12:24:52

1.缓存更新

1.1缓存更新策略

  • 内存淘汰:
    • 不需要自己维护,利用Redis的内存淘汰机制,当内存不足时自动淘汰部分数据,下次查询时更新缓存
    • 一致性 : 差
    • 维护成本:无
  • 超时删除:
    • 给缓存数据添加TTL时间,到期后自动删除缓存,下次查询时更新缓存
    • 一致性 :一般 (如果数据库中的值发生更新,但是缓存中的数据仍未过期,会出现数据不一致问题)
    • 维护成本:低
  • 主动更新:
    • 在修改数据库的同时,进行更新缓存的操作
    • 一致性:好 (也有可能出现数据不一致)
    • 维护成本:高

业务场景:

  • 低一致性需求:使用内存淘汰机制。如一些更改频率很低的数据的缓存查询
  • 高一致性需求:主动更新,并以超时删除作为辅助备用方案。如频繁修改的数据的缓存查询

1.2 主动更新策略需要考虑的问题

1.删除缓存还是更新缓存?

  • 更新缓存: 每次更新数据库都更新缓存,无效写操作较多 (比如更新1000次数据库同一个数据,那么缓存也更新了1000次,实际上只有最后一次更新缓存是有效的) 适合于读多写少
  • 删除缓存: 更新数据库时让缓存失效(删除缓存 or 让缓存过期 ),查询时再更新缓存 (常用方式)

2.如何保证缓存与数据库的操作同时成功或失败?(原子性)

  • 单体系统: 将缓存与数据库操作放在一个事务

  • 分布式系统:利用TTC等分布式事务方案

3.先操作缓存还是先操作数据库?

  • 先删除缓存,再更新数据库

可能存在的问题:多线程环境下,(操作数据库耗时长于操作缓存)很大概率发生 线程2线程1 删除缓存还未来得及更新数据库时,就进行查询操作,然后未命中查询数据库一个旧的数据写入缓存,导致出现数据一致性问题

在这里插入图片描述

  • 先更新数据库,再删除缓存 (常用方式)

可能出现的问题:在线程1查缓存时,此时缓存恰好失效,然后查数据库,还未来得及写入缓存,线程2进行了更新数据库的操作,然后线程1将旧的数据写入缓存,导致数据不一致性的问题(由于操作缓存效率更高,这种问题发生的概率比较小)

在这里插入图片描述

2.缓存问题

2.1缓存穿透

场景: 查询不存在的数据,使得请求一直查询数据库,在大量请求下导致数据库负载过大,甚至宕机

解决方案:

  • 缓存空对象

存储层未命中后,仍然将空值存入缓存,再次访问该数据时,缓存直接返回空值 (空值是“”)

优点: 实现简单,维护方便

缺点: 额外的内存消耗 (可以给空值设置TTL过期时间)

​ 可能造成短期的不一致 (在缓存空值之后,数据库新增了这个数据)

  • 布隆过滤器

将所有存在的key提前存入布隆过滤器(二进制形式),在访问缓存层之前,先通过过滤器拦截,若请求的是不存在的key,则直接返回空值

优点: 内存占用较少,没有多余key

缺点: 实现复杂 存在误判可能

在这里插入图片描述

主动的应对方案:

  • 增强id的复杂度,避免被猜测id规律

  • 做好数据的基础格式校验

  • 加强用户权限校验

  • 做好热点参数的限流

2.缓存击穿

场景: 热点数据,高并发访问。在其缓存失效瞬间,大量请求直达存储层,导致数据库压力剧增,服务崩溃
在这里插入图片描述

解决方案:

  • 加互斥锁

对数据的访问加互斥锁,当一个线程访问该数据时,其他线程只能等待,这个线程访问过后,缓存中的数据将被重建,此时其他线程可以直接从缓存中取值

优点: 保证一致性 实现简单

缺点: 线程需要等待,性能受影响,可能有死锁风险(在多缓存场景下多个锁可能导致死锁)

在这里插入图片描述

使用Redis中的setnx模拟互斥锁的过程

private boolean tryLocal(String key) {
    // setnx 存入一个key 值可以随意 设置10s的过期时间
    Boolean flag = stringRedisTemplate.opsForValue().setIfAbsent(key, "1", 10, TimeUnit.SECONDS);
    return BooleanUtil.isTrue(flag);

}

private void unlock(String key) {
    stringRedisTemplate.delete(key);
}
  • 逻辑过期

不设置过期时间,添加一个expire属性 值为当前时间+过期时间 转为整数(时间戳)

为每个value设置逻辑过期时间,当发现该值逻辑过期时,使用单独的线程重新缓存,其他线程返回旧的值

优点: 线程无需等待,性能较好

缺点: 不保证一致性(返回旧数据),有额外内存消耗,实现复杂

在这里插入图片描述

3.缓存雪崩

场景: 当缓存失效 (如同一时段大量的key过期或者redis挂了),导致所有请求直达存储层,造成存储层宕机

解决方案:

  • 避免同时过期

设置过期时间,附加一个随机数,避免大量的key同时过期

  • 构建高可用的redis缓存

部署多个redis实列,个别结点宕机,依然可以保持服务的整体可用 (Redis集群)

  • 构建多级缓存

增加本地缓存,在存储层前面多加一级屏障,降低请求直达存储层的几率 (比如 caffieine本地缓存 、Nginx缓存)

  • 启用限流和降级措施

对存储层增加限流措施,当请求超出限制时,对其提供降级服务

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

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

相关文章

零基础自学javase黑马课程第十五天

零基础自学javase黑马课程第十五天 ✨欢迎关注🖱点赞🎀收藏⭐留言✒ 🔮本文由京与旧铺原创,csdn首发! 😘系列专栏:java学习 💻首发时间:🎞2022年11月21日&…

【案例设计】配置与批量化处理外部 Texture 导入格式转换

开发平台:Unity 2020 版本以上 编程平台:Visual Studio 2020 版本 编程语言:CSharp   前言 Unity 开发者不仅是要求在面对开发需求上有着预见性的目光与能力去应对各种功能实现。更加注重的是通过各个项目的开发类型与过程,总结…

计算机体系结构:不同改进方案的性价比计算

题目内容 某一计算机用于商业外贸的事务处理,有大量的字符串操作。由于这种事务处理很普遍,有较大的市场,故而设计人员决定在下一代此类计算机的CPU中加入字符串操作的功能。经测试应用软件调查发现,字符串操作的使用占整个程序运…

进程切换及一些常见概念(面试必问)

目录前言一、竞争性1、什么是进程的竞争性?2、为什么进程间存在竞争性?二、独立性#这里先简单了解三、并行四、并发五、优先级队列六、进程切换寄存器1. 函数返回值2. 进程上下文数据总结前言 在不同的进程在处理机上切换的过程中,我们需要学…

碳酸钙/GPC3单克隆抗体介导阿霉素二氧化硅纳米粒/DOX-GNRs@mSiO2-HA-RGD纳米制备方法

小编在这里整理了碳酸钙/GPC3单克隆抗体介导阿霉素二氧化硅纳米粒/DOX-GNRsmSiO2-HA-RGD纳米制备方法,来看! 碳酸钙阿霉素二氧化硅纳米颗粒制备方法: 包括以下步骤: 将含有钙离子的乙醇溶液与含有氨水与盐酸阿霉素的水溶液混合,…

【Jupyter】远程连接Jupyter服务器

远程连接Jupyter 步骤一 配置Jupyter https://blog.csdn.net/MYRLibra/article/details/109599531 https://blog.csdn.net/weixin_40641725/article/details/114636779 安装 conda activate abc #激活虚拟环境 pip install jupyter #安装 jupyter notebook --generate-conf…

Webservice接口-WSDL文档【Webservice】

WSDL是一个用于精确描述Web服务的文档,WSDL文档是一个遵循WSDL-XML模式的XML文档。WSDL 文档将Web服务定义为服务访问点或端口的集合。在 WSDL 中,由于服务访问点和消息的抽象定义已从具体的服务部署或数据格式绑定中分离出来,因此可以对抽象…

python使用flask实现前后端分离通过前端修改数据库数据【全栈开发基础】

文章目录🚎前言:🛺工具🚓截图🚕数据库截图🚙前端截图🚘代码🚲增加🍕前端 HTML🍟后端 python🛴 删除🍕前端 HTML🍟后端 pyt…

AMM 套利者

AMM 套利者 理由 以太坊和其他支持 EVM 的区块链上有很多 AMM。其中许多 AMM 是 UniswapV2 的分叉项目或与 UniswapV2 具有相同的接口。这些 AMM 的列表: Uniswap V2(以太坊)寿司交换(以太坊)煎饼掉期(BSC)MDEX(BSC/heco) ... 一旦相同代币…

SpiderPool - 云原生容器网络 IPAM 插件

SpiderPool 来源于容器网络落地实践的经验积累,是「Daocloud 道客」开源的原生容器网络 IPAM 插件(github:https://github.com/spidernet-io/spiderpool),主要用于搭配 Underlay CNI 实现容器云平台精细化的管理和分配…

策略验证_指标买点分析技法_运用boll布林线指标选择买点

写在前面: 1. 本文中提到的“股票策略校验工具”的具体使用操作请查看该博文; 2. 文中知识内容来自书籍《同花顺炒股软件从入门到精通》 3. 本系列文章是用来学习技法,文中所得内容都仅仅只是作为演示功能使用 目录 解说 策略代码 结果 解…

基于云原生网关的可观测性最佳实践

作者: 井轶 为什么要进行可观测性建设 可观测性并不是一个新词,该词来源于控制理论,是指系统可以由其外部输出推断其其内部状态的程度,随着 IT 行业几十年的发展,IT 系统的监控,告警,问题排查…

【附源码】计算机毕业设计JAVA学生信息管理系统

【附源码】计算机毕业设计JAVA学生信息管理系统 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA my…

联想Filez助力知名生物制药企业 建立业务数据安全体系

苏州某生物制药企业是一家抗体研发企业,其研发生产基地设在苏州。主要从事临床样品(原液和成品)的开发和生产,致力于通过持之以恒的研发和专业的生产技术,以最快的速度实现生物制品的批准。 随着企业各项业务的快速发展…

Redis——》数据类型

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 Redis——》数据类型5种基本类型3种特殊类型数据类型和底层数据结构5种基本…

第一个 GoWeb 程序,三款主流框架 Beego、Gin 和 Iris 快速入门

1、什么是web应用 Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件。 一个Web应用程序是由完成特定任务的各种Web组件构成的并通过Web将服务展示给外界。…

网络是怎样连接的--生成HTTP请求消息过程

文章目录1.1 何为网址1.2 解析网址1.3 HTTP在干嘛1.4 生成http请求和响应1.1 何为网址 网址,准确来说应该叫URL,比如以http://开头的那一串东西.但实际上除了“http:”,网址还可以以其他一些文字开头,例如“ftp:”“file:”“mailto:”等。而…

免费申请Jetbrains全家桶

文章目录Jetbrains全家桶免费申请的人群学生和老师申请的要求申请方式申请流程解决收不到邮件的问题编辑内容进行认证申请成功Jetbrains全家桶 Jetbrains是著名的编程工具商业软件提供商,旗下有很多软件。包括IDE、团队开发工具、插件和微软.Net辅助工具、包括自创语…

[附源码]java毕业设计小型银行贷款管理系统

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

C\C++刷题DAY4

目录 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 1.第一题 206. 反转链表 - 力扣(LeetCode) 思路:调转指向关系,使用双指针的思想 1指向2,改成2指向1,以此类推。 参考代码: struct L…