Python redis.ttl 返回 None

作者:疯疯癫癫 
来源:优快云 
原文:https://blog.youkuaiyun.com/fengfengdiandia/article/details/78739848?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!

今天在 Python 中使用 redis 遇到一个奇怪的问题。

一. 问题描述

>>> import redis
>>> >>> r = redis.Redis(host='localhost', port=6379)
>>> print r.get('foo')
bar
>>> print r.ttl('foo')
None


怎么会是 None 呢?去 redis 里面看看

127.0.0.1:6379> get foo
"bar"
127.0.0.1:6379> ttl foo
(integer) -1


ttl 有值啊,这就奇怪了。

Google 后找到应该这样使用:

>>> r = redis.StrictRedis(host='localhost', port=6379, db=0)
>>> print r.ttl('foo')
-1


那么问题来了Redis和StrictRedis 究竟有什么区别?

二. Redis 和 StrictRedis 的联系与区别
class StrictRedis(builtin.object)

This abstract class provides a Python interface to all Redis commands and an implementation of the Redis protocol.

StrictRedis 类实现了 Redis 协议的全部命令。

我们再来看看 Redis 类:

class Redis(StrictRedis)

Provides backwards compatibility with older versions of redis-py that changed arguments to some commands to be more Pythonic, sane, or by accident.

Redis 类继承自 StrictRedis,提供了向后兼容。

If you’re looking to use the standard syntax, consider using the StrictRedis class.

如果要使用标准语法的话,官方推荐 StrictRedis 类。
--------------------- 
作者:疯疯癫癫 
来源:优快云 
原文:https://blog.youkuaiyun.com/fengfengdiandia/article/details/78739848?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!

上述代码展示了一个基于 Redis 的分布式锁的获取和释放机制。以下是对其功能和执行过程的详细解释: ### **代码解析** #### `acquire_lock` 函数 该函数用于尝试获取一个分布式锁,并设置超时时间以防止死锁。 - 参数说明: - `conn`: Redis 连接对象。 - `lockname`: 锁名称,用于标识资源。 - `acquire_timeout`: 获取锁的最大等待时间,默认为 10 秒。 - 执行流程: 1. 使用 UUID 生成唯一的标识符作为锁的所有者。 2. 设置循环,在指定时间内不断尝试通过 `SET` 命令占有锁 (`nx=True`) 并设定过期时间为 10 秒。 - 如果成功,则返回唯一标识符表示占有了锁。 - 如果失败,检查锁是否有过期时间;如果没有,手动添加过期时间以防死锁。 3. 每次未成功占有锁时休眠一小段时间(如 0.001 秒),减少系统开销。 #### `release_lock` 函数 该函数用于安全地释放已经拥有的锁。 - 参数说明: - `conn`: Redis 连接对象。 - `lockname`: 要释放的锁名。 - `identifier`: 占有锁时分配给调用者的唯一标识符。 - 执行流程: 1. 定义 Lua 脚本,确保原子性操作:只有当当前锁等于提供的标识符时才删除锁。 2. 通过 `eval` 方法运行脚本并传递参数完成解锁操作。 --- ### **代码执行的结果** 由于这段代码是一个工具性的锁管理程序,其直接输出取决于具体的上下文环境以及 Redis 状态等外部条件,因此无法明确指出具体“打印”或返回结果的内容。 但是我们可以总结以下可能的情况及对应的行为: 1. 当前没有其他客户端持有此锁(`lockname`)时,`acquire_lock` 将会立即返回新创建的 UUID 标识符字符串; ```python identifier = acquire_lock(redis_conn, "my_resource", acquire_timeout=5) print(identifier) # 输出类似 'c7b8a9d6-eacf-4ca8-bfda-cbcbebfcb2e0' ``` 2. 若存在竞争状况即另一个线程/进程正保持这把锁,则会在最大容忍范围内反复试探直到超过限制为止,此时将得到布尔型变量 False 表明未能取得锁所有权; ```python result = acquire_lock(redis_conn, "busy_resource") print(result) # 可能显示 None 或 False 视情况而定 ``` 3. 对于正确的锁拥有者而言调用 `release_lock` 应总是有效果并且反馈整数 1 ,意味着确实移除了相应键对记录;反之若传入错误 ID 则只会收到数字零表明命令无作用发生. ``` success_flag = release_lock(redis_conn,"released_key","correct_uuid_value") print(success_flag) # 正常情况下应该看到 integer value:1 failure_case = release_lock(redis_conn,"nonexistent_or_mismatched_key","wrong_id_string") print(failure_case )# 预计获得integer value:0 ``` 请注意实际测试需要事先配置好有效的Redis服务连接实例redis_conn才可以验证以上逻辑是否正常运作哦! --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值