9个错误的缓存设计实践

0x0 依赖默认的序列化/反序列化器

默认的序列化/反序列化器会消耗大量CPU,尤其是对于比较复杂的数据类型。针对你的开发语言和编程环境使用更合适的序列化/反序列化机制是有必要的。

0x1 将大对象存在单个缓存项中

由于对大对象进行序列化和反序列化的CPU代价非常高昂,在高负载情况下,大量的访问大对象缓存可以很快耗尽服务器CPU。相反,我们应该将大对象分解成更小的对象,并且单独缓存。(译者补充:比如Redis Hash就是处理这种问题的一个很好解决方案)

0x2 使用缓存来实现在多线程间共享对象

当程序中的某部分同时写相同的缓存项时,会引发竞态条件。这时需要外部锁机制来保障。

0x3 假设缓存项只要执行了存入操作就一定会在缓存中

永远不要假设某个缓存项一定会出现在缓存中,即使它才刚刚被写入缓存。因为缓存服务器在内存紧张时会将一些缓存项驱逐出去。代码始终应该对缓存中取得的值做null检查。

0x4 将整个集合连带包含的对象一起存入缓存

这样做将导致性能低下,因为它会带来比较大的序列化/反序列化开销。将单独的项各自缓存,这样它们可以被单独获取。

0x5 将父对象-子对象存在一起

有时候一个对象可能同时被多个父对象包含。为了不在不同的地方缓存多份相同的数据,将子对象单独缓存。父对象在需要的时候再去取出子对象。

0x6 将持有对stream、file、registry或者网络的句柄的活跃对象缓存

一旦缓存对象从缓存中清除,那么它对应的资源将不会被回收,从而导致系统资源泄露

0x7 使用不同的key缓存相同的数据项

通过key和索引序号访问某数据项非常方便。这对于本地内存(in-memory)可以奏效,因为如果引用相同的对象,那么意味着一旦改变对象,多个访问路径都能观察到对象的变化。但是当使用远程缓存时,就不是这样了,对象状态可能因此而不同步(多份)。

0x8 当在持久存储中更新或删除数据项后,不更新或者删除缓存中的对应数据项

翻译自:10 Program Busting Caching Mistakes

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值