Redis集群环境下keys被禁用,该怎么实现keys?

发布时间 2023-06-27 15:25:40作者: faylinn

在生产环境中,禁用Redis的keys命令是为了避免对Redis实例的性能造成负面影响。keys命令会遍历整个 Redis数据库,查找与给定模式匹配的所有键,这在大规模的Redis数据库中可能会非常耗时;

那么,在keys禁用的情况下,仍然需要使用keys该怎么办呢?我们搜索一些处理方案大多是建议使用scan,但是实际使用中又会出现各种问题;

因为在redis集群环境下,我们没有办法使用scan.

所以需要遍历所有redis节点,然后每个节点scan,具体代码如下:

    public Set<String> getKeys(String pattern){
        Set<String> keys = new HashSet<>();
        redisTemplate.getConnectionFactory().getClusterConnection().clusterGetNodes().forEach(node -> {
            if (node.isConnected()) {
                RedisClusterNode redisNode = new RedisClusterNode(node.getHost(), node.getPort());
                ScanOptions options = ScanOptions.scanOptions().match(pattern).count(1000).build();
                Cursor<byte[]> scan = redisTemplate.getConnectionFactory().getClusterConnection().scan(redisNode, options);
                while(scan.hasNext()){
                    keys.add(new String(scan.next()));
                }
            }
        });
        return keys;
    }