我已经在OS X上安装了redis
,并尝试从Python 3.5客户端设置和获取Redis中的一些值。我的Redis服务器已打开(通过命令redis-server
),redis客户端也已打开(通过命令redis-cli
打开)。这是我在Python上尝试的方法:
import redis
r = redis.StrictRedis()
r.set("foo", "bar")
r.get("foo")
这将按预期打印bar
。但是,如果我转到redis-client提示符并尝试get foo
,它将返回nil
。以同样的方式,如果我在redis客户端本身中设置了一个值,例如set boo too
,则在客户端中调用get boo
会按预期返回too
,但是,如果我在Python客户端中运行r.get(boo)
,我得到None
。
有趣的是,它们在自己的实例之间同步。因此,如果我打开另一个Python命令提示符并键入r.get("foo")
,它将返回bar
。同样,如果我打开另一个redis-cli
实例并键入get boo
,则会得到too
。只是Python客户端和Redis客户端之间的值不同步。我什至尝试在Python客户端中设置值后强制执行bgsave
,它确实触发了运行redis-server
的窗口中的保存,但这些值未反映在{{1}中}窗口。
直到几天前,他们的工作状况都非常好,这已经在最近的某个时候开始发生了。
有什么解决方法吗?
答案 0 :(得分:0)
在我看来,您正在db
和redis-cli
实例中通过不同的redis-py
访问(设置/获取值)。 redis
服务器可以具有彼此完全隔离的多个键值存储(或“表”)。这些在整个文档中均称为db
,并由整数唯一标识。
如果您要完全按照代码段的方式实例化redis-py
,请使用:
import redis
r = redis.StrictRedis()
然后,您正在使用db的构造函数默认值,即 0 。 (See documentation)
如果Python实现和redis-cli
之间的值不同,则很可能您的命令行客户端运行的db
不同于0。您可以检查工作的db
并使用命令CLIENT LIST,它将返回您当前的数据库ID。
要切换到与Python实现相同的数据库,只需在您的redis-cli
上运行:
SELECT 0
或者,您也可以使用所需的redis-py
参数调用db
构造函数:
r = redis.StrictRedis(db=3) # 3 is an example value for your redis-cli's working db