我正在研究与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')
如上所示,测试路径将打印无,表示未设置该值。我很迷惑。当我在我的本地浏览器上测试服务器时,它可以工作,当我尝试使用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进行正确的互动?
答案 0 :(得分: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
答案 1 :(得分:0)
我做了更多的实验。似乎存在与延迟有关的问题。以下修改将使其工作:
{{1}}
我在redis上阅读了文档,redis似乎是单线程的。所以我不确定为什么它会在set函数完成之前执行get函数调用。有经验的人请发表解释。