从memcache读取数据有时失败

2 投票
1 回答
641 浏览
提问于 2025-04-16 05:18

我写了一个基于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 []

1 个回答

0

我想我明白了:这是python-memcache模块中的一个错误

撰写回答