使用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 或任何其他大小,具体取决于您的系统和偏好。