【问题标题】:redis get function return Noneredis 获取函数返回无
【发布时间】:2017-04-05 09:38:53
【问题描述】:

我正在开发一个与 redis 交互的烧瓶应用程序。此应用程序部署在 heroku 上,并添加了 redis。

当我对交互进行一些测试时,我无法获得刚刚设置的键值对。相反,我总是将 None 作为返回类型。示例如下:

   import Flask
   import redis


   app = Flask(__name__)
   redis_url = os.getenv('REDISTOGO_URL', 'redis://localhost:6379')
   redis = redis.from_url(redis_url)

   @app.route('/test')
   def test():
      redis.set("test", "{test1: test}")
      print redis.get("test")   # print None here
      return "what the freak"


  if __name__ == "__main__":
       app.run(host='0.0.0.0')

如上图,test route会打印None,表示没有设置值。我很迷惑。当我在本地浏览器上测试服务器时,它可以工作,当我尝试使用 heroku python shell 与 redis 交互时,它也可以工作。

用 python shell 测试:

heroku run python
from server import redis
redis.set('test', 'i am here')  # return True
redis.get('test') # return i am here

我现在很困惑。我应该如何使用 Flask 与 redis 正确交互?

【问题讨论】:

    标签: python heroku flask redis redis-py


    【解决方案1】:

    Redis-py 默认构造一个ConnectionPool 客户端,这可能是from_url 辅助函数正在做的事情。虽然 Redis 本身是单线程的,但来自连接池的命令没有保证的执行顺序。对于单个客户端,直接构造一个redis.StrictRedis客户端,或者通过参数connection_pool=none。这对于数量较少的简单命令更可取,因为连接管理开销较少。您也可以在连接池的上下文中使用管道来序列化批处理操作。

    https://redis-py.readthedocs.io/en/latest/#redis.ConnectionPool

    https://redis-py.readthedocs.io/en/latest/#redis.Redis.pipeline

    【讨论】:

      【解决方案2】:

      我对此做了更多的实验。似乎存在与延迟有关的问题。以下修改将使其工作:

        @app.route('/test')
        def test():
            redis.set("test", "{test1: test}")
            time.sleep(5) # add the delay needed to the let the set finish
            print redis.get("test")   # print "{test1: test}" here
            return "now it works"
      

      我看了redis的文档,redis好像是单线程的。所以我不确定为什么它会在 set 函数完成之前执行 get 函数调用。请有更多经验的人发表解释。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-18
        • 2017-01-02
        • 2021-11-17
        • 2014-01-08
        • 1970-01-01
        • 1970-01-01
        • 2022-11-23
        相关资源
        最近更新 更多