首页 > 数据库 >Redis缓存异常及解决方案

Redis缓存异常及解决方案

时间:2024-08-16 15:15:47浏览次数:8  
标签:缓存 删除 解决方案 数据库 Redis 更新 数据

本文分享自天翼云开发者社区《Redis缓存异常及解决方案》,作者:l****n

本文向读者解释了Redis使用过程中,数据不一致、缓存雪崩、缓存击穿和缓存穿透等问题的定义,并给出对应的解决方案。

1、数据不一致 

一致指的是

缓存中有数据,那么,缓存的数据值需要和数据库中的值相同;

缓存中本身没有数据,那么,数据库中的值必须是最新值。

不一致如何发生

对于读写缓存来说,写缓存时同步写数据库,需要使用事务保证缓存和数据库的更新具有原子性。弱一致性情况下,可以使用异步写回。

对于只读缓存,删改数据需要既更新数据库,又删除缓存。如果不使用事务,就会出现数据不一致。

比如先更新数据库,再删除缓存。更新成功,删除缓存失败,则缓存中为旧值。如果先删除缓存再更新数据库,则缓存删除成功,数据库更新失败,再访问数据库,数据库还是旧值。

解决方案

需要重试机制,当两个操作任意一个失败时,重新执行。

特别的,当数据库更新成功,缓存删除也成功时,其实也有可能不一致。比如删除了缓存,还未更新数据库。线程B此时读取数据库中旧值并写到缓存。

解决方法:延迟双删。sleep是为了等B线程执行完写缓存操作。sleep时间根据读数据和写缓存时间来估算。

  redis.delKey(X)

  db.update(X)

  Thread.sleep(N)

  redis.delKey(X)

比如更新了数据库,还未删除缓存时。B线程就开始读数据,从缓存读到旧值。不过这种情况下缓存会马上被删除,所以影响较小。 

2、缓存雪崩

大量请求无法在redis得到处理,从而打到数据库。主要原因:

缓存中大量数据同时过期,应用访问时无法命中缓存,从而都请求到数据库;

redis宕机。

解决方案

过期时间增加随机数;

发生雪崩时进行服务降级。非核心数据直接返回默认值或错误;

限流熔断,当数据库负载突升时,暂停业务应用对缓存的访问。

3、缓存击穿

热点数据过期失效,大量请求突然打到数据库。

解决方法

热点数据不设置过期时间。

4、缓存穿透

数据不在缓存中,也不在数据库中。可能原因:

业务层误操作,删除了数据库数据。

恶意攻击。

解决方案

缓存默认值;

使用布隆过滤器快速判断数据是否存在;

前端进行请求检查。

在实际的业务中,以上异常场景可能会同时出现,排查时要根据自己的情况进行针对性分析。

标签:缓存,删除,解决方案,数据库,Redis,更新,数据
From: https://www.cnblogs.com/developer-tianyiyun/p/18362919

相关文章

  • "一基双台三智" 中电金信智慧监督解决方案构筑国央企风控堡垒
    近年来,国务院国资委先后下发《关于进一步排查中央企业融资性贸易业务风险的通知》、《关于规范中央企业贸易管理严禁各类虚假贸易的通知》等各类监管法规,并在2024年初中央企业工作会议中提出对财务数智化转型及重点领域风险把控的要求,国资委对财务公司在虚假贸易、民企挂靠等方面......
  • Redis介绍
    Redis一、介绍1.1基本了解RemoteDictionaryServer(远程字典服务)是完全开源的,使用ANSIC语言编写遵守BSD协议,是一个高性能的Key-Value数据库提供了丰富的数据结构,例如String、Hash、List、Set、SortedSet等等。数据是存在内存中的,同时Redis支持事务、持久化、LUA脚本、......
  • Win 11 Postgresql 16 安装失败解决方案
    主要遇到以下两个问题一个是在安装时报错Problemrunningpost-installstep.InstallationmaynotcompletecorrectlyThedatabaseclusterinitialisationfailed.一个是在初始化时报错Theprogram"postgres"wasfoundby"initdb"butwasnotthesameversionasin......
  • redis启动失败报错:Job for redis.service failed because the control process exited
    问题描述启动报错如下:查看redis的启动信息:systemctlstatusredis.service或journalctl-xe由提示可以看不是配置文件,内存等原因造成的。解决方案原因:linux的一个安全子系统(SELinux)阻止了服务的启动。查看SELinux的工作模式cat /etc/selinux/configSELinu......
  • 页高速缓存
    在Linux的文件系统中,`address_space`结构是用于表示一个文件(或更一般地说,一个映射到内存的实体,如一个块设备或网络文件系统的一部分)在内存中的表示。它管理着该文件在物理内存中的缓存页(pagecache),即那些包含文件数据的物理内存页。`pagecache`是Linux内核中一个非常核心且高效......
  • SpringBoot的事务/调度/缓存/邮件发送和一些Spring知识点总结
    目录1、SpringBoot的事务管理2、SpringBoot的异步任务3、SpringBoot定时任务调度4、SpringBoot整合Mail发送邮件5、Spring框架中的Bean的作用域6、Spring框架中的Bean的线程安全7、Spring框架中的Bean生命周期8、Spring框架如何解决循环依赖?9、Spring框架中有哪些注......
  • Spring 框架缓存注解
    @CacheEvict是Spring框架中用于缓存操作的一个注解,它属于SpringCache抽象的一部分。这个注解通常用在方法上,表示执行该方法时会触发缓存的清除操作。具体来说,当你对一个方法使用了@CacheEvict注解,Spring会在该方法执行完成后,根据注解中定义的缓存名称和条件,去清除指定的......
  • (路由卷1)-34-次优路由解决方案
    实验:r1:routereigrp100noautonet12.1.1.0r2:routereigrp100noaunet12.0.0.0routerospf1router-id2.2.2.2network23.1.1.20.0.0.0area0net24.1.1.20.0.0.0area0r3:routerospf1router-id3.3.3.3net23.1.1.30.0.0.0area0net34.1.1.3......
  • (路由卷1)-33-路由环路解决方案
    实验:r1:intlo0ipadd1.1.1.1255.255.255.255ints1/0noshipadd12.1.1.1255.255.255.0routerripver2noaunet12.0.0.0.0r2:intlo0ipadd2.2.2.2255.255.255.255ints1/0clockrate64000ipadd12.1.1.2255.255.255.0intf0/0noshipadd24.......
  • (路由卷1)-35-改AD+PBR解决方案
    实验:1.掩码2.不同种路由协议比较ad3.同种协议比较metricr2:routereigrp100distanceeigrp90119r3:access-list1permithost1.1.1.1routerospf1distance1214.4.4.40.0.0.01r4:access-list1permithost1.1.1.1routerospf1distance1213.3.3.30.0......