redisClusterでのぼかし取得key

3438 ワード

1つのクラスタでは、keys法によってpatternによってkeyの集合を直接取得することは明らかではない.このような問題に鑑みて、以下のような2つの考え方が生まれた.
シナリオ1:同じtagのKVが1つのノード上にあることが知られているので、keyが同じhashtagを持っている限り、1つのノード上にあるので、ノードをスキャンすれば、クラスタを単点に変換できます.
 @RequestMapping(value = "/ceshi", method = RequestMethod.GET)
    @ResponseBody
    public void Rediskeys() {
        /**
         *     
         * @param pattern key      
         * @param count          ,          ,    redis  。         
         * @return    key  
         */
        try{
            jedisCluster.getClusterNodes();
            ScanParams scanParams = new ScanParams();
            scanParams.match("{operatingSystem}*");
            scanParams.count(1000);
            ScanResult result = jedisCluster.scan("0", scanParams);
            List keyList = result.getResult();
            System.out.println("keyList======="+keyList);
        }finally{
        }
    }
//scanParams.match("*{zmc}*");//success
//scanParams.match("ZMC_text:{zmc}*");//success

上記match方法では、括弧中のパラメータも上記のように記述することができる.
その鍵はkeyがredisにアップロードされることであり、命名方法には{}が含まれなければならない.
そして{}前、後ろにパラメータがあるかどうかは指定しなければならない.keyがZMC_の場合text: {zmc}:1  
scanParams.match("{zmc}*");結果が出ない
 
シナリオ2:すべてのノードを取得し、各ノードをそれぞれスキャンし、patternに基づいてノードのkeyを取得し、統合すればよい.
注意:clusterモードでマルチキー操作を実行する場合、これらのキーは同じslot上にある必要があります.そうしないと、JedisDataException異常が報告されます.
@RequestMapping(value = "/ceshi3", method = RequestMethod.GET)
@ResponseBody
public void RedisKeys() {
    String redisKeyStartWith="Ad:ads:id:";
    try {
        Map clusterNodes = jedisCluster.getClusterNodes();
        for (Map.Entry entry : clusterNodes.entrySet()) {
            Jedis jedis = entry.getValue().getResource();
            //       (       ,               )
            if (!jedis.info("replication").contains("role:slave")) {
                Set keys = jedis.keys(redisKeyStartWith + "*");
                if (keys.size() > 0) {
                    Map> map = new HashMap<>();
                    for (String key : keys) {
                        // cluster     key     ,  key      slot ,    :JedisDataException:
                        // CROSSSLOT Keys in request don't hash to the same slot
                        int slot = JedisClusterCRC16.getSlot(key);
                        //  slot key  ,  slot key    
                        if (map.containsKey(slot)) {
                            map.get(slot).add(key);
                        } else {
                            map.put(slot, Lists.newArrayList(key));
                        }
                    }
                    for (Map.Entry> integerListEntry : map.entrySet()) {
                        System.out.println("integerListEntry="+integerListEntry);
                        //jedis.del(integerListEntry.getValue().toArray(new String[integerListEntry.getValue().size()]));
                    }
                }
            }
        }
        logger.info("success redisKeys:{}", redisKeyStartWith);
    } finally {
    }
}

 
宣言:この文書では、https://blog.csdn.net/u010416101/article/details/80754171  ;上手に書いてありますので、参考にしてみてください...