热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

Redis缓存异常

一.Redis和数据库中的数据不一致的情况是如何发生的?首先我们需要明确数据一致性的情况缓存中有数据,但是缓存的数据值需要和数据库中的值相同缓存中本身没有数据&#

一.Redis 和数据库中的数据不一致的情况是如何发生的?

首先我们需要明确数据一致性的情况

  • 缓存中有数据,但是缓存的数据值需要和数据库中的值相同
  • 缓存中本身没有数据,那么,数据库中的数据就必须是最新值

如果不符合上述情况,那么就出现了数据不一致的情况。

我们可以根据缓存是不是需要处理写请求,我们可以把缓存分为读写缓存和只读缓存

对于读写缓存来说,如果要进行增删改查需要对于缓存中进行,同时还要通过写回方式,同步回数据库中。

对于只读缓存来说,如果有新的数据新增,会直接去写入到数据库之中,而如果有数据删改的话,只需要把只读缓存中的数据标记为无效。这样,应用后续再访问这些增删改查的数据,就会发生缓存缺失,应用再从数据库中把数据读入缓存之中。

对于缓存来说,我们去对数据进行增删,可能会导致数据不一致问题。

在这里插入图片描述
二.如何解决数据不一致问题

重试机制

我们可以通过把要新增/修改的值暂时存放在消息队列中,如果应用没有能够成功删除缓存之或者更新数据库的时候,我们可以从消息队列中重新读取这个值,然后再次进行删除/更新。如果成功更新,那么我们从消息队列中删除。

如果在一定的次数重试之后还是没有成功,我们可以向业务层进行报错。

删除缓存值或更新数据库失败而导致数据不一致,你可以使用重试机制确保删除或更新操作成功。

三.缓存雪崩,缓存击穿和缓存穿透

缓存雪崩是指大量的应用请求无法在Redis 缓存中进行处理,大量请求到达数据库层,导致数据库的压力激增。

第一个原因 : 缓存中大量键过期,导致大量请求没有办法得到处理。

解决办法 : 我们可以通过微调过期时间,对于数据的过期时间增加一个较小的随机数,避免大量数据同时过期。

第二个原因: Redis实例突然发生故障,无法处理请求,进而发生缓存雪崩。

解决办法:

我们可以去实现服务熔断或者请求限流机制。

服务熔断,在发生缓存雪崩的时候,我们暂停业务服务对于缓存接口的访问。
请求限流,我们在业务系统的请求入口前端控制每秒进入系统的请求数,避免过多的请求被发送到数据库中。

缓存击穿 : 针对于某个访问非常频繁的热点请求,无法在缓存中处理,访问该数据的大量请求,都直接发送到DB上。

解决办法: 对于访问频繁的热点数据,我们不设置过期时间。

缓存穿透: 数据不在Redis中,也不在数据库中,导致请求在访问缓存的时候,发生缓存缺失,再去访问数据库的时候,数据库中也没有要访问的数据。

解决办法 : 设置布隆过滤器来解决这个问题。


推荐阅读
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了在Oracle数据库中创建序列时如何选择cache或nocache参数。cache参数可以提高序列的存取速度,但可能会导致序列丢失;nocache参数可以避免序列丢失,但在高并发访问时可能导致性能问题。文章详细解释了两者的区别和使用场景。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
author-avatar
longfeiPHP
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有