0x0 依赖默认的序列化/反序列化器
默认的序列化/反序列化器会消耗大量CPU,尤其是对于比较复杂的数据类型。针对你的开发语言和编程环境使用更合适的序列化/反序列化机制是有必要的。
0x1 将大对象存在单个缓存项中
由于对大对象进行序列化和反序列化的CPU代价非常高昂,在高负载情况下,大量的访问大对象缓存可以很快耗尽服务器CPU。相反,我们应该将大对象分解成更小的对象,并且单独缓存。(译者补充:比如Redis Hash就是处理这种问题的一个很好解决方案)
0x2 使用缓存来实现在多线程间共享对象
当程序中的某部分同时写相同的缓存项时,会引发竞态条件。这时需要外部锁机制来保障。
0x3 假设缓存项只要执行了存入操作就一定会在缓存中
永远不要假设某个缓存项一定会出现在缓存中,即使它才刚刚被写入缓存。因为缓存服务器在内存紧张时会将一些缓存项驱逐出去。代码始终应该对缓存中取得的值做null检查。
0x4 将整个集合连带包含的对象一起存入缓存
这样做将导致性能低下,因为它会带来比较大的序列化/反序列化开销。将单独的项各自缓存,这样它们可以被单独获取。
0x5 将父对象-子对象存在一起
有时候一个对象可能同时被多个父对象包含。为了不在不同的地方缓存多份相同的数据,将子对象单独缓存。父对象在需要的时候再去取出子对象。
0x6 将持有对stream、file、registry或者网络的句柄的活跃对象缓存
一旦缓存对象从缓存中清除,那么它对应的资源将不会被回收,从而导致系统资源泄露
0x7 使用不同的key缓存相同的数据项
通过key和索引序号访问某数据项非常方便。这对于本地内存(in-memory)可以奏效,因为如果引用相同的对象,那么意味着一旦改变对象,多个访问路径都能观察到对象的变化。但是当使用远程缓存时,就不是这样了,对象状态可能因此而不同步(多份)。