Redis缓存如何保证数据一致性

一. Redis概述

  • redis是一个内存数据库, 因此数据基本上都存在于内存当中
  • 但是Redis会定时以追加或者快照的方式刷新到硬盘中.
  • 由于redis是一个内存数据库, 所以读取写入的速度是非常快的, 所以经常被用来做数据, 页面等的缓存。

二.为什么会出现数据不一致

2.1 一般的读写模式

当Redis作为缓存的时候,经典的读写模式如下:

(1)读的时候,先读缓存,缓存没有的话,那么就读数据库,然后取出数据后放入缓存,同时返回响应

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

问题:

  • 上述的读写模式看似没有任何问题,但是在高并发及多线程的情况下会出现数据不一致的情况。

2.2 单库产生数据不一致

发生条件:

  • 同一时间发生了并发读写请求,比如A(写) ,B (读),2个请求

发生过程:

  • A发送更新请求,先删除缓存,删除缓存后由于某种原因被阻塞
  • B发送读请求,此时缓存无效,直接读取数据库,再将数据库的数据更新到缓存中
  • 之后A再写数据库
  • 这时候缓存和数据库就产生了数据不一致的问题,缓存中的数据就是脏数据

2.2 主从同步,读写分离产生数据不一致

主从同步,读写分离:实际上就是读数据库都是读从库,写数据库是写主库,然后进行主从同步。

过程:

  • A请求发送一个写操作到服务端,第一步就会淘汰掉cache
  • A请求写主数据库,往主数据库写了最新的数据。
  • B请求发送一个读操作,读cache,因为cache淘汰,所以为空
  • B请求继续读DB,这个时候读的是从库,此时主从同步还没同步成功。读出脏数据,然后脏数据写入cache
  • 最后数据库主从同步完成。这时候还是会发生数据不一致的情况。

三. 数据不一致解决方案

3.1 缓存双淘汰法

  • 在写库前后都进行redis.del(key)操作,并且设定合理的超时时间。这样最差的情况是在超时时间内存在不一致,当然这种情况极其少见,可能的原因就是服务宕机。此种情况可以满足绝大多数需求。 当然这种策略要考虑redis和数据库主从同步的耗时,所以在第二次删除前最好休眠一定时间,比如500毫秒,这样毫无疑问又增加了写请求的耗时。

3.2 异步淘汰缓存

  • 增加一个线下的读取binlog异步淘汰缓存模块,在读取binlog总的数据,然后进行异步淘汰。

过程:

MySQL binlog增量发布订阅消耗+消息队列+增量数据更新到redis

1)读取请求转到Redis:热数据基本上在Redis

2)写入请求转到MySQL:增加删除和 修改MySQL

3)更新Redis数据:MySQ数据操作binlog更新为Redis

数据库面试题:Redis如何保证数据一致性相关推荐

  1. 分布式缓存数据库面试题redis

    redis和memcached什么区别?为什么高并发下有时单线程的redis比多线程的memcached效率要高? 区别: 1.mc可缓存图片和视频.rd支持除k/v更多的数据结构; 2.rd可以使用 ...

  2. MySQL数据库面试题(2021最新版)

    文章目录:http://github.crmeb.net/u/defu 数据库基础知识 为什么要使用数据库 什么是SQL? 什么是MySQL? 数据库三大范式是什么 mysql有关权限的表都有哪几个 ...

  3. 复试面试-数据库面试题

    将网上常见的数据库面试题整理一下,方便自己和有需要的人学习. 1.事务 概念:访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位.事务由事务开 ...

  4. 2020字节跳动数据库面试题及答案(二)—— NoSQL部分

    本文答案整理为原创,转载请说明出处 文章目录 redis 的底层数据结构有哪些 redis 中的 SDS 和 C 语言中的字符串有什么区别,优点是什么 redis 中的字典是如何实现的,如何解决冲突和 ...

  5. datagrid如何获取一行数据中的某个字段值_或许是全网最全面关于数据库面试题...

    原文: https://www.enmotech.com/web/detail/1/794/1.html 两万字全面论述数据库面试题(上) https://www.enmotech.com/web/d ...

  6. 计网/数据库面试题(更新中ing~~)

    计网/数据库面试题(更新中ing~~) <计算机网络> 1. OSI七层模型.设备 (传输层)协议的多路分用和复用 2. TCP/IP四层模型==五层模型 (传输层)TCP和UDP协议对比 ...

  7. redis主从保证数据一致性

    redis主从保证数据一致性 前言 在redis中为了保证redis的高可用,一般会搭建一种集群模式就是主从模式. 主从模式可以保证redis的高可用,那么redis是怎么保证主从服务器的数据一致性的 ...

  8. SQL编程软件测试,编程程题库之软件测试8大常见数据库面试题

    原标题:编程程题库之软件测试8大常见数据库面试题 一.事务的四大特性 原子性,要么执行,要么不执行 隔离性,所有操作全部执行完以前其它会话不能看到过程一致性,事务前后,数据总额一致持久性,一旦事务提交 ...

  9. C# 联合查询_直击数据库面试题:数据库查询语句

    Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 问题 ...

  10. Oracle数据库面试题 精选 Oracle 面试题

    Oracle数据库面试题 1.解释冷备份和热备份的不同点以及各自的优点 冷备份 发生在数据库已经正常关闭的情况下,将关键性文件拷贝到另外位置的一种说法.适用于所有模式的数据库. 优点 1. 是非常快速 ...

最新文章

  1. Java主要知识结构
  2. wxWidgets:运行时类型信息 (RTTI)
  3. 前端程序员书桌上不可缺少的CSS书籍
  4. 独家分享| 2019年校招大厂算法自己经历和好友经验(大疆,百度,腾讯……)
  5. socket,与粘包
  6. WEB版一次选择多个文件进行批量上传(Plupload)的解决方案
  7. 程序员必杀技——《编程全能词典》即将震憾上市
  8. Java面向对象 第5节 抽象类和接口
  9. ROS2 Galactic teb_local_planner
  10. unity打开摄像头
  11. 【金融量化】我以为我是食物链顶层的收割者,想不到只是别人手中的镰刀
  12. Mybatis学习整理
  13. 食品加工企业自营商城小程序开发,帮助企业增加销售渠道,提高销量
  14. Navicat 连接阿里云上的数据库
  15. Polkadot + DeFi | 透明公平、高效交易的去中心化金融未来可期
  16. windows下根据端口号查杀进程脚本(BAT脚本)
  17. poj3253切割木板(哈夫曼树) 贪心【优先队列】
  18. 捞王二闯IPO,谁是“火锅第三股“?||Review
  19. compressGOP函数代码跟踪
  20. 高等数学学习笔记——第二十一讲——函数的一致连续性

热门文章

  1. phpstudy修改mysql账户名_phpstudy怎么更改用户名
  2. SI24R1兼容NRF24L01P DEMO板使用说明书
  3. 业务测试如何无缝转成测试开发?
  4. 美股全线收涨 特斯拉涨超7% 瑞幸大跌近13%
  5. B站有哪些程序员大牛up主?
  6. 拼多多商品详情页API接口、拼多多APP详情API接口、拼多多商品销量API接口、拼多多商品列表API接口、拼多多详情API接口
  7. linux aria2安装路径,Aria2 Linux 完整安装及使用教程
  8. ps里文字变形、、、
  9. stm32晶振匹配电容_晶振的匹配电容选择
  10. 关于等价鞅、反等价鞅、剀利公式、赌徒输光定理(非常有启发意义)