9个错误的缓存设计实践
2017-11-01 15:13
459 查看
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相关文章推荐
- .NET 缓存模块设计实践
- .NET 缓存模块设计实践
- 前端通信:SSE设计方案(二)--- 服务器推送技术的实践以及一些应用场景的demo(包括在线及时聊天系统以及线上缓存更新,代码热修复案例)
- SOA 中的服务接口设计最佳实践,第 2 部分:使用服务向服务使用者应用程序报告错误
- 基于Redis缓存系统的设计与实践
- 9个Web设计中常见的错误思想
- Web设计中9个常见的可用性错误[译]
- Web设计中9个常见的可用性错误(译)
- 同程凤凰缓存系统基于Redis的设计与实践
- 微博缓存服务化的设计与实践
- RESTful实践:如何设计API的错误消息
- App后台开发运维和架构实践学习总结(9)——三种常见的API设计错误及解决方案
- EDM营销之9个移动电子邮件设计的最佳实践
- 响应式设计(Response Web Design)实践
- SVN 错误:Error validating server certificate for 'https://xxxxxxx':443... Mac os svn客户端证书验证缓存 解决
- ASP.NET缓存解决方案和最佳实践
- 分享20个数据库设计的最佳实践
- 软件设计之缓存使用
- 【学习笔记javascript设计模式与开发实践----1】
- 5个须警惕的数据库设计错误