redis scan 命令 match count 用法

标签:

本文出自jvm123.com-java技术分享站:http://jvm123.com/2022/02/redis-scan-ming.html

使用scan替代keys命令

Redis 的keys命令,可以列出或者匹配列出所有的键,不过这个命令在执行期间会阻塞服务器,使得其他命令无法执行,所以非常有必要使用scan代替。scan 命令 不会全部扫描匹配,而是根据指定的keys数量进行扫描,默认每次10个。

Scan命令的用法

SCAN 返回一个包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标, 而第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。如果新游标返回 0 表示迭代已结束。

如下,scan 0,返回11个结果,scan 9 返回5个结果:

%title插图%num

Scan 匹配key的模式

scan 0 match *dict* count 10

上面命令的含义是:从游标0 开始搜索匹配 *dict* 的key,并且本次搜索10个key。

%title插图%num

如上图,就分两次搜索了所有匹配*a*的键。

java代码使用scan

package com.example.demo.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashSet;
import java.util.Set;

/**
 * @author yawn Lau
 */
@RestController
public class RedisController {

    @Autowired
    RedisTemplate<String, Object> redisTemplate;

    @GetMapping("redis/test1")
    public Set<String> test1() {
        Set<String> execute = redisTemplate.execute(new RedisCallback<Set<String>>() {
            @Override
            public Set<String> doInRedis(RedisConnection connection) throws DataAccessException {
                Set<String> binaryKeys = new HashSet<>();
                Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match("*").count(2).build());
                while (cursor.hasNext()) {
                    binaryKeys.add(new String(cursor.next()));
                }
                System.out.println(binaryKeys);
                return binaryKeys;
            }
        });
        return execute;
    }
}

发表评论