假设我的应用已注册了百万用户。现在有一个新用户,我想告诉他他的所有人都安装了这个应用程序。用户可以拥有多个联系人,让我们说500.现在,如果我从数据存储区获取每个联系人的实体,那么它非常耗费时间和金钱。 memcache是一个不错的选择,但是我必须让它保持同步。我可以为这么大的数据获得专用的memcache,但是如何同步呢?我的逻辑是,如果它没有在memcache中,则假设该联系人未在此应用程序中注册。可以使用具有手动缩放的后端模块来保持同步。但我不知道这个设计有多好。任何帮助将不胜感激。
答案 0 :(得分:3)
这不是memcache的设计方式。你永远不应该依赖memcache。密钥可以随时丢弃。因此,在您的情况下,您永远无法确定是否存在联系人。
我不知道您的数据存储问题是什么?数据存储区旨在快速读取数据 - 利用它。
当新用户安装您的应用时,请创建一个以电话号码为键的查找实体。您不一定需要任何其他属性。像这样:
Entity contactLookup = new Entity("ContactLookup", "somePhoneNumber");
datastore.put(contactLookup);
这将记录谁安装了应用程序。
然后,要检查您的哪些用户联系人已在使用您的应用,您可以使用用户地址簿中的电话号码创建一系列密钥(当然是他们的许可!),然后执行批量获取。像这样:
Set<Key> keys = new HashSet<Key>();
for (String phoneNumber : phoneNumbers)
keys.add(KeyFactory.createKey("ContactLookup", phoneNumber));
Map<Key, Entity> entities = datastore.get(keys);
现在,entities
将是那些安装了您应用的联系人。
您可能需要批量密钥以减少负载。 python api为你做了这个,但不确定java apis。但即使您的用户有500个联系人,它也只有5个查询(假设批次为100个)。
附注:您可能需要考虑哈希电话号码进行存储。
答案 1 :(得分:1)
Memcache是降低成本和提高性能的不错选择,但您不应该认为它始终可用。即使专用的Memcache也可能失败,或者个别记录可能被驱逐。此外,所有这些同步逻辑都非常复杂且容易出错。
您可以使用Memcache来指示联系人是否已在应用中注册,在这种情况下,您无需检查该联系人的数据存储。但我建议检查数据存储区中Memcache中找不到的所有联系人。
验证数据存储中是否存在记录是快速且廉价的。您可以使用.get(java.lang.Iterable<Key> keys)
方法通过单个数据存储区调用来检索整个列表。
您可以通过创建没有注册用户属性的实体来进一步提高性能。这样,检索这些实体就没有开销。
答案 2 :(得分:0)
由于您不使用python因此无法访问NDB,因此建议您在添加用户时将其添加到memcache并创建异步查询(或任务队列) job)将相同的数据推送到您的数据存储区。就像首先推送memcache一样,然后最终数据存储区跟随。他们总是保持同步。
然后你需要做的就是在你做的时候首先查询你的内存缓存&#34;获取&#34; (因为memcache总是同步,因为你首先推送它),如果memcache返回空(易失性和诸如此类),那么查询实际的数据存储区以重新填充&#34;内存缓存