如何在集群环境中使用Redis扫描?

时间:2018-07-24 12:32:58

标签: redis spring-data spring-data-redis redis-cluster

我正在使用spring redisTemplate和redis scan

它可以在单节点的情况下找到。

但是在集群环境中它不起作用

我无法获取数据。

是否可以在良好的环境中获取扫描数据?

这是我的spring redisTemplate代码。

        //String key="products:aa";
        //String key="products:aac";
        //String key="products:ab";
        //String key="products:ac";


        String workKey="products:aa*";
        ScanOptions options = ScanOptions.scanOptions().match(workKey).count(100).build();

        ScanOptions options1 = ScanOptions.scanOptions().build();
        RedisConnectionFactory factory = redisTemplate.getConnectionFactory();
        RedisConnection conn = factory.getConnection();
        Cursor<byte[]> cursor = conn.scan(options);
        List<Product> result = new ArrayList<Product>();
        while(cursor.hasNext()){
            String key=new String((byte[]) cursor.next());
            Product pa=getById(key.replace("products:",""));
            result.add(pa);
        }

        //result 
        //String key="products:aa";
        //String key="products:aac";

2 个答案:

答案 0 :(得分:2)

Scan是单个Redis节点的命令。 如果要在群集中使用它,请首先获取群集中的节点列表,然后对每个节点运行扫描。

答案 1 :(得分:1)

是的,扫描用于单个节点。您必须扫描群集的每个节点[master]。 以下是在具有predis的群集模式下删除具有匹配字符串的所有键的示例。

/ *删除具有匹配文本的多个键* /

public function removeMatchedKeys($keyName){
    $allRedisHost = array(host1,host2)
    if(!empty($allRedisHost ) && is_array($allRedisHost )) {
        foreach($allRedisHost as $key=>$host) {
            $singleRedisNode =  new Predis\Client("tcp://$host:6379");
            $it = NULL;
            $arr_keys_arr = array();
            $searchKeyName= $prefix.":".$keyName.":*";
            $i=0;
            foreach (new Iterator\Keyspace($singleRedisNode, $searchKeyName) as $actualKey) {
                $actualKey = str_replace($prefix . ':', '', $actualKey);
                $this->predis->del($actualKey);
                $i++;
            }
        }
    }
}

此处“ Iterator \ Keyspace”在内部使用扫描方法。只需包含Iterator类[Predis \ Collection \ Iterator]。