如下是redis中存储的数据结构
我想取key以favorites:结尾的所有数据
- Redis 的 SCAN 命令用于迭代数据库中的键,支持通过模式过滤结果。模式规则基于 Redis 的通配符匹配语法,类似于文件名匹配规则:
*
:匹配零个或多个字符。?
:匹配一个字符。[abc]
:匹配括号中的任意一个字符。[a-z]
:匹配括号中的字符范围。- 如:ScanOptions.scanOptions().match(“*favorites:”)即为匹配以favorites:结尾的key
- 因为我这个存储的Set类型的数据结构,所以用HashMap<String, Set> stringLongHashMap接数据,不同的数据类型换一下即可
/*** 获取所有以 "favorites:" 结尾的键* @return Set<String> 返回所有以 "favorites:" 结尾的键*/public HashMap<String, Set<String>> favoriteSync() {HashMap<String, Set<String>> stringLongHashMap = new HashMap<>();// 获取 Redis 连接RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();try {// 执行 SCAN 操作long cursor = 0; // 初始化游标ScanOptions options = ScanOptions.scanOptions().match("*favorites:").build();// 执行 SCAN 命令do {Cursor<byte[]> scanResult = connection.scan(options);cursor = scanResult.getPosition();// 将扫描到的键添加到结果集合scanResult.forEachRemaining(key -> {// 获取当前 key 对应的所有成员(值)Set<byte[]> members = connection.sMembers(key);// 将 Set<byte[]> 转换为 Set<String>Set<String> memberStrings = new HashSet<>();for (byte[] member : members) {memberStrings.add(new String(member)); // 将字节数组转换为字符串}stringLongHashMap.put(new String(key), memberStrings);});} while (cursor > 0); // 当游标不为空时继续扫描} catch (Exception e) {e.printStackTrace();} finally {connection.close(); // 关闭连接}return stringLongHashMap;}
效果如下