使用Jedis从redis缓存中获取所有键值对的有效方法
Efficient way to get all the key value pair from redis cache using Jedis
我有一个包含 80k 条记录的 redis 缓存数据库。我需要在我的应用程序中获取整个数据(键和值)。我正在使用 Jedis 客户端,这是我使用的代码:
private static JedisPool jedisPool;
public RedisClient(String ip, int port, int timeout, String password) {
try {
if (jedisPool == null) {
JedisPoolConfig poolConfig = new JedisPoolConfig();
jedisPool = new JedisPool(poolConfig, ip, port, timeout, password);
}
} catch (Exception e) {
log.error("Malformed server address", e);
}
}
public String get(final String key) {
try (Jedis jedis = jedisPool.getResource()) {
String value = jedis.get(key);
return value;
} catch (Exception ex) {
log.error("Exception caught in get", ex);
}
return null;
}
public void populateRedisMap(RedisClient redisClient) {
RedisIterator iterator = redisClient.iterator(Integer.parseInt(scanCount), matchPattern, scan);
List<String> keys = iterator.next();
while (iterator.hasNext()) {
keys.addAll(iterator.next());
}
log.info("Keys count:{}", keys.size());
for (String key : keys) {
if(redisClient.get(key) instanceof String) {
String value = redisClient.get(key);
redisMap.put(key, value);
}
else{
Object keyValue = redisClient.get(key);
log.info("Value {0} of Type {1} found for key {2}", keyValue, keyValue.getClass(), key);
}
}
log.info("Records count in Redis Map:{}", redisMap.size());
}
以上代码有效。我得到了 80k 个键,它循环遍历每个键以获取值,并且哈希映射中填充了键和值。我没有在这里添加 Iterator 的代码,我认为它与我的问题无关,但如果需要我可以添加它。
我的问题是性能,填充此哈希映射需要很长时间(>30 分钟)。获取键列表的迭代器部分需要几秒钟,获取值的 for 循环需要时间。我的问题是,是否有更有效的方法从redis缓存中获取所有键值数据?我在 Redis 文档中找不到可以使用的任何其他命令,但想检查我是否遗漏了什么。
您可以将 keys
分块到键的数组[Note1] 中并调用 mget
.
public List<String> get(final String[] keys) {
try (Jedis jedis = jedisPool.getResource()) {
List<String> values = jedis.mget(keys);
return values;
} catch (Exception ex) {
log.error("Exception caught in mget", ex);
}
return null;
}
注意 1:数组的大小可以是 100 或 1000 或任何其他大小,具体取决于您的系统和偏好。
我有一个包含 80k 条记录的 redis 缓存数据库。我需要在我的应用程序中获取整个数据(键和值)。我正在使用 Jedis 客户端,这是我使用的代码:
private static JedisPool jedisPool;
public RedisClient(String ip, int port, int timeout, String password) {
try {
if (jedisPool == null) {
JedisPoolConfig poolConfig = new JedisPoolConfig();
jedisPool = new JedisPool(poolConfig, ip, port, timeout, password);
}
} catch (Exception e) {
log.error("Malformed server address", e);
}
}
public String get(final String key) {
try (Jedis jedis = jedisPool.getResource()) {
String value = jedis.get(key);
return value;
} catch (Exception ex) {
log.error("Exception caught in get", ex);
}
return null;
}
public void populateRedisMap(RedisClient redisClient) {
RedisIterator iterator = redisClient.iterator(Integer.parseInt(scanCount), matchPattern, scan);
List<String> keys = iterator.next();
while (iterator.hasNext()) {
keys.addAll(iterator.next());
}
log.info("Keys count:{}", keys.size());
for (String key : keys) {
if(redisClient.get(key) instanceof String) {
String value = redisClient.get(key);
redisMap.put(key, value);
}
else{
Object keyValue = redisClient.get(key);
log.info("Value {0} of Type {1} found for key {2}", keyValue, keyValue.getClass(), key);
}
}
log.info("Records count in Redis Map:{}", redisMap.size());
}
以上代码有效。我得到了 80k 个键,它循环遍历每个键以获取值,并且哈希映射中填充了键和值。我没有在这里添加 Iterator 的代码,我认为它与我的问题无关,但如果需要我可以添加它。
我的问题是性能,填充此哈希映射需要很长时间(>30 分钟)。获取键列表的迭代器部分需要几秒钟,获取值的 for 循环需要时间。我的问题是,是否有更有效的方法从redis缓存中获取所有键值数据?我在 Redis 文档中找不到可以使用的任何其他命令,但想检查我是否遗漏了什么。
您可以将 keys
分块到键的数组[Note1] 中并调用 mget
.
public List<String> get(final String[] keys) {
try (Jedis jedis = jedisPool.getResource()) {
List<String> values = jedis.mget(keys);
return values;
} catch (Exception ex) {
log.error("Exception caught in mget", ex);
}
return null;
}
注意 1:数组的大小可以是 100 或 1000 或任何其他大小,具体取决于您的系统和偏好。