redis和数据库的一致性问题的解决方案

这篇具有很好参考价值的文章主要介绍了redis和数据库的一致性问题的解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当前没有框架能够保证redis的数据和数据库的完全一致性,所以需要 我们自己在性能和一致性上作取舍。

使用到缓存的场景

	这里讲到的是缓存和数据库的一致性问题。
	当查询数据库数据的时候,才涉及到缓存的利用上,所以缓存的引入是为了让查询数据的时候提高效率;
    而当发生增、删、改数据的时候,对于缓存来说是要让数据库和缓存发生一致性的改变,进而能让缓存在数据查询时候能继续起作用。

下图就是两种在redis缓存数据库内容时的使用。
redis和数据库的一致性问题的解决方案
redis和数据库的一致性问题的解决方案

对于缓存的一致性操作的选择

明确了缓存的使命------在查询数据库信息时,提前将数据进行缓存,既减少了数据库io,也提高了查询效率。

那么如一个节点的两个图:
缓存的生成,是在首次查询或者缓存过期时间到或者缓存被其他业务删除,进而需要在数据库查询完毕之后,将数据库内容同步到缓存中。
那当数据发生增删改时,涉及到两个方向的选择
1、是删除还是更新redis缓存
2、是先删除\更新缓存,再操作数据库;还是先操作数据库,再删除\更新缓存。
下面一一讨论

(1)数据发生变化,删除还是更新redis缓存

更新:数据发生增删改,把缓存的内容 重新用redis的set操作,赋予新值。
删除:在查询时,发现缓存已经不存在,去数据库查询之后,同步到redis缓存。

1、如何选择,可以使用排除方法,首先讨论更新。
(1)、redis更新是放在数据库操作的前。
线程1: redis更新 ---------------------------数据库更新
线程2:redis更新-------------------------数据库更新
(2)、redis更新是放在数据库操作的后。
线程1: 数据库更新 ---------------------------redis更新
线程2:数据库更新-------------------------redis更新
可以看到这样的场景,当线程1和2完成之后,此时缓存和数据库是不一致的。
2、写多读少:上面一直讨论缓存的目的是给读操作使用的,那么每修改一次就写入一次缓存,无疑大大的做无用功。
3、如果缓存是需要计算加工的数据:即查询到数据库值之后,缓存的值需要再做计算,那么每一次修改将很损耗性能。

总结:综合上面三点,删除要比更新的效率和避免数据不一致的效果更好。

(1)数据发生变化,先删除还是先操作数据库

1、 先更新数据库,再删除缓存
2、先删除缓存,再更新数据库
下面一一讨论:
(1)先更新数据库,再删除缓存
①如果更新数据库失败,那么程序捕获异常,之后不进行删除缓存操作。
②如果更新数据库成功,但是删除缓存失败。
针对②可以采用异步操作的办法,把删除失败的key给到队列当中,由线程池来执行失败重试。
或者可以利用canal 监听数据库修改 进而发生删除的操作。

(2)先删除缓存,再更新数据库
这种方式可能存在以下三种异常情况

1、删除缓存失败,这时可以通过程序捕获异常,直接返回结果,不再继续更新数据库,所以不会出现数据不一致的问题
2、删除缓存成功,更新数据库失败。此时不会发生数据不一致现象。
3、下图的场景,两个线程执行完成之后,会导致redis和数据库的不一致。
redis和数据库的一致性问题的解决方案
解决第三种情况可以使用 延时双删的策略,如下图:
redis和数据库的一致性问题的解决方案
这里讨论一下延时双删如何解决第三种异常情况,
1、线程2在查询数据库旧值之后,更新缓存,此时数据不一致,所以需要再次删除。
2、休眠时间,是为了在线程2写入缓存之后,线程1才发生删除缓存,不延时,可能导致线程2还没写入缓存,线程1就完成了删除缓存,那么最终的结果 还是数据不一致。
3、无论如何线程2并利用的是旧数据,这点没办法更改这点容错率还是支持的,毕竟要是发生在删除缓存前一秒还会利用缓存,此时数据还是最新数据,而删除缓存之后的一秒,才会到数据库去查最新数据,这个时间差的代价无论如何一定存在。
伪代码:

