解决Redis的缓存与数据库双写不一致问题

 更新时间:2024年10月25日 14:25:41   作者:编程小菜吉  
在使用缓存和数据库配合时,常见的CacheAsidePattern模式要求读操作先访问缓存,若缺失再读数据库并更新缓存;写操作则是先写数据库后删除缓存,但这种模式可能导致缓存与数据库间的双写不一致问题

一、Cache Aside Pattern

在了解这个问题之前,我们有必要知道缓存+数据库读写数据的模式,也就是Cache Aside Pattern

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

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

写的时候模式分析为什么是删除缓存,而不是更新缓存?

①假设我们有10次写,若是更新缓存的话需要更新10次缓存,10次数据库,我们优化为只需要删除一次缓存,更新10次数据库,当有一个读请求过来只是没有命中,去数据库读取一下,这样对性能的影响也不是很大;

②这是 一个 lazy 计算的思想,不要每次都重新做复杂的计算,不管它会不会用到,而是让它到需要被使用的时候再重新计算。像mybatis,hibernate,都有懒加载思想。

二、缓存与数据库双写不一致

1、双写不一致情况

线程1在写数据库与更新缓存之间卡顿了一下,然后线程2在线程1卡顿的这个空隙去写了数据库并刷新了缓存,然后线程2都已经执行完了,线程1又把脏数据更新到了缓存,造成了数据库与缓存不一致。

2、读写并发不一致

先更新写操作的,由于中间网络问题或者什么问题造成更新数据推后,最后造成了脏数据的更新,导致数据库与缓存双写不一致。

三、解决方案

(1)对于并发几率很小的数据(如个人维度的订单数据、用户数据等),这种几乎不用考虑这个问题,很少会发生缓存不一致,可以给缓存数据加上过期时间,每隔一段时间触发读的主动更新即可。

(2)就算并发很高,如果业务上能容忍短时间的缓存数据不一致(如商品名称,商品分类菜单等),缓存加上过期时间依然可以解决大部分业务对于缓存的要求。

1、消息队列串行化

(1)主要思路:在后台进程中我们可以创建多个队列,然后根据hash算法将写请求路由到不同的队列中,当来读请求的时候,就加入队列中,当写请求处理完毕后,再去处理读请求。

(2)分析:如果对于同一份数据有多个写请求同时在队列中,那么来一个读请求中加入队列中之后,一般写请求耗时比较久,那么读请求会需要很久才能返回,这样会特别影响性能,但能保证一致性(一般情况下建议不要用)

2、加分布式锁

通过加分布式读写锁保证并发读写写写的时候按顺序排好队读读的时候相当于无锁

3、用阿里开源的canal

可以用阿里开源的canal通过监听数据库的binlog日志及时的去修改缓存,但是引入了新的中间件,增加了系统的复杂度

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Redis keys命令的具体使用

    Redis keys命令的具体使用

    本文主要介绍了Redis keys命令的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • redis中跳表zset的具体使用

    redis中跳表zset的具体使用

    Redis跳表zset是一种结合了跳表和有序集合的高效数据结构,适用于实现排序和大规模数据的快速查询,本文主要介绍了redis中跳表zset的具体使用,感兴趣的可以了解一下
    2024-01-01
  • 详解Redis主从复制实践

    详解Redis主从复制实践

    本文将演示主从复制如何配置、实现以及实现原理,Redis主从复制三大策略,全量复制、部分复制和立即复制。
    2021-05-05
  • Redis exists命令bug分析(案例详解)

    Redis exists命令bug分析(案例详解)

    Redis EXISTS 命令用于检查给定 key 是否存在,本文重点给大家介绍Redis exists命令bug分析,感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • Linux下Redis安装使用教程

    Linux下Redis安装使用教程

    这篇文章主要为大家详细介绍了Linux下Redis安装使用教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • Redis和Memcached的区别详解

    Redis和Memcached的区别详解

    这篇文章主要介绍了Redis和Memcached的区别详解,本文从各方面总结了两个数据库的不同之处,需要的朋友可以参考下
    2015-03-03
  • Redis3.2.11在centos9安装与卸载过程详解

    Redis3.2.11在centos9安装与卸载过程详解

    这篇文章主要介绍了Redis3.2.11在centos9安装与卸载过程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Redis搜索日期范围内的查询示例

    Redis搜索日期范围内的查询示例

    Redis作为内存数据结构存储系统,虽未专为日期范围查询设计,但可通过存储日期数据、使用KEYS命令或有序集合(SortedSet)实现查询功能,下面就来介绍一下
    2024-09-09
  • redis分布式Jedis类型转换的异常深入研究

    redis分布式Jedis类型转换的异常深入研究

    这篇文章主要介绍了redis分布式Jedis类型转换的异常深入研究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • 在redis中防止消息丢失的机制

    在redis中防止消息丢失的机制

    在项目中,由于网络问题,我们很难保证生产者发送的消息能100%到达消息队列服务器,也就是说有消息丢失的可能性,因 此,生产者就必须具有消息丢失检测和重发机制,这篇文章主要介绍了如何在redis中防止消息丢失,需要的朋友可以参考下
    2023-02-02

最新评论