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 转移字符,例如要匹配星号,问号需要转义的字符
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)