GAE Memcache中允许的对象

时间:2018-06-07 05:46:42

标签: java google-app-engine

我试图了解哪些对象可以存储在Java Memcache中但无法找到直接答案。

我曾尝试过在Memcache中存储一个ConcurentHashMap,其中ConcurentHashMap的每个值都是另一个ConcurentHashMap,最多可达5个级别。

这是之前的设计,我希望尽可能减少更改。

然而,我发现了一个奇怪的问题:

  

java.lang.IllegalArgumentException:不能用作值:   ' com.xx.xxxx@1a55d9d'在   com.google.appengine.api.memcache.AsyncMemcacheServiceImpl.serializeValue(AsyncMemcacheServiceImpl.java:283)     在   com.google.appengine.api.memcache.AsyncMemcacheServiceImpl.doPut(AsyncMemcacheServiceImpl.java:516)     在   com.google.appengine.api.memcache.AsyncMemcacheServiceImpl.put(AsyncMemcacheServiceImpl.java:591)     在   com.google.appengine.api.memcache.MemcacheServiceImpl.put(MemcacheServiceImpl.java:79)

我在一个类中嵌入了一个ConcurrentHashMap并将其传递给Memcache。使用普通的ConcurrentHashMap我也遇到了同样的问题。

我查看了不同的论坛,但找不到可以在Memcache中存储哪些对象的答案,特别是来自java集合和这些对象(ConcurrentHashMap)。我可以在Memcache中保存哪些类型的复杂java对象?

我的另一个问题是,当我在GAE上再次部署新版本时会发生什么?先前存储在Memcache中的值是否已销毁?

1 个答案:

答案 0 :(得分:0)

Memcache通常会允许任何可序列化的对象。类需要实现Serializable以使Java处理序列化。在存储集合或其他数据结构的情况下,数据结构中的对象也需要是可序列化的。

public class MyClass implements Serializable { }

您应用的所有版本都共享相同的内存缓存。缓存是全局的,并在应用程序的前端,后端及其所有服务和版本之间共享。见Appengine Memcache