Python redis-scan 应用层面浅分析

陈子昂 · 2020年01月26日 · 1134 次阅读

Redis

比较优秀的缓存数据库,用了 redis 做缓存对于测试开发来说处理上下文变量,中间变量会比较简单,如果往深入也可以做消息队列。
key-value 的数据库,value 支持多种数据结构,主要常用的是列表和字符串。
注意使用时不同版本 Redis 有差异,本文 python 安装版本 redis 库版本为 3.3.11

Redis-Scan

在完成一项开发内容时,写个博文记录下,组内有人管数据库,我自己也蛮久没用了。
Scan 具体是什么,这里就不介绍了,推荐看个文章 scan 文章

#官方推荐形式来做,config[""][""]是因为把yaml数据给字典缓存起来了。
result = redis.StrictRedis(host=config['redis']['host'], port=config['redis']['port'], db=config['redis']['db']) 
result.scan_iter(match,count)  #然后进行迭代器扫描

看源码返回是一个生成器,生成器需要折叠展开使用。

cursor = '0'  # 用redis scan命令会返回的,redis_id是str(int)
while cursor != 0:
    cursor, data = self.scan(cursor=cursor, match=match, count=count)
    for item in data:
        yield item #记录了item,yield对象是代表每个item对象可以被使用一次。

这里有项记录,scan 命令每次迭代,有可能返回空,约定结束的标志是服务器返回迭代值为” 0″时才算结束。当服务器收到"0"是新迭代开始,也就是上面 cursor="0",初始化等于 0 的原因。

result.scan_iter(match,count)  #上面的返回是一个集合(注意不是python的集合,语言的魅力就在这里。)

所以可以这么用

for i in result.scan_iter(match,count)#count是非必须的,代表匹配最低限度次数。
       result.delete(i)

同样看下源码

def delete(self, *names):
    "Delete one or more keys specified by ``names``"
    return self.execute_command('DEL', *names)  #通过这里看到redis本身库也是基于执行command信息进行返回处理。

上面是生成器->迭代器->for...in...展开后,redis 对象删除处理,也是官方推荐的遍历删除,在 python 上,类似 foreach 的写法并不低效。
一份短文,结束。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册