-
KEYS
KEYS pattern
查找所有符合给定模式 pattern
的 key
。
KEYS *
匹配数据库中所有 key
。
KEYS h?llo
匹配 hello
, hallo
和 hxllo
等。
KEYS h*llo
匹配 hllo
和 heeeeello
等。
KEYS h[ae]llo
匹配 hello
和 hallo
,但不匹配 hillo
。
特殊符号用 \
隔开
KEYS 的速度非常快,但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的 key
,你最好还是用 Redis 的集合结构(set)来代替。现网环境使用keys会造成线程阻塞,不推荐使用
可用版本:
>= 1.0.0
时间复杂度:
O(N), N
为数据库中 key
的数量。
- 删除Redis大键注意事项
Redis删除大的集合键的耗时, 测试估算,可参考;和硬件环境、Redis版本和负载等因素
hash类型100万数据,耗时1s
delete large hash key从Redis2.8版本开始支持SCAN命令,通过m次时间复杂度为O(1)的方式,遍历包含n个元素的大key.
这样避免单个O(n)的大命令,导致Redis阻塞。 这里删除大key操作的思想也是如此。
HSCAN test_key 0 MATCH ** COUNT 100
COUNT 数量过大,也会阻塞线程,一个大的redis库中很多命令会造成阻塞(redis单线程),例如hgetall、keys,delete大key,所以生产环境执行redis脚本必须非常小心
通过hscan命令,每次获取100个字段,再用hdel命令,每次删除1个字段。每次循环休眠一秒
注意:python环境需要安装redis模块
Python代码:
#!/usr/bin/python2.7
# -*- coding: utf-8 -*-
import redis
import time
import sys
print(sys.argv[1])
COUNT = 100
conn = redis.StrictRedis(host=sys.argv[2], port=sys.argv[3])
key_to_be_deleted = sys.argv[1]
def del_key(redis_conn, hash_key, del_count):
cursor = '0'
while cursor != 0:
pl = redis_conn.pipeline()
cursor, data = redis_conn.hscan(hash_key, cursor=cursor, count=del_count)
for item in data.items():
pl.hdel(hash_key, item[0])
pl.execute()
time.sleep(1)
def main():
del_key(conn, key_to_be_deleted, COUNT)
if __name__ == '__main__':
main()
执行脚本 :python test.py test 127.0.0.1 6379
字符串匹配删除
#!/usr/bin/python2.7
# -*- coding: utf-8 -*-
import redis
import time
import sys
print(sys.argv[1])
COUNT = 100
conn = redis.StrictRedis(host=sys.argv[2], port=sys.argv[3])
key_to_be_deleted = sys.argv[1]
def del_key(redis_conn, hash_key, del_count):
for key in redis_conn.scan_iter(match = hash_key,count = del_count):
conn.delete(hash_key)
time.sleep(0.01)
def main():
del_key(conn, key_to_be_deleted, COUNT)
if __name__ == '__main__':
main()
强制关闭Redis快照导致不能持久化
MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.
./redis-cli
127.0.0.1:6379> config set stop-writes-on-bgsave-error no
以上是在使用redis过程中遇到的坑
参考文档
https://blog.csdn.net/wsliangjian/article/details/52329320
http://redisdoc.com/key/keys.html#keys