Redis 先操作数据库和先删除缓存, 一致性分析

初始状态: 数据库和缓存中v=10
第一种,先删除缓存在操作数据库:
线程1准备更新数据库的值v=20,先删除缓存, 此时线程2进来, 缓存未命中,查询数据库v=10, 写入缓存v=10, cpu回到线程1继续更新数据库操作,v=20, 导致数据库和缓存不一致.
第二种,先操作数据库在删除缓存:
线程1插叙缓存未命中,查询数据库v=10,准备写入缓存,此时线程2进来,更新数据库v=20,删除缓存,cpu回到线程1,写入缓存v=10,导致数据库和缓存不一致
分析: 两种情况都有导致缓存不一致的可能, 但是第二种的可能性非常低,因为:
1, 第二种不一致的前提是某种原因导致缓存已经失效,使线程1进来时未命中
2,写入缓存的效率要远比更新数据库的效率要高, 第二种情况,在线程1查完数据库到写入完缓存的时间非常短,不容易有线程插进来.
而第一种,由于更新数据库的时间相对较长, 更容易被其他线程抢占
结论: 先操作数据库,再删除缓存.
(图源黑马点评)
Redis 先操作数据库和先删除缓存, 一致性分析的更多相关文章
- php 用封装类的方法操作数据库和批量删除
封装类 <?php class DBDA { public $host="localhost"; //服务器地址 public $uid="root"; ...
- DDL_操作数据库_创建&查询和DDL_操作数据库_修改&删除&使用
DDL操作数据库.表 1.操作数据库:CRUD C(Create):创建 创建数据库: create database 数据库名称: 创建数据库判断不存在再创建 create database if ...
- redis系列之数据库与缓存数据一致性解决方案
redis系列之数据库与缓存数据一致性解决方案 数据库与缓存读写模式策略 写完数据库后是否需要马上更新缓存还是直接删除缓存? (1).如果写数据库的值与更新到缓存值是一样的,不需要经过任何的计算,可以 ...
- Redis批量删除缓存数据
背景: 在使用redis中,经常会遇到批量删除缓存的情况,但是对于在客户端中,如果一个一个的删除key,则需要较长时间及相对麻烦,可以使用以下命令,批量删除缓存. 本地批量删除KEY: ./redis ...
- 分布式-技术专区-Redis和MySQL缓存一致性问题
1.Redis 缓存和 MySQL 数据如何实现一致性 需求起因 缓存和数据库一致性解决方案 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操 ...
- 缓存一致性?get💡
大家好,我是老三,今天又是被算法致郁的一天,写篇文章缓一缓. 这篇文章,我们来看看缓存一致性问题. 缓存一致性 我接下来会巴巴说一堆缓存一致性,但是-- 作为一名暴躁老哥,我先把结论撂这了! 缓存和数 ...
- python对缓存(memcached,redis)的操作
1.Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的 ...
- python redis操作数据库方法
Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorte ...
- python语言(五)匿名函数、读写excel、操作数据库、加密、redis操作
一.匿名函数 递归:就是调用自己 def func(): num = int(input('num:')) if num % 2 ==0: print('是偶数') return else: func ...
随机推荐
- shiro登录过程
工作流程: 浏览器将用户名.密码.是否记住登录等信息发送给登录controller , new UsernamePasswordToken()获取token,将用户名.加密后的密码.rememberM ...
- Postman中的断言
Postman设置断言 一.断言的定义 1.什么是断言? 一般一个完整的接口测试,包括:请求->获取响应正文->断言,请求和获取响应正文很常见.断言一般是对请求的响应结果做操作,判断预期结 ...
- Hnoi2014世界树
题面 说明/提示 N<=300000, q<=300000,m[1]+m[2]+...+m[q]<=300000 题解 这道题一看 "m[1]+m[2]+...+m[q]& ...
- C#基础_C#判断文件是否被打开
1.用文件流判断 using System; using System.Collections.Generic; using System.IO; using System.Linq; using S ...
- Filter(过滤器)、ThreadLocal(本地线程)、Listener(监听器)
Filter(过滤器) Filter过滤器它的作用是:拦截请求,过滤响应. 过滤器链 1)执行的顺序依次是: A B C Demo03 C2 B2 A2 2)如果采取的是注解的方式进行配置,那么过滤器 ...
- window桌面背景图片
通过修改注册表项: \HKEY_CURRENT_USER\Control Panel\Desktop下的几个值,及可以将我们想要的图片设置成桌面的背景图 TileWallpaper Wallpap ...
- python自学笔记10:while循环和for循环
条件控制和循环控制是两种典型的流程控制方法,前面我们写了 if 条件控制,这节讲 for 循环和 while 循环. 循环是另一种控制流程的方式,一个循环体中的代码在程序中只需要编写一次,但可能会连续 ...
- 使用 Mypy 检查 30 万行 Python 代码,总结出 3 大痛点与 6 个技巧!
作者:Charlie Marsh 译者:豌豆花下猫@Python猫 英文:Using Mypy in production at Spring (https://notes.crmarsh.com/u ...
- 三门问题模拟对比试验——附VB6和Python3源程序及EXE文件
三门问题模拟对比试验 [直接跳转到文件下载] 前言 "三门问题"是一个很有意思的概率论问题,涉及贝叶斯公式,是人工智能领域的一个经典问题. 为了直观地研究这个问题,也为了测试一下P ...
- 获取客户端访问真实 IP
转载自:https://www.qikqiak.com/post/get-client-realip/ 通常,当集群内的客户端连接到服务的时候,是支持服务的 Pod 可以获取到客户端的 IP 地址的, ...