【问题标题】:how to make a persistent connection to redis or memcache within a twisted server如何在扭曲的服务器中建立与 redis 或 memcache 的持久连接
【发布时间】:2014-04-29 04:54:22
【问题描述】:

我正在尝试学习和了解twisted 的工作原理,为此我创建了一个基本的回显服务器,该服务器将 input 视为存储数据的 keyredis 服务器上,如果 input 匹配 DB 上的 key,它将打印出该值,否则打印 'key not found' em>。

我避免使用@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并输入一个单词时,会与redis服务器建立连接,使用这种方法,如果我有100个并发客户端,代码将创建100个到redis或memcache服务器的连接。

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

如果可能,您知道如何正确实施它以及如何处理重新连接吗?

【问题讨论】:

    标签: python redis memcached twisted


    【解决方案1】:

    看看txredisapi 库。它是一个非常完整的 redis 独立连接和连接池(持久和非持久)的扭曲实现。

    几个月来我一直在使用一个扭曲的项目,我对此非常满意。


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

    当我查看您的代码时,我看到了一些奇怪的东西,就像您在从您的 telnet 接收数据时生成与 redis 的连接,这不仅会为每个 telnet 创建一个连接,还会为每个 telnet 创建一个连接该 telnet 连接上的数据刷新(这几乎肯定不是您想要的)。

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

    粗略地说,你的逻辑应该分成两部分,一部分应该让 redis 连接生效,另一部分(基本上就是你现在所拥有的)应该处理 telnet 连接并推送命令通过 redis 连接。 txredisapi 库将为您完成所有 redis 工作(... txRedis 也可以,我不太了解该库,txredisapi 示例应该对您有所帮助)。

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

    【讨论】:

    • 谢谢,我只是切换到 txredisapi 并使用了lazyConnection()
    猜你喜欢
    • 2014-06-09
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 2019-03-04
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    相关资源
    最近更新 更多