gpt4 book ai didi

python - 在 GAE 上缓存查询结果

转载 作者:太空宇宙 更新时间:2023-11-03 17:30:50 25 4
gpt4 key购买 nike

我 3 个月前开始使用 Google App Engine,我在 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

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

class getEvents(webapp.RequestHandler):
def get(self):
#blablabla get passed parameters
#[...]

# hMinPos and hMaxPos are hashed coordinates passed by client + X meters.
# In this way I can filter stored events in a precise bounding box.
# For example, I can get events near my location in a box of 5000 meters
qryEvent = Event.query(ndb.AND(Event.geohash >= hMinPos, Event.geohash <= hMaxPos))
events = qryEvent.fetch(1000)

然后我必须通过循环获取每个结果,以创建一个 JSON 来存储在列表中并将其返回给客户端。原来如此

for event in events:
#do my stuff

一切工作正常,但最大的问题是每次我调用该方法时都会进行无用的读取操作。我的意思是,每次调用方法时,它都会获取与其他客户端请求相同的事件,或者最糟糕的是,与同一客户端的先前请求相同的事件(如果我移动 50 米并发出客户端请求,事件与先前的请求相同,99%) )。这将很快导致配额使用和读取操作超过配额。我认为我应该使用memcache来存储获取的事件并在从数据存储区读取之前在memcache中读取它们,但我不知道用我的结构来实现它。

我的想法是使用geohash作为memcache键,但是我无法迭代缓存的元素,我只能精确获取给定的键,所以我的解决方案不适用(我无法直接访问对于带有键的 memcache,我需要迭代 memcache 元素以查找适合我的坐标范围请求的事件)。有人有提示或建议吗?

最佳答案

我能想到两种解决方案:

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

2) 您可以使用 ElasticSearch,特别是 Geo Distance Filter 。使用它,您可以过滤“仅包含距地理点特定距离内存在的命中的文档”

注意:如果getEvents返回5000米范围内的事件,也许你不应该在移动50米时触发新的请求,而是在移动更远的距离时触发。

关于python - 在 GAE 上缓存查询结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31876969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com