我有由哈希和字符串组成的 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 在生产环境中通常更好,因为它不会尝试一次获取和返回所有密钥。