缓存,究竟是淘汰,还是修改?

开发 开发工具 前端
允许cache miss的场景,不管是memcache还是redis,当被缓存的内容变化时,是改修改缓存,还是淘汰缓存?这是今天将要讨论的话题。

允许cache miss的场景,不管是memcache还是redis,当被缓存的内容变化时,是改修改缓存,还是淘汰缓存?这是今天将要讨论的话题。

[[235427]]

问:KV缓存都缓存了一些什么数据?

答:

  • 朴素类型的数据,例如:int
  • 序列化后的对象,例如:User实体,本质是binary
  • 文本数据,例如:json或者html
  • ...

问:淘汰缓存中的这些数据,修改缓存中的这些数据,有什么差别?

答:

  • 淘汰某个key,操作简单,直接将key置为无效,但下一次该key的访问会cache miss
  • 修改某个key的内容,逻辑相对复杂,但下一次该key的访问仍会cache hit

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

问:缓存中的value数据一般是怎么修改的?

答:

  • 朴素类型的数据,直接set修改后的值即可
  • 序列化后的对象:一般需要先get数据,反序列化成对象,修改其中的成员,再序列化为binary,再set数据
  • json或者html数据:一般也需要先get文本,parse成doom树对象,修改相关元素,序列化为文本,再set数据

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

问:对于朴素类型的数据,究竟应该修改缓存,还是淘汰缓存?

答:仍然视情况而定。

案例1:

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

分析:如果修改缓存,可能需要:

  • 去db查询pid的价格是50元
  • 去db查询活动的折扣是8折(商品实际价格是40元)
  • 去db查询用户的优惠券是10元(用户实际要支付30元)
  • 从cache查询get用户的余额是100元
  • 计算出剩余余额是100 - 30 = 70
  • 到cache设置set用户的余额是70

为了避免一次cache miss,需要额外增加若干次db与cache的交互,得不偿失。

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

案例2:

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

分析:如果修改缓存,需要:

  • 从cache查询get用户的余额是100元
  • 计算出剩余余额是100 - 30 = 70
  • 到cache设置set用户的余额是70

为了避免一次cache miss,需要额外增加若干次cache的交互,以及业务的计算,得不偿失。

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

案例3:

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

分析:如果修改缓存,需要:

  • 到cache设置set用户的余额是70

修改缓存成本很低。

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

总结:

允许cache miss的KV缓存写场景:

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

任何脱离分析的技术方案都是耍流氓。

【本文为51CTO专栏作者“58沈剑”原创稿件,转载请联系原作者】

戳这里,看该作者更多好文

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2011-02-28 09:51:43

内省

2012-08-20 10:34:07

软件开发开发软件

2016-11-01 15:16:52

QQ状态即时通讯

2010-06-28 14:47:45

云计算

2009-05-06 16:10:17

Java传值引用

2019-10-21 13:58:22

爬虫互联网程序员

2021-01-05 09:23:49

网页端消息

2011-02-16 16:13:40

Debian

2019-02-14 10:10:11

系统厂商芯片

2020-05-06 18:32:37

人工智能AI制药

2020-05-07 10:53:04

人工智能技术开发

2022-10-19 12:23:50

缓存CDN外部缓存

2019-04-26 13:55:02

Istio微服务架构

2019-06-04 14:15:08

JavaScript V8前端

2010-08-24 09:19:59

2019-07-22 15:29:53

JavaScriptGitHub语言

2020-12-22 21:24:45

在线状态服务端状态状态同步

2018-07-06 15:04:24

缓存token线程

2018-05-30 15:29:56

2017-08-16 09:13:27

点赞
收藏

51CTO技术栈公众号