1

我使用简单层通过键或 id 加载和存储实体,我只是在该层中添加了缓存。当具有给定键的实体在缓存中时,返回它而不是从数据存储中获取。当实体更新并保存到数据存储时,该层只需将缓存中的实体设置为空。它是完全透明的。

它似乎工作正常,但是从缓存中获取的对象与从数据存储中获取的对象略有不同。有些事情停止工作,例如,我不能在实体内部的集合上使用 .contains() 来检查两个实体之间是否存在关系。我还遇到了一个奇怪的行为,当我从缓存加载一个对象并立即存储到数据存储区时,代表关系的集合中的所有项目都被替换为nulls。但是我无法重现它。现在它工作正常。

我不知道幕后发生了什么,所以问题是,这种使用缓存的方式可靠吗?我可以像从数据存储中获取实体一样处理从缓存中获取的实体(访问子项、更新、删除......)吗?

4

1 回答 1

3

有两点需要注意:

  1. 存储到 Memcache 的所有对象都被序列化/反序列化,这意味着它们的内存表示被采用并更改为一系列字节(反之亦然)。

  2. Collection.contains(object)用于object.equals(anotherObject)检查集合是否包含某个对象。默认情况下Object.equals(),仅true当这是完全相同的对象(= 相同内存位置的对象)时。

鉴于此:序列化对象然后反序列化它永远不会产生一个给出deserialisedObject.equals(originalObject) == true.

如果你真的需要这个,那么你应该在你存储在 Memcache 中的类中覆盖.equals()(以及.hashCode()),这样你才能真正比较类中有意义的值(= 比较所有字段的值)。

于 2012-08-17T14:56:18.057 回答