我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元素中迭代以找到符合我的坐标范围请求的事件)。 有人有暗示或建议吗?
我可以想出两种解决方案:
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米时触发一个新的请求,而应该触发一个更长的距离。
相关问题 更多 >
编程相关推荐