Redis 通配符批量删除key

问题:

  线上有部分的redis key需要清理。

 

一、

 由于Keys模糊匹配,请大家在实际运用的时候忽略掉。因为Keys会引发Redis锁,并且增加Redis的CPU占用,情况是很恶劣的,

  官网说明如下:

Warning: consider KEYS as a command that should only be used in production environments with extreme care. 

It may ruin performance when it is executed against large databases. 
This command is intended for debugging and special operations, such as changing your keyspace layout. 
Don’t use KEYS in your regular application code. 
If you’re looking for a way to find keys in a subset of your keyspace, consider using SCAN or sets.

 

 

二、方案一

如果有这种需求的话可以自己对键值做索引,

比如把各种键值存到不同的set里面,分类建立索引,这样就可以很快的得到数据,

但是这样也存在一个明显的缺点,就是浪费宝贵的空间,要知道这可是内存空间啊,所以还是要合理考虑,当然也可以想办法,比如对于有规律的键值,可以存储他们的始末值等等。 

 

三、方案二

从redis的官方文档上看,2.8版本之后SCAN命令已经可用,允许使用游标从keyspace中检索键。

对比KEYS命令,虽然SCAN无法一次性返回所有匹配结果,但是却规避了阻塞系统这个高风险,从而也让一些操作可以放在主节点上执行。

 

需要注意的是,SCAN 命令是一个基于游标的迭代器。

SCAN 命令每次被调用之后, 都会向用户返回一个新的游标,用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。同时,使用SCAN,用户还可以使用keyname模式和count选项对命令进行调整。SCAN相关命令还包括SSCAN 命令、HSCAN 命令和 ZSCAN 命令,分别用于集合、哈希键及有续集等。

 

四、代码示例

 

# -*- coding: utf-8 -*-
import sys
from sys import argv
from rediscluster import RedisCluster

# 生产环境
product_redis_nodes_str = "*"

def get_redis():
    redis_nodes_str = product_redis_nodes_str
    print redis_nodes_str
    startup_nodes = []
    for hp in redis_nodes_str.split(','):
        host, port = hp.split(':')
        port = int(port)
        startup_nodes.append({"host": host, "port": port})
    rc = RedisCluster(startup_nodes=startup_nodes, max_connections=16, decode_responses=False)
    print "get_redis success"
    return rc

def test_keys():
    rc = get_redis()

    key_list = []
    for key in rc.scan_iter(match='rc.rs.smallvideo*', count=1000):
        key_list.append(key)
        if(len(key_list)>=100000):
            break;

    for key in key_list:
        rc.delete(key)

if __name__ == "__main__":
    Usage = "python %s" % __file__
    if len(argv) != 1:
        print Usage
        sys.exit(1)
    test_keys()

  

 

 

参考:

  1、http://www.redis.cn/commands/scan.html

转载于:https://www.cnblogs.com/KyleXu/p/10447862.html

你可能感兴趣的:(数据库,php,运维)