Redis遍历、模糊匹配key的两个命令keys、scan(python使用Redis)

Redis遍历、模糊匹配key的两个命令keys、scan(python使用Redis)

(1)全量遍历–keys命令

获取Redis中的所有键:

import redis  
  
pool=redis.ConnectionPool(host='10.3.1.151',port=6379,password='mca321',db=2)  
r = redis.tRedis(connection_pool=pool)  

# 获得改=该数据库下所有键
keys = r.keys()  
# 得到键的数据结构类型---以列表形式得到所有键
print(type(keys))  
print(keys)

keys支持模式匹配:

# keys支持模式匹配
keys = redis_connection.keys("AWS_Landsat_010*") #得到以AWS_Landsat_010为前缀的所有key键
print(keys)

pattern通配符的详细说明:

- * 代表匹配任意字符
- ? 代表匹配一个字符
- [] 代表匹配部分字符,例如[1,3]代表匹配1和3,而[1-10]代表匹配1到10的任意数字。
- x 转移字符,例如要匹配星号,问号需要转义的字符

提示:

在Redis中是单架构的,所以在执行keys命令时有时会造成阻塞,会阻塞redis多路复用的io主线程,如果这个线程阻塞,在此执行之间其他的发送向redis服务端的命令,都会阻塞,从而引发一系列级联反应,导致瞬间响应卡顿,从而引发超时等问题,所以我们在使用keys命令时要慎用。下面我们看一下,使用keys命令的注意事项。

  • 因为keys命令是会阻塞的,所以我们在使用keys命令时,要在非业务的客户端中进行,这样即使keys命令会阻塞,也不会影响相关的业务。在生产环境禁止用使用keys。
  • 如Redis中的键总数比较少时,可以直接使用keys命令。
  • 如果Redis中的键的总数比较多,并且我们不得不在业务环境的客户端如生产环境客户端中获取所有键时,那我们可以使用scan命令,因为该命令不会对客户端造成阻塞。

2)渐进式遍历–scan命令

如果需要查找然后删除key的需求,那么在生产环境我们应该使用scan命令,代替keys命令.

scan命令的优点:同样是O(N)复杂度的scan命令,支持通配查找,scan命令或者其他的scan如SSCAN ,HSCAN,ZSCAN命令,可以不用阻塞主线程,并支持游标按批次迭代返回数据,所以是比较理想的选择。

keys相比scan命令优点是,keys是一次返回,而scan是需要迭代多次返回

scan命令的缺点:返回的数据有可能重复,需要我们在业务层按需要去重,scan命令的游标从0开始,也从0结束,每次返回的数据,都会返回下一次游标应该传的值,我们根据这个值,再去进行下一次的访问,如果返回的数据为空,并不代表没有数据了,只有游标返回的值是0的情况下代表结束。

查找所有键key:

keys3=redis_connection.scan_iter()
print(type(keys3))# 返回的是一个迭代器
for key in keys3:
    print(key)
    
keys3=redis_connection.scan()
print(type(keys3))# 返回的是一个元组tuple

查找模式匹配的键key:

keys2=redis_connection.scan_iter("AWS_Landsat*")
print(type(keys2))# 返回的是一个迭代器
for key in keys2:
    print(key)

查找所有元素value:
scan(cursor=0, match=None, count=None)

data=redis_connection.zscan("AWS_Landsat_01010110001010101010011010100110")#针对zset数据结构
print(type(data))
print(data)


# 其他数据结构:
print(r.hscan("hash2"))
print(r.sscan("set3"))
print(r.zscan("zset2"))
print(r.getrange("foo1", 0, -1))
print(r.lrange("list2", 0, -1))
print(r.smembers("set3"))
print(r.zrange("zset3", 0, -1))
print(r.hgetall("hash1"))12345678

查看所有元素–迭代器
scan_iter(match=None, count=None)

data=redis_connection.zscan_iter("AWS_Landsat_01010110001010101010011010100110")#针对zset数据结构
print(type(data))
print(data)
for d in data:
    print(d)

参考:

获取Redis中所有的键 - 云+社区 - 腾讯云 (tencent.com)

使用 python 来操作 redis 用法详解_Bingo-CSDN博客

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值