我正在使用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";
答案 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]。