在编写redis运维工具的时候,遇到使用python的redis模块获取key的ttl值时返回为空值,但是redis数据库中是有具体的值的。
In [1]: import redis In [2]: r = redis.Redis(host='localhost', port=6379,db=0) In [3]: r.ttl('dba_601')
去redis里面查看,ttl值为-1 127.0.0.1:6379> ttl dba_601 (integer) -1
查询资料[http://redis-py.readthedocs.io/en/latest/],建议使用redis.StrictRedis 类来访问Redis数据库。
In [4]: rs = redis.StrictRedis(host='localhost', port=6379, db=0)
In [5]: rs.ttl('dba_601')
Out[5]: -1L
redis-py提供两个类Redis和StrictRedis来支持Redis访问和操作。那两个类之间有什么差异呢?我们看看官方文档[1]的介绍。
class redis.StrictRedis(host='localhost',
port=6379, db=0,password=None,
socket_timeout=None,
socket_connect_timeout=None,
socket_keepalive=None,
socket_keepalive_options=None,
connection_pool=None,
unix_socket_path=None,
encoding='utf-8',
encoding_errors='strict',
charset=None,
errors=None,
decode_responses=False,
retry_on_timeout=False,
ssl=False, ssl_keyfile=None,
ssl_certfile=None,
ssl_cert_reqs=None,
ssl_ca_certs=None,
max_connections=None)
官方提示:
Implementation of the Redis protocol.This abstract class provides a Python interface to all Redis commands and an implementation of the Redis protocol.
就是说 StrictRedis 使用python基于Redis协议实现了所有官方的Redis操作命令
class redis.Redis(host='localhost',
port=6379, db=0, password=None,
socket_timeout=None,
socket_connect_timeout=None,
socket_keepalive=None,
socket_keepalive_options=None,
connection_pool=None,
unix_socket_path=None,
encoding='utf-8',
encoding_errors='strict',
charset=None,
errors=None,
decode_responses=False,
retry_on_timeout=False,
ssl=False,
ssl_keyfile=None,
ssl_certfile=None,
ssl_cert_reqs=None,
ssl_ca_certs=None,
max_connections=None)
官方文档:
Provides backwards compatibility with older versions of redis-py that changed arguments to some commands to be more Pythonic, sane, or by accident.
也就是说 Redis 类用于向后兼容旧版本的redis-py,对Redis的接口实现做了部分修改。
如果使用者期望使用标准的Redis语法,那么就使用StrictRedis类来访问和操作Redis。
LREM:
StrictRedis 中的实现
lrem(name, count, value)
cli 命令行中的语法是
127.0.0.1:6379> lrem key count value
Redis 中的实现:
lrem(name, value, num=0)
Redis类中将参数num和value的顺序交换了,
ZADD:
Redis 和 StrictRedis 使用zadd的语法为
zadd(name, *args, **kwargs)
但是官方文档提示
NOTE: The order of arguments differs from that of the official ZADD command. For backwards compatability, this method accepts arguments in the form of name1, score1, name2, score2, while the official Redis documents expects score1, name1, score2, name2.
两个类对于score和name的顺序是相反的 。
举个 ?
In [3]: rs = redis.StrictRedis(host='127.0.0.1', port=6379, db=0) In [4]: r = redis.Redis(host='127.0.0.1', port=6379, db=0) In [5]: r.zadd("zset_name", "a1", 6, "a2", 2,"a3",5) Out[5]: 3 In [15]: rs.zadd("zset_rs", "a1", 6, "a2", 2,"a3",5) 省略一部分错误代码 ResponseError: value is not a valid float In [15]: rs.zadd("zset_rs", 6, "a1", 2,"a2",5,"a3") Out[15]: 3 In [16]: rs.zrange('zset_name',0,-1) Out[16]: ['a2', 'a3', 'a1']
SETEX: 参数 time 和 value 的顺序相反
redis.Redis 中的实现:
setex(name, value, time)[source]
redis.StrictRedis 中的实现:
setex(name, time, value)
总而言之,推荐使用redis.StrictRedis 和Redis命令行语法兼容,不会出现"意外"。
[1] http://redis-py.readthedocs.io/en/latest/