首页 文章

如何在扭曲的服务器中 Build 与redis或memcache的持久连接

提问于
浏览
2

我正在努力学习和理解twisted如何工作,为此我创建了一个基本的echo服务器,将输入视为存储在redis服务器上的数据的密钥,如果输入与DB上的密钥匹配,它将打印出来值,否则打印'key not found' .

我正在避免 @defer.inlineCallbacks 只是为了练习更多如何使用Deferreds,代码是:

from twisted.internet import reactor, protocol
from txredis.client import RedisClient

REDIS_HOST = 'localhost'
REDIS_PORT = 6379


class Echo(protocol.Protocol):

    def connectionMade(self):
        self.factory.count += 1
        self.transport.write('There are %d clients\n' % self.factory.count)

    def dataReceived(self, data):
        clientCreator = protocol.ClientCreator(reactor, RedisClient)
        d = clientCreator.connectTCP(REDIS_HOST, REDIS_PORT)

        def cb_redis_get(r, data):
            d = r.get(data.strip())

            def cb_result(x):
                if x:
                    self.transport.write('%s\n' % x)
                else:
                    self.transport.write('key not found\n')

            d.addBoth(cb_result)
        d.addCallback(cb_redis_get, data)


class EchoFactory(protocol.ServerFactory):
    count = 0
    protocol = Echo


def main():
    reactor.listenTCP(1234, EchoFactory())
    reactor.run()

if __name__ == "__main__":
    main()

当客户端连接 telnet 0 1234 并输入一个单词时,会 Build 与redis服务器的连接,使用这种方法,如果我有100个并发客户端,代码将创建100个连接到redis或memcache服务器 .

这可能是预期的行为,但我想知道,如果可以利用 twisted reactor 并且在启动服务器时,创建一个持久连接并将其用于所有新连接,这样我就可以拥有一个每个实例的连接并重新使用它

如果可能,任何关于如何正确实施它以及如何处理重新连接的想法?

1 回答

  • 2

    看一下txredisapi库 . 它是redis的单独连接和连接池(持久性和非持久性)的完全扭曲实现 .

    我已经使用了几个月的扭曲项目,我对此非常满意 .


    等等,好吧,也许我错过了你想问的问题 .

    当我查看你的代码时,我看到了一些奇怪的东西,比如你在你的telnet上收到数据的redis连接,这不会只是为每个telnet创建一个连接,这将为每个数据刷新创建一个连接在那个telnet连接上(这几乎肯定不是你想要它做的) .

    看一下examples with txredisapi它们比我用txredis看到的例子更详细

    粗略地说,需要发生的是你的逻辑应该分成两部分,一部分应该实时获得redis连接,而另一部分(基本上就是你现在拥有的部分)应该处理telnet连接并通过redis推送命令连接(一个或多个) . txredisapi lib将为你完成所有redis工作(...和txRedis也可能,我不知道lib足够了解,txredisapi示例应该对你有帮助) .

    (这种问题在最近几天出现了很多,你可能会发现以前的答案有助于理解扭曲部件之间的常见分离,请参阅:Persistent connection in twisted

相关问题