Jedis运用scan删除正则匹配的key

纵然是瞬间 提交于 2020-08-19 05:33:24

import redis.clients.jedis.Jedis;
import redis.clients.jedis.ScanParams;
import redis.clients.jedis.ScanResult;

import java.util.List;
import java.util.Set;

public class RedisApplication {

    private static String prefix = "ws:";
    static Jedis jedis;

    static {
        jedis = new Jedis("localhost");
        System.out.println("连接成功");
    }

    public static void main(String[] args) {
//       init();
        list();
//        scan();
        del();
    }

    private static void del() {
        Long count = jedis.del("abc");
        System.out.println(count);
    }
    private static void scan() {
        ScanParams params = new ScanParams();
        params.match("ws:*");
//        params.count(3);
        String cursor = "0";
        while (true) {
            ScanResult<String> scanResult = jedis.scan(cursor, params);
            List<String> elements = scanResult.getResult();
            if (elements != null && elements.size() > 0) {
                System.out.println(elements);
            }
            cursor = scanResult.getStringCursor();
            if ("0".equals(cursor)) {
                break;
            }
        }
    }

    private static void list() {
        Set<String> keys = jedis.keys("ws:*");
        for (String key : keys) {
            System.out.println(key);
        }
        System.out.println("====");
    }

    private static void init() {
        for (int i = 0; i < 5; i++) {
            jedis.set(prefix + i, i + "");
        }
    }
}

keys为何不能在生产使用?

redis的keys命令,通来在用来删除相关的key时使用,但这个命令有一个弊端,在redis拥有数百万及以上的keys的时候,会执行的比较慢,更为致命的是,这个命令会阻塞redis多路复用的io主线程,如果这个线程阻塞,在此执行之间其他的发送向redis服务端的命令,都会阻塞,从而引发一系列级联反应,导致瞬间响应卡顿,从而引发超时等问题,所以应该在生产环境禁止用使用keys和类似的命令smembers,这种时间复杂度为O(N),且会阻塞主线程的命令,是非常危险的。

scan的优点

那么在生产环境我们应该使用scan命令,代替keys命令,同样是O(N)复杂度的scan命令,支持通配查找,scan命令或者其他的scan如SSCAN ,HSCAN,ZSCAN命令,可以不用阻塞主线程,并支持游标按批次迭代返回数据,所以是比较理想的选择。keys相比scan命令优点是,keys是一次返回,而scan是需要迭代多次返回。 但scan命令的也有缺点,返回的数据有可能重复

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!