Redis_保证缓存与数据库数据一致性/分布式锁/预防缓存击穿/Spring Cache能否保证数据一致性

本文讨论了在Redis中保证缓存与数据库数据一致性的策略,包括为何在写数据时选择删除而非更新缓存,以及如何处理缓存失效时可能的数据不一致问题。文章提到了Redisson分布式锁作为解决方案,并解释了缓存击穿现象及其解决办法。最后,对于Spring Cache是否能确保数据一致性进行了分析。
摘要由CSDN通过智能技术生成

缓存与数据库读写模式

  • 读数据时先读缓存,如果缓存中有数据直接响应,如果没有数据,查询数据库,写入缓存,同时响应
  • 写数据时,先写入数据库,并删除缓存

为什么写数据时删除缓存而不是更新缓存?

如果这个数据写多读少,频繁的更新缓存反而会造成资源浪费,删除缓存则采用了懒加载的思想。

缓存失效模式存在的问题

如果多个线程同时在缓存过期时访问数据库请求数据,由于种种状况的可能(比如一个线程先访问到数据库,但是在取数据时卡住了,另一个线程访问到数据库,取到数据放入缓存,这时前一个线程刚取到数据,又把更新的缓存给覆盖掉了),可能导致缓存和数据库数据不一致的问题。

如何保证缓存与数据库数据一致性

核心是在缓存过期时,所有微服务只能有一个请求访问数据库。

另外,如果数据的一致性要求不是非常严格,即使在短时间内存在数据不一致的情况,只要设置了缓存过期时间,每隔一段时间会自动更新到最新数据,不影响实际业务也可。

Redisson分布式锁

public Map<String, List<Vo>> getJsonFromDBWithRedissonLock() {
   
    // 1、占分布式锁,去reids占坑
    RLock lock = redisson.getLock("Json-lock");
    lock.lock(); // 阻塞等待
    // 加锁成功...执行业务
    Map<String, List<Vo>> dataFromDB;
    try {
   
        // 访问数据库
        dataFromDB = getJSONDataFromDB();
    } finally {
   
        lock
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值