距Omar AI Zabir发表十个中断你应用程序的缓冲错误(Ten Caching Mistakes that Break your App)已经好几年了,它依然是一个关于缓存使用的建议的极好资源,尤其是使用本地内存中的缓存和使用分布式缓存的区别。
这里是10个错误。(总结):
- 依靠一个默认的串行器。默认的串行器会消耗大量CPU,特别是复杂类型。为你的语言和环境花点思维考虑最好的序列化和反序列化模式。
- 把大型对象存储到一个单一的缓存项。因为序列化和反序列化开销,在并发负载下,频繁的访问大型对象图标会杀掉你的服务器CPU。取而代之的是把达标拆成小的子表,然后分别缓存。只检索你需要的最小单元。
- 在线程之间使用缓存共享对象。竞争条件,当写被包含,开发中如果遇到程序某部分需要同时存取相同缓存项。那么某种形式的外部锁机制是必要的。
- 假设数据项保存之后会被立即缓存。永远不要假设一个数据项会在缓存中,即使这只是写操作,因为一个缓存会刷新数据项,当内存紧张时。代码应该总是检查读取缓存的返回值是否为空。
- 存储整个嵌套对象集合。因为序列化的开销。如果存储了整个集合,那么当你需要获取一个详细的数据项时会导致一个贫乏的性能。
- 存储主从关系对象一起也分开。有些时候一个对象会同时包含到两个或更多父对象。不要把相同的对象用各自的key存储到缓存中两个不同的地方。父对象当需要访问时会读取这个对象。
- 缓存配置设置。存储配置数据在本地进程的静态变量中。访问缓存数据是昂贵的,因此,在可能的时候,你会想要避免这个开销。
- 缓存打开处理流的活动对象,文件,注册中心,或者网络。不要缓存有引用资源的对象,比如文件,数据流,内存等等。当缓存项被从缓存中删除时,这些资源依然没有被删除,然后系统资源就会泄露。
- 用多个key存储相同的数据项。它能让你通过key和一个索引编码方便的访问一个数据项。当缓存在内存中时,这能工作,因为缓存能包含一个引用指向相同的项目,因为对象的改变会通过访问路径发现。当使用一个远程缓存,任何更新不再显而易见,因此这个项目会不再同步。
- 在从永久性存储设备中更新或删除数据之后没有更新或删除缓存中的数据项。在远程缓存中的数据项是用拷贝的方式存储的,因此更新一个对象不会更新缓存。缓存必须专门为了被其他人看到改变而更新。内存中的缓存对象变更会被任何一个看到。和删除相同,删除一个对象不会把它从缓存中删除。缓存项的正确删除需要由程序来保证。
转载请注明:旅途@KryptosX » 【翻译】10个破坏程序的缓存错误