Redis双写一致性

文章目录

  • Redis双写一致性
  • [1. 延迟双删(有脏数据风险)](#1. 延迟双删(有脏数据风险))
  • [2. 异步通知(保证数据最终一致性)](#2. 异步通知(保证数据最终一致性))
  • [3. 分布式锁(数据的强一致,性能低)](#3. 分布式锁(数据的强一致,性能低))

Redis双写一致性

当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致。

1. 延迟双删(有脏数据风险)

  1. 先删缓存,还是先删数据库?
    无论先删缓存还是先删数据库,在多线程情况下都可能导致缓存脏数据的可能。
  2. 延迟双删(有脏数据风险)
  • 读操作:缓存命中,直接返回;缓存未命中查询数据库,写入缓存,设定超时时间
  • 写操作:延迟双删
    删除两次缓存,是为了减少缓存脏数据的可能性
    存在的问题:延迟的时间不好控制

2. 异步通知(保证数据最终一致性)

  • 基于MQ异步通知
  • 基于Canal异步通知

二进制日志(BINLOG)记录了所有DDL语句和DML语句,但不包括数据查询(select,show)语句

3. 分布式锁(数据的强一致,性能低)

读多写少 情况下可以使用分布式锁,能保证数据的强一致性,但是性能比较低

实现:

共享锁:读锁readLock,加锁之后,其他线程可以共享读操作(用在查询数据方法里面)

排他锁:独占锁writeLock,加锁之后,阻塞其他线程读写操作(用在更新数据方法里面)

使用Redisson来实现,对同一把锁分别使用readLock,writeLock。

java 复制代码
RReadWriteLock readWriteLock = redissonClient.getReadWriteLock("ITEM_READ_WRITE_LOCK");
//在更新数据的方法里面使用writeLock
readWriteLock.writeLock();
//在查询的方法使用readLock
readWriteLock.readLock();
相关推荐
DemonAvenger3 分钟前
MySQL内存优化:缓冲池与查询缓存调优实战指南
数据库·mysql·性能优化
RationalDysaniaer8 分钟前
了解etcd
数据库·etcd
正在走向自律20 分钟前
国产时序数据库选型指南-从大数据视角看透的价值
大数据·数据库·清华大学·时序数据库·iotdb·国产数据库
Pocker_Spades_A22 分钟前
Python快速入门专业版(十五):数据类型实战:用户信息录入程序(整合变量、输入与类型转换)
数据库·python
禁默35 分钟前
已知 inode 号,如何操作文件?Ext 文件系统增删查改底层逻辑拆解
linux·服务器·数据库
云飞云共享云桌面43 分钟前
工厂办公环境如何实现一台服务器多人共享办公
运维·服务器·网络·数据库·3d
weixin_456904271 小时前
MySQL高级特性详解
数据库·mysql
Elastic 中国社区官方博客1 小时前
使用 cloud-native Elasticsearch 与 ECK 运行
大数据·数据库·elasticsearch·搜索引擎·kubernetes·k8s·全文检索
Mr_hwt_1231 小时前
基于MyCat 中间件实现mysql集群读写分离与从库负载均衡教程(详细案例教程)
数据库·mysql·中间件·mysql集群
酷ku的森2 小时前
Redis中的Zset数据类型
数据库·redis·缓存