使用scan替代keys命令
Redis 的keys命令,可以列出或者匹配列出所有的键,不过这个命令在执行期间会阻塞服务器,使得其他命令无法执行,所以非常有必要使用scan代替。scan 命令 不会全部扫描匹配,而是根据指定的keys数量进行扫描,默认每次10个。
Scan命令的用法
SCAN 返回一个包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标, 而第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。如果新游标返回 0 表示迭代已结束。
如下,scan 0,返回11个结果,scan 9 返回5个结果:

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

如上图,就分两次搜索了所有匹配*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; } }