redis怎么保证数据一致性安全_redis最终一致性

redis怎么保证数据一致性安全_redis最终一致性redis证数据一致性方法:更新的时候,先更新数据库,然后再删除缓存;读的时候,先读缓存;如果没有的话,就读数据库,同时将数据放入缓存,并返回响应。

一般来说,只要你用到了缓存,不管是Redis还是memcache,就可能会涉及到数据库缓存与数据的一致性问题,这里我们以Redis为例。

redis怎么保证数据一致性安全_redis最终一致性

我们该如何保证Redis与数据库的一致性呢?

So easy: (推荐学习:Redis视频教程)

更新的时候,先更新数据库,然后再删除缓存。

读的时候,先读缓存;如果没有的话,就读数据库,同时将数据放入缓存,并返回响应。

乍一看,一致性问题貌似很好的得到了解决。但仔细一想,你会发现还是有问题:如果先更新了数据库,删除缓存的时候失败了怎么办?那么数据库中是新数据,缓存中是老数据,数据出现不一致了。

改进方案:

先删除缓存,后更新数据库。因为即使后面更新数据库失败了,缓存是空的,读的时候会从数据库中重新拉,虽然都是旧数据,但数据是一致的。

所以方案就变成了:

更新的时候,先删除缓存,然后再更新数据库。

读的时候,先读缓存;如果没有的话,就读数据库,同时将数据放入缓存,并返回响应。

到这里是不是问题就得到了彻底的解决了呢?

其实并没有,在高并发的场景下,会出现这样的情况:数据发生了变更,先删除了缓存,然后去修改数据库。此时还没来得及修改,一个请求过来了,去读缓存,发现缓存空了,去读数据库,读到了准备修改前的旧数据,并且把旧数据放到了缓存。

随后,数据变更程序完成了数据库的修改。那么完了,这个时候发生数据不一致了……

nginx-34.png解决方案:

针对这种情况,可以先把“修改DB”的操作放到一个JVM队列,后面读请求过来之后,“更新缓存”的操作也放进同一个JVM队列,每个队列,对于一个作业线程,按照队列的顺序,依次执行相关操作,这样就可以保证“更新缓存”一定是在DB修改之后,以保证数据一致性,具体如下图所示:

nginx-35.png

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/10852.html

(0)
上一篇 2022-12-20
下一篇 2022-12-20

相关推荐

  • MySQL数据库:注释及数据类型

    MySQL数据库:注释及数据类型注释 数据类型 1.整形 ​ tinyint、smallint、mediumint、int、bigint ​ 小整数值 大整数值 大整数值 大整数值 极大整数值 2.浮点型 ​ float、doubl

    2022-12-21
    155
  • Python os.path.join函数实现路径拼接

    Python os.path.join函数实现路径拼接在Python中,os.path.join()函数是用于拼接路径的。该函数接受多个路径组件作为参数,返回这些组件的连接路径。

    2023-12-08
    116
  • Python导包实践指南

    Python导包实践指南Python作为一种非常流行又易学易用的编程语言,有着非常强大的社区和庞大的代码库。在Python程序中,我们通常会使用许多不同的包和模块,来实现各种各样的功能,这些包和模块的导入方式对于程序的设计和实现来说都非常重要。

    2024-09-02
    21
  • 技术分享 | 快速掌握 MySQL 8.0 认证插件的使用「建议收藏」

    技术分享 | 快速掌握 MySQL 8.0 认证插件的使用「建议收藏」作者:郭斌斌 引言 MySQL 8.0.15 版本主从复制时,io 线程一直处于 connecting 状态, 由于复制用户使用的认证插件是 caching_sha2_password,而想要通过 …

    2023-01-29
    145
  • Python断点调试详解

    Python断点调试详解在软件开发过程中,代码出现问题是常见的情况,为了尽快解决问题,开发者需要使用一些工具来调试代码。Python作为一门强大而又易学的编程语言,也提供了许多调试工具来协助开发者。

    2024-08-16
    24
  • 提高Python程序执行效率的技巧之多线程应用

    提高Python程序执行效率的技巧之多线程应用随着数据量的不断增加,程序算法的优化已经难以满足对程序运行速度的要求。因此,使用并发编程技术提高程序执行效率已经成为了不可或缺的重要手段。Python中提供了多线程库Thread,为我们实现多线程编程提供了便利。在本文中,我们将介绍如何使用Python的多线程库实现多线程编程,提高程序执行效率。

    2024-03-25
    70
  • Python 3格式化输出

    Python 3格式化输出Python是一种动态、面向对象、解释型和高级语言,因为其简单、易读、安全和可扩展等特点,越来越受到开发者的欢迎。Python中的输出功能非常强大,可以在控制台中显示从简单的字符串到复杂的数据结构。 Python提供了多种方法来格式化和输出这些信息,这些方法都经过精心设计,可以让程序员轻松地扩展代码。

    2024-06-02
    53
  • vlan划分和access端口,trunk端口,hybrid端口的配置[亲测有效]

    vlan划分和access端口,trunk端口,hybrid端口的配置[亲测有效]#一.华为交换机上的端口类型access接口,用于连接终端设备,access接口只允许一个vlan的流量通过。trunk接口,用于连接不通交换设备,trunk接口可以允许多个vlan的流量通过。hy…

    2023-03-30
    142

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注