首页 > 解决方案 > GAE Memcache 中允许哪些对象

问题描述

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

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

这是之前的设计,我想尽可能少地进行必要的更改。

但是,我发现了一个奇怪的问题:

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

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

我查看了不同的论坛,但无法找到有关哪些对象可以存储在 Memcache 中的答案,尤其是来自 Java 集合和此类对象(ConcurrentHashMap)。我可以在 Memcache 中保存哪些类型的复杂 java 对象?

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

标签: javagoogle-app-engine

解决方案


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

public class MyClass implements Serializable { }

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


推荐阅读