淘汰缓存还是修改缓存

问: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”,因此应该淘汰缓存
如果还在纠结,总是淘汰缓存,问题也不大

作者:老王子H
链接:https://www.jianshu.com/p/497fabb845eb
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值