首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >建议使用所需的txredisapi库

建议使用所需的txredisapi库
EN

Stack Overflow用户
提问于 2013-10-12 17:39:46
回答 1查看 814关注 0票数 2

下面我提供了一个代码示例,它简单地用Redis提供的数据响应HTTP请求:

请求:http://example.com:8888/?auth=zefDWDd5mS7mcbfoDbDDf4eVAKb1nlDmzLwcmhDOeUc响应:get: u'"True"'

此代码的目的是作为REST服务器(这就是我使用lazyConnectionPool的原因)响应请求,并使用来自Redis的数据(读/写)。

我需要做的是:

  1. 在render_GET的IndexHandler中运行多个请求到Redis (如GET、HMGET、SET等)
  2. 在render_GET内部的IndexHandler中运行多个请求

我尝试过多种方法(包括来自txredisapi库的例子),但由于缺乏经验,无法做到这一点。请你就问题1)和问题2提出意见。

提前谢谢。

代码语言:javascript
复制
import txredisapi as redis

from twisted.application import internet
from twisted.application import service
from twisted.web import server
from twisted.web.resource import Resource


class Root(Resource):
    isLeaf = False


class BaseHandler(object):
    isLeaf = True

    def __init__(self, db):
        self.db = db
        Resource.__init__(self)


class IndexHandler(BaseHandler, Resource):
    def _success(self, value, request, message):
        request.write(message % repr(value))
        request.finish()

    def _failure(self, error, request, message):
        request.write(message % str(error))
        request.finish()

    def render_GET(self, request):
        try:
            auth = request.args["auth"][0]
        except:
            request.setResponseCode(404, "not found")
            return ""

        d = self.db.hget(auth, 'user_add')
        d.addCallback(self._success, request, "get: %s\n")
        d.addErrback(self._failure, request, "get failed: %s\n")
        return server.NOT_DONE_YET


# Redis connection parameters
REDIS_HOST = '10.10.0.110'
REDIS_PORT = 6379
REDIS_DB = 1
REDIS_POOL_SIZE = 1
REDIS_RECONNECT = True

# redis connection
_db = redis.lazyConnectionPool(REDIS_HOST, REDIS_PORT, REDIS_DB, REDIS_POOL_SIZE)

# http resources
root = Root()
root.putChild("", IndexHandler(_db))

application = service.Application("web")
srv = internet.TCPServer(8888, server.Site(root), interface="127.0.0.1")
srv.setServiceParent(application)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-12 19:30:49

关于第一个问题:

有几种方法可以概括为在单个HTTP请求中发出多个数据库请求。

例如,您可以发出多个请求:

代码语言:javascript
复制
d1 = self.db.hget(auth, 'user_add')
d2 = self.db.get('foo')

然后,当所有这些同时请求完成时,您可以得到一个回调来触发(参见twisted.internet.defer.DeferredList)。

或者,如果需要顺序请求,也可以使用。例如:

代码语言:javascript
复制
@inlineCallbacks
def do_redis(self):
    foo = yield self.db.get('somekey')
    bar = yield self.db.hget(foo, 'bar') # Get 'bar' field of hash foo

但是,您需要阅读更多关于将inlineCallbackstwisted.web相结合的内容(关于这个主题,您应该查找所以问题 )。

关于问题2:

如果不使用inlineCallbacks,事务真的很难看。在txredisapi主页上有一个例子显示它使用inlineCallbacks

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19337224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档