1,redis数据为什么会存在和数据库数据不一致的问题

在多线程并发情况下,假设有两个数据库修改请求,为保证数据库与redis的数据一致性,
修改请求的实现中需要修改数据库后,级联修改redis中的数据。
请求一:1.1修改数据库数据 1.2 修改redis数据
请求二:2.1修改数据库数据 2.2 修改redis数据
并发情况下就会存在1.1 ---> 2.1 ---> 2.2 ---> 1.2的情况

此时存在的问题就是:
1.1修改数据库的数据最终保存到了redis中,2.1在1.1之后也修改了数据库数据。
此时出现了redis中数据和数据库数据不一致的情况,在后面的查询过程中就会长时间去先查redis,
从而出现查询到的数据并不是数据库中的真实数据的严重问题。

2.单删策略为什么不能解决数据一致性问题

上面的单删策略情况如下:
修改请求的实现中需要修改数据库后,级联删除redis中的数据。
请求一:1.1修改数据库数据 1.2 删除redis数据
请求二:2.1修改数据库数据 2.2 删除redis数据

假设现在并发存在一个查询请求
请求三:3.1查询redis中数据 3.2查询数据库数据 3.3 新查到的数据写入redis
(一定要理解带redis的查询请求实现逻辑,先查redis,数据不存在查数据库,
查到的数据写入redis以便以后的查询不去直接查数据库)

此时并发情况下就会存在1.1 ---> 1.2 ---> 3.1 ---> 3.2 ---> 2.1 ---> 2.2 ---> 3.3的情况

此时存在的问题就是:
此时数据库中的数据保存的是2.1修改后的数据,而redis中保存的数据是3.2中在1.1修改数据后的结果,
此时出现了redis中数据和数据库数据不一致的情况,在后面的查询过程中就会长时间去先查redis,
从而出现查询到的数据并不是数据库中的真实数据的严重问题。

3.延迟双删为什么会确保数据一致性

添加延时双删策略后的情况
请求一:1.1修改数据库数据 1.2 删除redis数据 1.3 延时3--5s再去删除redis中数据
请求二:2.1修改数据库数据 2.2 删除redis数据 2.3 延时3--5s再去删除redis中数据
请求三:3.1查询redis中数据 3.2 查询数据库数据 3.3 新查到的数据写入redis

双删策略为什么能解决问题:
因为存在了延时时间,故1.3或2.3 一定是最后执行的一步操作(并发中的延时一定要理解)
延时的根本目的就是为了让程序先把3.3执行完,再去删除redis,这个延时的时间取决于读操作的时间来设定

redis的延迟双删策略的更多相关文章

  1. Redis与Mysql双写一致性方案解析

    一 前言 首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用.在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作 但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存 ...

  2. Redis数据过期和淘汰策略详解(转)

    原文地址:https://yq.aliyun.com/articles/257459# 背景 Redis作为一个高性能的内存NoSQL数据库,其容量受到最大内存限制的限制. 用户在使用Redis时,除 ...

  3. Redis(二十):Redis数据过期和淘汰策略详解(转)

    原文地址:https://yq.aliyun.com/articles/257459# 背景 Redis作为一个高性能的内存NoSQL数据库,其容量受到最大内存限制的限制. 用户在使用Redis时,除 ...

  4. Redis 数据结构与内存管理策略(上)

    Redis 数据结构与内存管理策略(上) 标签: Redis Redis数据结构 Redis内存管理策略 Redis数据类型 Redis类型映射 Redis 数据类型特点与使用场景 String.Li ...

  5. Redis 响应延迟问题排查

    计算延迟时间 如果你正在经历响应延迟问题,你或许能够根据应用程序的具体情况算出它的延迟响应时间,或者你的延迟问题非常明显,宏观看来,一目了然.不管怎样吧,用redis-cli可以算出一台Redis 服 ...

  6. redis学习笔记——Redis过期键的删除策略

    Redis过期键的删除策略 对于过期键一般有三种删除策略 定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作: 惰性删除:放任键过期 ...

  7. Redis 键的过期删除策略及缓存淘汰策略

    前言 Redis缓存淘汰策略与Redis键的过期删除策略并不完全相同,前者是在Redis内存使用超过一定值的时候(一般这个值可以配置)使用的淘汰策略:而后者是通过定期删除+惰性删除两者结合的方式进行内 ...

  8. 动手实现 LRU 算法,以及 Caffeine 和 Redis 中的缓存淘汰策略

    我是风筝,公众号「古时的风筝」. 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 那天我在 LeetCode 上刷到一道 LRU 缓存机制的问题, ...

  9. Redis的过期键删除策略

    文章首发于公众号:蘑菇睡不着,欢迎来看看 前言 Redis 中都是键值对的存储形式,键都是字符串类型的,而值有很多种类型,如 string.list.hash.set.sorted set等类型.当设 ...

  10. Redis++:Redis 内存爆满 之 淘汰策略

    前言: 我们的redis使用的是内存空间来存储数据的,但是内存空间毕竟有限,随着我们存储数据的不断增长,当超过了我们的内存大小时,即在redis中设置的缓存大小(maxmeory 4GB),redis ...

