前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis 和 StrictRedis的差异

Redis 和 StrictRedis的差异

作者头像
用户1278550
发布2018-08-09 14:19:59
5.1K0
发布2018-08-09 14:19:59
举报
文章被收录于专栏:idbaidba

一 问题

在编写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数据库。

代码语言:javascript
复制
In [4]: rs = redis.StrictRedis(host='localhost', port=6379, db=0)
In [5]: rs.ttl('dba_601')
Out[5]: -1L

二 StrictRedis VS Redis

redis-py提供两个类RedisStrictRedis来支持Redis访问和操作。那两个类之间有什么差异呢?我们看看官方文档[1]的介绍。

2.1 redis.StrictRedis 类
代码语言:javascript
复制
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操作命令

2.2 redis.Redis 类
代码语言:javascript
复制
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。

2.3 两者实现差异

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/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一 问题
  • 二 StrictRedis VS Redis
    • 2.1 redis.StrictRedis 类
      • 2.2 redis.Redis 类
        • 2.3 两者实现差异
        • 三 小结
        相关产品与服务
        云数据库 Redis
        腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档