在GAE上缓存查询结果

2024-06-01 02:20:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我3个月前开始使用googleappengine,我有一个关于memcaching上Python的问题。 我尽量描述我的问题。

我使用ndb (App Engine Datastore)并且我有一个实体的“表”,如下所示:

class Event(ndb.Model):
    dateInsert = ndb.DateTimeProperty(auto_now_add=True)              # Inserting date
    notes = ndb.StringProperty(indexed=False)                         # event notes
    geohash = ndb.StringProperty(required=True)                       # Coordinates geohash 
    eventLatitude = ndb.FloatProperty(indexed=True, required=True)    # self explanatory
    eventLongitude = ndb.FloatProperty(indexed=True, required=True)   # self explanatory

客户端(例如使用移动应用程序)用户可以在数据存储中以指定的坐标存储事件。 这些插入的事件当然可以通过移动应用程序(在地图上)和网站上看到。 现在要检索存储的事件,客户端调用一个web方法来搜索给定位置附近的事件:

^{pr2}$

然后,我必须用循环获取每个结果,以创建一个JSON来存储在列表中,并将其返回给客户机。 是的

for event in events:
    #do my stuff

一切都很好,但最大的问题是每次调用该方法时都没有用的读取操作。 我的意思是,每次调用方法时,它都会获取与其他客户机请求相同的事件,或者最坏的情况,与同一客户机上一次请求相同的事件(如果我移动50米并发出一个客户端请求,则事件与前一次请求相同,为99%)。 这将占用配额使用率并很快超过配额的读取操作。 我认为我应该使用memcache来存储获取的事件,并在从数据存储进行读取之前在memcache中读取它们,但是我不知道如何用我的结构来实现它。

我的想法是使用geohash作为memcache键,但是我不能遍历缓存的元素,我只能对给定的键进行精确的get,所以我的解决方案不适用(我不能用键直接访问memcache,我需要在memcache元素中迭代以找到符合我的坐标范围请求的事件)。 有人有暗示或建议吗?


Tags: 方法selfeventtrue客户端客户机required事件
1条回答
网友
1楼 · 发布于 2024-06-01 02:20:21

我可以想出两种解决方案:

1)在memcached中存储带有经纬度标识符的较小盒子(例如100米长)的信息。你可以向ndb请求一个5500米长的大盒子,并将所有小盒子的信息保存在memcached中。当用户移动50米、100米或400米时,你可以用memcached数据给她一个答案,如果有人靠近这个地方(500米以内),同样的事情也会发生。

2)可以使用ElasticSearch,特别是Geo Distance Filter。使用它,您可以过滤"documents that include only hits that exists within a specific distance from a geo point"

注意:如果getEvents在一个5000米的盒子里返回事件,也许你不应该在移动50米时触发一个新的请求,而应该触发一个更长的距离。

相关问题 更多 >