从memcache读取数据有时失败
我写了一个基于gevent的程序,允许它的网页客户端快速交换消息,类似于一个信息中心。
目前我只支持轮询机制,所以我让程序在服务器端为每个特定的客户端存储需要发送的消息,放在它的“收件箱”里。客户端的列表存储在MySQL数据库中,而这些收件箱则存储在memcache中,以便更快地访问。当客户端连接到这个信息中心时,它会拉取所有在它的收件箱中积累的消息。
问题
问题是,有时候收件人在拉取他们的收件箱内容时并没有收到消息——他们得到的是一个空数组。
更让我困惑的是,如果我重启这个信息中心,那些未被客户端接收的消息会突然出现,并被送到它们的目的地。
你能告诉我我的代码中是否有明显的缺陷吗?对此你有什么解释吗?
push
是用来把消息放入客户端收件箱的方法。pull
是用来获取所有积累的消息列表并返回给主处理函数的方法。
def __push(self, domain, message, tid=None):
if tid:
try:
messages = self.mc.get("%s_inbox" % tid.encode('utf8'))
except:
logging.error("__push memcached failure", exc_info=1)
if messages:
messages = fromjson(messages)
messages.append(message)
self.mc.set("%s_inbox" % tid.encode('utf8'), tojson(messages))
print "Pushed to", "%s_inbox" % tid.encode('utf8')
def __pull(self, tid):
try:
messages = self.mc.get("%s_inbox" % tid.encode('utf8'))
if messages:
self.mc.set("%s_inbox" % tid.encode('utf8'), "[]")
return fromjson(messages)
else:
return []
except:
logging.error("__pull failure", exc_info=1)
return []