延迟删除保证db,redis一致

作者: 赤子心_d709 | 来源:发表于2019-02-21 22:25 被阅读22次

背景

本文结合一些自己理解,讲解cache miss等情况下如何保证缓存和db的一致性,下面的例子中缓存以redis为例

先redis,redis没有就读db

有几种

1.先更新redis再更新db
2.先更新db再更新redis
3.先更新DB再删除redis
4.先删除redis再更新DB
5.延迟双删
6.延迟删除等变种

各种写场景与db redis一致性

1.先更新redis再更新db

按下面步骤会有问题,AB是两个线程

A_update_redis
B_update_redis
B_update_db
A_update_db

最终db是a值但是redis是b值,不一致

2.先更新db再更新redis

A_update_db
B_update_db
B_update_redis
A_update_redis

最终db是b值但是redis是a值

3.先更新DB再删除redis

A_update_db
B_update_db
B_rm_redis
A_rm_redis

是不是不明白。想不出来怎么不一致了?
不是这样的,没这么简单,第二次rm_redis就会保证后面的redis和db是一致的
实际是下面这种形式

A_get_data
redis_cache_miss
A_get_db
B_update_db
B_rm_redis
(此时如果拿db是b值,但是redis没有值)
A_update_redis

依赖于A_update_redis在B_update_db之后,极端情况
此时redis是old,db是new

4.先删除redis再更新DB

A_rm_redis
B_get_data
B_redis_miss
B_get_db
B_update_redis
A_update_db

此时redis是old值,db是new值

5.延迟双删

rm_redis
update_db
sleep xxx ms
rm_redis

这样叫做双删,最后一次sleep一段时间再rm_redis保证再次读请求回溯打到db,用最新值写redis

6.思考变种

上面的3和5情况可以直接变种,即

update_db
sleep xxx ms
rm_redis

解决了3中的极端情况(靠sleep解决),
并且减少5中第一次不必要的rm redis请求
当然,这个rm_redis还可以考虑异步化(提高吞吐)以及重试(避免异步处理失败),这里不展示

总结

从db回源到redis,需要考虑上面这些极端情况的case

适用场景

当然这些极端情况本身要求同一个key是多写的,这个根据业务需求来看是否需要,比如某些场景本身就是写少读多的

最终从网上看到的延迟双删变种为延迟删除redis也是一种优化

refer

https://my.oschina.net/LucasZhu/blog/1827267
https://blog.csdn.net/hjm4702192/article/details/80518922
https://shidonghua.work/2018/06/05/redis-DB-consistency/

相关文章

  • 延迟删除保证db,redis一致

    背景 本文结合一些自己理解,讲解cache miss等情况下如何保证缓存和db的一致性,下面的例子中缓存以redi...

  • Redis数据库浅析

    相关命令 FLUSHDB 删除当前Redis DB的所有的key FLUSHALL 删除所有Redis DB的所有...

  • DB和redis数据如何保证一致

    先删除数据库在更新缓存 ,然后在延时删除一次。 延迟删除为了解决这种情况。 线程B把线程A删除的缓存,又覆盖了...

  • redis--数据库

    数据库对象定义如下: redisDb定义如下: 过期键删除 惰性删除redis过期键惰性删除策略定义在db.c/e...

  • 使用redis缓存时遇到的问题

    参考文章 主从DB与cache一致性缓存一致性方案解析 引言 之前在项目中用到redis时,复习了一遍redis的...

  • Redis基本数据结构和操作

    1. redis存储结构: redis有0-15个db空间,每个db空间内存key-value redis的db ...

  • redis 过期键的删除策略

    redis 删除过期键策略  定时删除:   优点:定时删除策略对内存是最友好的:通过定时器,定时删除策略可以保证...

  • Redis缓存和数据库不一致怎么解决

    Redis缓存和数据库不一致怎么解决 不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写库,都...

  • Redis

    Redis 从应用到系统内核: Redis的几个话题 Redis删除策略的比较 I/O 模型 数据库和缓存双写一致...

  • Springboot Redis 过期监听

    初始化配置 监听指定db RedisTemplate 指定DB写入 Redis 序列化 监听Redis所有DB过期数据

网友评论

    本文标题:延迟删除保证db,redis一致

    本文链接:https://www.haomeiwen.com/subject/cttjyqtx.html