当前位置: 首页 > 科技观察

缓存,是淘汰了还是修改了?

时间:2023-03-19 14:54:50 科技观察

允许cachemiss场景,不管是memcache还是redis,当缓存的内容发生变化时,是修改cache还是淘汰cache?这就是今天要讨论的话题。Q:KV缓存中缓存了哪些数据?答:简单类型的数据,如:int序列化对象,如:用户实体,本质上是二进制文本数据,如:json或html...Q:取消缓存修改缓存中的数据有什么区别并修改缓存中的数据?答:淘汰一个key,操作简单,直接使key失效,但是下次访问这个key时,cachemiss会修改一个key的内容。逻辑比较复杂,但是下次访问key还是会命中cache。区别只是缓存未命中。Q:缓存中的值数据一般是怎么修改的?A:对于plain类型的数据,可以直接设置修改后的值来序列化对象:一般需要先获取数据,反序列化为对象,修改其成员。然后序列化为二进制,然后设置数据json或者html数据:一般需要先获取文本,解析成厄运树对象,修改相关元素,序列化为文本,然后设置数据结论:对于对象类型,或者文本类型,修改值的缓存成本比较高,所以我们一般选择直接淘汰缓存。Q:对于naive类型的数据,我应该修改缓存还是清除缓存?答:还是要看情况。案例一:假设缓存中存储的某用户uid=123的余额为money=100元,业务场景为购买了某商品pid=456。分析:如果修改缓存,可能需要:在db中查询pid价格为50元,在db查询中活动优惠20折(商品实际价格为40元)的db查询中用户coupon是10元(用户实际要付30元)从cache查询中get用户余额为100元,剩余余额计算为100-30=70.to缓存设置,设置用户的余额为70。为了避免缓存未命中,需要在db和缓存之间添加几个额外的交互,这是得不偿失的。结论:此时缓存应该退役,而不是修改。案例二:假设缓存中存储的某用户uid=123的余额为money=100元,业务场景为需要扣取30元。分析:如果修改缓存,需要:从缓存中查询获取用户余额100元,计算出余额为100-30=70。设置缓存设置用户余额为70。为了避免一个cachemiss,就要额外增加几个cache交互,还有业务计算,得不偿失。结论:此时缓存应该退役,而不是修改。案例三:假设缓存中存储的某用户uid=123的余额为money=100元,业务场景为余额将变为70元。分析:如果修改缓存,需要:设置缓存设置用户余额为70,修改缓存的成本很低。结论:此时,可以选择修改缓存。当然,如果选择淘汰缓存,只会增加一次额外的缓存未命中,成本并不高。总结:KV缓存写入允许缓存不命中的场景:大多数情况下,修改值的代价会比“添加缓存不命中”更高,所以应该淘汰缓存。如果你还在挣扎,总是消除缓存,问题不是太大。技术方案就是耍流氓。【本文为专栏作者《58神剑》原创稿件,转载请联系原作者】点此阅读更多该作者好文