使用 restTemplate 检查 redis 密钥是哈希还是字符串



我有由哈希和字符串组成的 Redis DB。

我使用以下代码从数据库获取所有密钥:

Set<byte[]> keys = redisTemplate.getConnectionFactory().getConnection().keys("*".getBytes());
Iterator<byte[]> it = keys.iterator();
while(it.hasNext()){
byte[] data = (byte[])it.next();
String key = (new String(data, 0, data.length));
System.out.println(key);
}

从这里: 如何使用 redis 模板从 Redis 获取所有密钥

由于密钥可以是哈希或字符串,如何确定我何时可以使用 opsForHash 和 opsForValue,即如何使用restTemplate在 spring 启动中检查它是哈希还是字符串。

获取密钥类型的 Redis 命令是TYPE: https://redis.io/commands/type

您可以使用 RedisTemplate 的public DataType type(K key)方法来执行此操作:https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/RedisTemplate.html#type-K-

下面是一个示例:

Set<byte[]> keys = redisTemplate.getConnectionFactory().getConnection().keys("*".getBytes());
Iterator<byte[]> it = keys.iterator();
while(it.hasNext()){
byte[] data = (byte[])it.next();
String key = (new String(data, 0, data.length));
DataType type = redisTemplate.type(key);
if (type == DataType.HASH) {
// ...
} else if (type == DataType.STRING) {
// ...
}
}

编辑:另一条建议是您可能希望使用SCAN而不是KEYS *(在您链接的SO问题的一个答案中提到(。Scan 在生产环境中通常更好,因为它不会尝试一次获取和返回所有密钥。

最新更新