我使用简单的层来按键或id加载和存储实体,我只是在此层添加了缓存。当具有给定密钥的实体位于缓存中时,返回它而不是从数据存储区中获取。当实体更新并保存到数据存储区时,该层只是将缓存中的实体设置为null。它是完全透明的。
它似乎工作正常,但从缓存中获取的对象与从数据存储区获取的对象略有不同。例如,有些东西停止工作,我不能在实体内的集合上使用.contains()来检查两个实体之间是否存在关系。我还遇到了一个奇怪的行为,当我从缓存中加载一个对象并且在存储到数据存储区之后立即,表示关系的集合中的所有项都被null
替换。但是我无法重现它。现在它工作正常。
我不知道幕后发生了什么,所以问题是,这种使用缓存可靠的方式吗?我可以使用从缓存中获取的实体,就像从数据存储区中获取它们一样(访问子项,更新,删除......)?
答案 0 :(得分:3)
有两点需要注意:
存储到Memcache的所有对象都获取serialized/deserialized,这意味着他们的内存表示被采用并变为一系列字节(反之亦然)。
Collection.contains(object)
使用object.equals(anotherObject)
检查集合是否包含特定对象。默认情况下,Object.equals()
只有true
,如果这是exact same object(=同一内存位置的对象)。
鉴于:序列化对象然后反序列化它永远不会产生一个给出deserialisedObject.equals(originalObject) == true
的对象。
如果你确实需要这个,那么你应该在存储在Memcache中的类中覆盖.equals()
(以及.hashCode()
),这样你才能真正比较Class中有意义的值(=比较值所有领域)。