比较常用的缓存策略,同样这也是facebook的缓存策略: 
1. 读:应用程序从cache中取数据,取到后返回。 
2. 读:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。 
3. 增删改:先把数据存到数据库中,成功后,再让缓存失效。

这里针对第3点,会有一些其他的用法,乍一看都是很正常的,但后来细细一想其实都是有问题的。 
比如(1)“先更新redis,然后更新DB” 
(2)“先更新DB,然后更新缓存” 
(3)“先删除缓存,然后再更新数据库”

让我们来看一看这三个都有什么问题,先假设更新DB和更新redis都是在同一个事务中,其中一个失败了就都不操作,或者假设这两个动作都不会失败。

先看第(1)个和第(2)个,Quora上的这个问答已经说明了原因:https://www.quora.com/Why-does-Facebook-use-delete-to-remove-the-key-value-pair-in-Memcached-instead-of-updating-the-Memcached-during-write-request-to-the-backend。

为了更生动形象说明问题,我画了张图来证明它的不可行性:

从图中可以看出,两个并发写操作,由于某些原因(io阻塞,cpu时间片分配,协程调度,网络原因等等),导致goroutine2的更新DB晚于goroutine1的更新DB,但是redis中此时的数据goroutine1的,而DB中的数据时goroutine2的,这就出现了不一致的问题,DB中是脏数据。

第(2)个是同样的道理,见下图:

下面我们来看第(3),两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,会把老数据读出来后放到缓存中,然后更新操作更新了DB。于是,在缓存中的数据还是老的数据,导致缓存中的数据是脏的,而且还一直这样脏下去了。
--------------------- 
作者:jeffrey11223 
来源:CSDN 
原文:https://blog.csdn.net/jeffrey11223/article/details/78823047 
版权声明:本文为博主原创文章,转载请附上博文链接!

redis缓存策略小结相关推荐

  1. Redis缓存策略设计及常见问题

    Redis缓存设计及常见问题 缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要.下面会介绍缓存使用技巧和设计方案,包含如下内容:缓存的收益和成本分析.缓存更新策略的选 ...

  2. Redis 缓存穿透、雪崩、缓存数据库不一致、持久化方式、分布式锁、过期策略

    1. Redis 缓存穿透 1.1 Redis 缓存穿透概念 访问了不存在的 key,缓存未命中,请求会穿透到 DB,量大时可能会对 DB 造成压力导致服务异常. 由于不恰当的业务功能实现,或者外部恶 ...

  3. Redis缓存失效策略思考

    1 删除过期数据 我们设置Redis元素时可以指定过期时间,那么Redis如何删除这些超时元素?Redis采用了两种策略:定期删除和惰性删除. (1) 定期删除 Redis每隔一段时间就检查哪些KEY ...

  4. @cacheable 设置过期时间_缓存面试三连击——聊聊Redis过期策略?内存淘汰机制?再手写一个LRU 吧!...

    大家好,今天我和大家想聊一聊有关redis的过期策略的话题. 听到这里你也许会觉得:"我去,我只是个日常搬砖的,这种偏底层的知识点,我需要care吗?" 话虽如此·,但是兄die, ...

  5. redis缓存清除策略 、获取dumb.rdb或者***.aof文件的位置

    redis缓存清除策略 获取dumb.rdb或者***.aof文件的位置

  6. Redis 缓存回收的7种策略volatile设置过期时间及allkeys所有数据范围内

    1.基础说明 当redis设置内存使用限制后,当达到内存限制时,Redis将尝试删除key(控制节点的最大使用内存) redis.conf中配置项maxmemory <bytes>或者控制 ...

  7. Redis缓存过期和淘汰策略

    题记: 文章内容输出来源:拉勾教育Java高薪训练营. 本篇文章是 Redis 学习课程中的一部分笔记. Redis缓存过期和淘汰策略 Redis性能高: 官方数据 读:110000次/s 写:810 ...

  8. Redis缓存过期策略

    转载出处链接 一.背景 线上你写代码的时候,想当然的认为写进 redis 的数据就一定会存在,后面导致系统各种 bug,谁来负责? 常见的有两个问题: 往 redis 写入的数据怎么没了? 可能有同学 ...

  9. 【Redis学习03】redis缓存及其更新策略

    文章目录 1. 什么是缓存 2. 添加redis缓存 2.1 缓存商铺信息 3. 缓存更新策略 3.1 缓存更新策略方法 3.2 主动更新策略 3.3 缓存更新策略总结 4. 对商铺查询的缓存添加超时 ...

最新文章

  1. kafka-manager 的编译和使用(附安装包)
  2. sql help cs
  3. 实验四:汇编代码调用系统调用的工作过程
  4. 【转蝈蝈俊.net 】SQL Server 2005 配置发送邮件
  5. Python零碎知识(7):硬性出错
  6. VC6程序申请管理员权限
  7. 拉普拉斯矩阵(Laplace Matrix)与瑞利熵(Rayleigh quotient)
  8. java中对于异常的处理,代码简单描述
  9. Android开发之RecyclerView之刷新数据notifyDataSetChanged失败的问题
  10. About the windchill Command -
  11. android fragment动画,Fragment 的过场动画
  12. Java反序列s ysoserial Spring
  13. NOIP2015运输计划
  14. 图说报告|智能技术群的“核聚变”推动智能+时代到来
  15. python模拟登录中国海洋大学教务系统(青果)- 爬取学期所有专业课至excel - 并进行课表排课(三)
  16. 敏捷迭代燃尽图_3个敏捷燃尽报告以及如何使用它们
  17. 10100cpu支持Linux,i3-10100 cpu能装win7吗?i3-10100 装win7详细教程(完美支持)
  18. 武汉大学 计算机学院 曹瑀,武大计算机青协
  19. 同济大学软件学院万院长谈择业(转载)
  20. scanf(%*s)

热门文章

  1. 通过Flask和Redis构造一个动态维护的代理池
  2. 线段树总结(一)【数据结构】
  3. LENOVO 充到60%就会停止充电
  4. java加载证书,访问12306的https链接
  5. 学习 LLVM(14) SmallPtrSet
  6. 李天平:职场智慧之如何提升自己在公司的价值
  7. 有谁还用QuickReport吗?
  8. 多网卡指定网卡发送数据
  9. 将h.264视频流封装成flv格式文件
  10. ACE中的Proactor和Reactor