美文网首页
淘汰缓存还是修改缓存

淘汰缓存还是修改缓存

作者: 老王子H | 来源:发表于2018-12-08 20:59 被阅读0次

问:KV缓存都缓存了一些什么数据?
答:
(1)朴素类型的数据,例如:int
(2)序列化后的对象,例如:User实体,本质是binary
(3)文本数据,例如:json或者html
(4)...

问:淘汰缓存中的这些数据,修改缓存中的这些数据,有什么差别?
答:
(1)淘汰某个key,操作简单,直接将key置为无效,但下一次该key的访问会cache miss
(2)修改某个key的内容,逻辑相对复杂,但下一次该key的访问仍会cache hit

可以看到,差异仅仅在于一次cache miss。

问:缓存中的value数据一般是怎么修改的?
答:
(1)朴素类型的数据,直接set修改后的值即可
(2)序列化后的对象:一般需要先get数据,反序列化成对象,修改其中的成员,再序列化为binary,再set数据
(3)json或者html数据:一般也需要先get文本,parse成doom树对象,修改相关元素,序列化为文本,再set数据

结论:对于对象类型,或者文本类型,修改缓存value的成本较高,一般选择直接淘汰缓存。

问:对于朴素类型的数据,究竟应该修改缓存,还是淘汰缓存?
答:仍然视情况而定。

案例1:
假设,缓存里存了某一个用户uid=123的余额是money=100元,业务场景是,购买了一个商品pid=456。

分析:如果修改缓存,可能需要:
(1)去db查询pid的价格是50元
(2)去db查询活动的折扣是8折(商品实际价格是40元)
(3)去db查询用户的优惠券是10元(用户实际要支付30元)
(4)从cache查询get用户的余额是100元
(5)计算出剩余余额是100 - 30 = 70
(6)到cache设置set用户的余额是70
为了避免一次cache miss,需要额外增加若干次db与cache的交互,得不偿失。

结论:此时,应该淘汰缓存,而不是修改缓存。

案例2:
假设,缓存里存了某一个用户uid=123的余额是money=100元,业务场景是,需要扣减30元。

分析:如果修改缓存,需要:
(1)从cache查询get用户的余额是100元
(2)计算出剩余余额是100 - 30 = 70
(3)到cache设置set用户的余额是70
为了避免一次cache miss,需要额外增加若干次cache的交互,以及业务的计算,得不偿失。

结论:此时,应该淘汰缓存,而不是修改缓存。

案例3:
假设,缓存里存了某一个用户uid=123的余额是money=100元,业务场景是,余额要变为70元。

分析:如果修改缓存,需要:
(1)到cache设置set用户的余额是70
修改缓存成本很低。

结论:此时,可以选择修改缓存。当然,如果选择淘汰缓存,只会额外增加一次cache miss,成本也不高。

总结:
允许cache miss的KV缓存写场景:
大部分情况,修改value成本会高于“增加一次cache miss”,因此应该淘汰缓存
如果还在纠结,总是淘汰缓存,问题也不大

相关文章

  • 淘汰缓存还是修改缓存

    问:KV缓存都缓存了一些什么数据?答:(1)朴素类型的数据,例如:int(2)序列化后的对象,例如:User实体,...

  • 库存是先删缓存还是先改db

    库存是先删缓存还是先改db 先改db再淘汰缓存 缓存失效 A读db数据是旧值 B改数据并淘汰缓存 A写入旧值到缓存...

  • DDBS 缓存架构

    本文主要讨论这么几个问题:(1)“缓存与数据库”需求缘起(2)“淘汰缓存”还是“更新缓存”(3)缓存和数据库的操作...

  • 缓存架构设计细节二三事

    转载:缓存架构设计细节二三事 本文主要讨论这么几个问题: (1)“缓存与数据库”需求缘起 (2)“淘汰缓存”还是“...

  • 缓存相关

    cache淘汰算法:LIRS 算法 缓存那些事 Redis缓存淘汰算法,LRU算法,LRU算法讲解

  • virtualbox下 共享目录权限导致:npm ERR! ET

    //查看npm配置 //修改缓存文件位置 //或者直接修改缓存目录 修改之后发现还是没有解决问题,后在github...

  • 基于双向链表实现自己的内存LRUCache(Java)

    本文将分为以下两个部分: 1.简介几个缓存淘汰算法 2.实现自己的LRU内存缓存(Java) 1.几种缓存淘汰算法...

  • 链表(上):如何实现LRU缓存淘汰算法?

    链表(上):如何实现LRU缓存淘汰算法? 我们都知道缓存可以提高数据读取的性能,但是缓存的大小有限,当缓存被填满时...

  • 链表(上):如何实现LRU缓存淘汰算法?

    经典的链表应用场景,那就是 LRU 缓存淘汰算法 常见的缓存淘汰策略: 先进先出策略 FIFO(First In,...

  • 跟谁学一面

    自定义缓存设计方案(LRU) 常用缓存淘汰算法 内存的淘汰机制主要有以下几种:1、FIFO (First In, ...

网友评论

      本文标题:淘汰缓存还是修改缓存

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