当前位置: 首页 > 知识库问答 >
问题:

使用Jedis从redis缓存中获取所有键值对的有效方法

庾奇思
2023-03-14

我有一个redis缓存数据库,可以保存80k条记录。我需要在我的应用程序中获取整个数据(键和值)。我使用的是绝地武士客户端,下面是我使用的代码:

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个密钥,它循环遍历每个密钥以获得值,哈希映射用密钥和值填充。我还没有在这里添加迭代器的代码,我认为这与我的问题无关,但如果需要,我可以添加它。

我的问题是性能,这需要很长时间(

共有1个答案

谷梁鸣
2023-03-14

您可以将分块到一组[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或任何其他大小,这取决于您的系统和偏好。

 类似资料:
  • 问题内容: 我将数据存储在Redis中。我将它存储在GUID,createday和它的大小中。 因此,我定义以下内容: 我希望查看我的数据库中的所有文件。因此,我尝试以下操作: 但是res是。我该怎么做? 问题答案: 返回存储在key处的哈希的所有字段和值,您不能指定掩码: http //redis.io/commands/hgetall 您可以调用获取符合条件的所有键的列表,然后循环获取所有值。

  • 我知道,为了获得Redis中所有键的列表,我必须使用,但是有没有一种方法可以将所有键及其值一起输出? 几分钟的搜索没有产生任何结果。 另外,非常感谢您的回答,但我正在寻找一个本地解决方案。我可以自己编写一个函数,遍历的所有输出。

  • 问题内容: 有一篇关于Redis命令以获取所有可用键的文章,但我想使用Python做到这一点。 有什么办法吗? 问题答案: 采用 优于大量密钥,因为它为您提供了可以使用的迭代器,而不是尝试将所有密钥加载到内存中。 我的redis中有一个1B记录,而且我永远都无法获得足够的内存来一次返回所有密钥。 一对一扫描键 这是一个python代码段,用于从商店中获取与某个模式匹配的所有键,并一一删除它们: 批

  • 问题内容: 用红色表示正在使用哈希,我需要存储具有多个字段和值的哈希键。我尝试如下: 输出为: 我只得到一个价值。如何获取哈希键中的所有字段和值?如果我错了,请帮助我,让我获取代码。谢谢。 问题答案: 您获得一个值是因为您覆盖了先前的值。 这会将Id,ReqNo添加到Table1哈希对象。 这将覆盖Table1哈希对象的Id和ReqNo。此时,哈希中只有两个字段。 实际上,您的问题来自您试图将关系

  • 我目前在我的Redis表中存储了大约50k个哈希,每个哈希都有5个键/值对。我每天运行一次批处理作业,更新散列值,包括将一些键值设置为散列中另一个键值。 下面是我的python代码,它迭代键,如果给定哈希存在新的\u代码值,则将旧的\u代码设置为新的\u代码: 我觉得有点奇怪,我必须迭代两次键才能获得相同的结果,有更好的方法吗? 另一件我想弄明白的事情是如何以最佳性能获取所有哈希值。以下是我目前的

  • 问题内容: 我在我的socket.io聊天应用程序的Redis存储中存储了用户名/ SocketID对。 当用户断开连接时,我需要从Redis存储中删除用户名/ socketID对。我已经看到了如何从键中获取值,但从未从值中获取键。可能吗?或无论哪种方式,我怎么能只从值中删除键/值对。这是我的代码 用于在连接上添加存储 对于断开连接,客户端将不知道何时断开连接,可能是由于Internet连接断开而