【问题标题】:Will fetching members from a redis SET will fetch everything to memory?从 redis SET 中获取成员是否会将所有内容都提取到内存中?
【发布时间】:2014-05-19 07:25:40
【问题描述】:

我正在使用 Spring Data Redis。如果 Redis SET 有数百万个值,获取其成员(使用members() function)会在堆中创建一个具有一百万个值的 Java 集吗?还是仅按要求获取值?

如果一次性获取所有值,如果 SET 很大,是否会引发一些内存不足错误?如果是这样,我该如何克服呢?我对 LISTZSET 的 range() 也有同样的疑问。

【问题讨论】:

    标签: java spring redis spring-data-redis


    【解决方案1】:

    RedisSet 的 SD Redis v 1.2 实现没有延迟加载实现。

    但是像addremove这样的命令被委托给底层RedisConnection在服务器上执行操作而不影响任何本地数据。

    使用RedisSet.iterator() 将执行SMEMBERS 并将整个响应加载到内存中,这可能会占用大量内存。

    ListMaps 实现也是如此。

    【讨论】:

    • 所以我必须使用 LIST 或 ZSET 而不是 SET,然后使用 range() 来获取有限数量的成员,以免压倒我的堆大小?
    • 刚刚发现 SCAN 命令。不知道Spring Data Redis目前是否支持
    • SCAN 目前不支持,所以你必须直接使用底层的redis连接(jedis直接支持扫描,你可以模拟生菜)。但我们已经在努力支持 SCAN。见Pull Request: #71
    【解决方案2】:

    文档没有提到任何关于延迟加载的内容,因此应该理解为一次获取​​集合的所有元素。如果您有大量集合,这将导致OutOfMemoryError

    【讨论】:

      猜你喜欢
      • 2021-04-14
      • 1970-01-01
      • 2018-06-13
      • 2012-11-17
      • 2011-01-03
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多