public void update(String key, Object data) {
    // 首先删除缓存
    redisCache.delKey(key);
    // 更新数据库
    db.updateData(data);
    // 休眠一段时间,时间依据数据的读取耗费的时间而定
    Thread.sleep(500);
    // 再次删除缓存
    redisCache.delKey(key);
 

总结

1、选择删除缓存 而不是更新
2、如果先修改数据库,再删除缓存,缓存删除成功的机制可以用异步的失败重试机制。
3、如果先删除缓存,再修改数据库,可以使用延时双删的机制。

文章摘录至https://blog.csdn.net/chanmufeng/article/details/122933214文章来源地址https://www.toymoban.com/news/detail-400976.html

到了这里,关于redis和数据库的一致性问题的解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Redis如何保证缓存和数据库一致性?

    现在我们在面向增删改查开发时,数据库数据量大时或者对响应要求较快,我们就需要用到Redis来拿取数据。 Redis:是一种高性能的内存数据库,它将数据以键值对的形式存储在内存中,具有读写速度快、支持多种数据类型、原子性操作、丰富的特性等优势。 优势: 性能极高

    2024年01月16日
    浏览(21)
  • 怎样保证数据库和redis里的数据一致性

    使用缓存更新策略:在更新数据库时,同时更新Redis中相应的数据。这可以通过编写代码来实现,在数据库更新操作完成后,同步更新Redis中对应的数据。这可以通过在代码中使用事务来保证更新的原子性,确保数据库和Redis中的数据保持一致。 使用消息队列:可以将数据库更

    2024年02月19日
    浏览(15)
  • redis实战-缓存数据&解决缓存与数据库数据一致性

    redis实战-缓存数据&解决缓存与数据库数据一致性

    缓存( Cache),就是数据交换的 缓冲区 ,俗称的缓存就是 缓冲区内的数据 ,一般从数据库中获取,存储于本地代码。防止过高的数据访问猛冲系统,导致其操作线程无法及时处理信息而瘫痪,这在实际开发中对企业讲,对产品口碑,用户评价都是致命的;所以企业非常重视缓存技术,

    2024年02月12日
    浏览(17)
  • mysql和redis如何保证数据库一致性

    如果对于小公司的单机服务器来说在更新和删除mysql数据的同时对redis缓存进行更新或者删除就行,一般有两个选择,例如: 先更新MySQL,后删除(或更新)Redis 先删除(或更新)Redis,后更新MySQL 但是不管使用其中哪种方式,都存在两个可能的问题: 由于第一步与第二步并不是原

    2023年04月24日
    浏览(10)
  • Redis 原理缓存过期、一致性hash、雪崩、穿透、并发、布隆、缓存更新策略、缓存数据库一致性

    Redis 原理缓存过期、一致性hash、雪崩、穿透、并发、布隆、缓存更新策略、缓存数据库一致性

    redis的过期策略可以通过配置文件进行配置 redis会把设置了过期时间的key放在单独的字典中,定时遍历来删除到期的key。 1).每100ms从过期字典中 随机挑选20个,把其中过期的key删除; 2).如果过期的key占比超过1/4,重复步骤1 为了保证不会循环过度,导致卡顿,扫描时间上限

    2024年02月08日
    浏览(19)
  • 126、高频Redis面试题:如何保证Redis和数据库数据一致性

    126、高频Redis面试题:如何保证Redis和数据库数据一致性

    问题:如果数据库中的某条数据放入缓存后,又马上被更新了,那我们应该如何更新缓存 缺点: 如果先更新缓存成功,在更新数据库的时候失败,这时候会导致数据不一致;缓存的作用是不是临时将我们数据保存在内存,便于提高查询速度;但是如果某条数据在数据库中都

    2024年02月13日
    浏览(13)
  • Redis缓存MySQL数据库存储二者如何保证数据一致性

    在大型互联网应用中,由于数据库读写频繁、压力大等原因,我们通常会使用缓存来减少数据库的访问次数,提高系统的性能。而Redis作为一个高性能的内存数据库,成为了缓存的首选方案之一。但是,缓存和数据库之间存在数据一致性的问题,如何解决这个问题呢?本文将

    2023年04月19日
    浏览(13)
  • redis面试题目-如何保证数据库与缓存的数据一致性

    原视频:https://www.bilibili.com/video/BV1Km4y1r75f?p=62vd_source=fa75329ae3880aa55609265a0e9f5d34 由于缓存和数据库是分开的,无法做到原子性的同时进行数据修改,可能出现缓存更新失败,或者数据库更新失败的情况,这时候会出现数据不一致,影响前端业务 先更新数据库,再更新缓存。缓

    2024年02月05日
    浏览(15)
  • MySQL数据库和Redis缓存一致性的更新策略
  • redis的缓存更新策略以及如何保证redis与数据库的数据一致性

    redis的缓存更新策略有这么几种: 1、由应用直接和redis以及数据库相连接:         查询数据时,应用去redis中查询,查不到的话再由应用去数据库中查询,并将查询结果放在redis;         更新数据时,由应用去触发redis数据的删除以及数据库的update。 2、应用只跟redi

    2024年02月13日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包