随机推荐

  1. [BUUCTF][Web][ACTF2020 新生赛]Exec 1

    打开靶机对应url 显示可以输出ip 来进行ping操作 尝试试一下是否有命令注入的可能 127.0.0.1|ls 果然可以,输出结果 index.php PING 127.0.0.1 (127.0. ...

  2. 学习go语言编程之网络编程

    Socket编程 Golang语言标准库对Socket编程进行了抽象,无论使用什么协议建立什么形式的连接,都只需要调用net.Dial()即可. Dial()函数 Dial()函数的原型如下: fun ...

  3. 关于json序列化时报错json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

    1.今天在写客户端与服务端交互的程序的时候,发现了一个问题 客户端代码 #客户端程序主要是发送注册请求/登录请求给服务端,服务端接收响应后回应对应的应答给客户端,客户端接收响应后,然后做一些操作 # ...

  4. 【LeetCode二叉树#15】二叉搜索树的最小绝对差(巩固迭代中序遍历#2)

    二叉搜索树的最小绝对差(迭代法中序遍历巩固) 力扣题目链接(opens new window) 给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值. 示例: 提示:树中至 ...

  5. 【Azure 应用服务】azure function powershell 调用 New-AzADServicePrincipal -DisplayName $sp -PasswordCredential $spCred

    问题描述 powershell 调用New-AzADServicePrincipal -DisplayName $sp -PasswordCredential $spCred,出现如下错误: Reso ...

  6. 自定义ConditionalOnXX注解(二)

    一.前言 在之前的文章<自定义ConditionalOnXX注解>中,介绍了Conditional注解的实现原理和实现自定义Conditional注解的基础方法,但是有些场景我们需要用一个 ...

  7. vue3页面使用vue2语法

    vue3页面: import { getCurrentInstance } from 'vue'; const { proxy } = getCurrentInstance(); proxy...

  8. springboot+kaptcha生成数学运算验证码和字符验证码

    使用以下代码只需要复制粘贴,修改一处文本生成器路径即可,文中有交代. 1.添加kaptcha依赖 <dependency> <groupId>com.github.penggl ...

  9. vscode 两种定位跳转的方法 ctrl+p 方法1 path:行号 方法2 #变量名 - 针对$store变量不好找的方案 方法1可以备注在代码里面

    vscode 两种定位跳转的方法 ctrl+p 方法1 path:行号 方法2 #变量名 - 针对$store变量不好找的方案 方法1可以备注在代码里面 问题 $store的变量不能跳转,有跳转插件也 ...

  10. vscode ctrl + d 删除当前行 更改快捷键

    vscode 删除当前行 更改快捷键