【发布时间】:2019-07-07 23:31:27
【问题描述】:
我使用 redis 作为缓存,一旦我要从 oracle 数据库中获取表,然后将这些记录插入到 redis 缓存中。我正在使用两者的存储库,所以我正在做类似的事情:
oracleRepo.findAll().forEach(record -> {
RedisEntity redisEntity = objectMapper.convertValue(record, RedisEntity.class);
redisRepo.save(redisEntity);
});
但是,当我将它保存到 redis 时,这非常慢,因为它大约有 50 万条记录。我知道我可以改进从数据库中获取并使用分页的方式,但这会改进保存到 redis 上的方法。有没有办法批量插入到 redis 中,因为现在它似乎正在为它试图保存的每条记录打开和关闭 redis 连接。
【问题讨论】:
-
您将如何使用这些数据?我建议您尝试以反映其预期用途的方式将其存储在缓存中。如果您一次需要页面,则可以将所有这些值存储在一个键中。现在的问题是您要单独存储每条记录,因此需要 50 万次往返缓存(从数据库加载后)。您可以使用 Spring Cache,或者可能是 Redisson,它允许许多不同类型的数据,这可能允许您存储这些数据并对其进行批处理。我个人对 Spring data redis 不熟悉。
-
它将被用作查找数据,所以我需要缓存中的所有数据。
-
这不是它被缓存的问题,而是它如何被缓存以及你打算如何从缓存中加载的问题。您会单独从缓存中获取这些记录(当您保存它们时),还是会在单个缓存键中缓存许多记录?现在,您不会将保存批量保存到缓存,因此它是 O(n) 往返。如果您可以将所有这些记录存储在一个键上,您可能会先对其进行循环,执行一些基本处理,最后写入一次缓存。这里有很多因素,但是如果您预处理数据并写入缓存的次数更少,生活会更好。
-
除非我认为 redis 错误,否则我想单独存储每条记录,以便在时间到时使用此查找数据,我可以使用密钥获取我需要的单个记录。不确定通过将所有记录保存在一个键下是否仍然可行。我还需要经常使用不同的键来查找数据。
-
您的理解是正确的,我只是想确保您确实必须像这样写 500k。我简要回顾了 spring data redis,并没有在他们的文档页面上看到大量插入或批量插入,但是,我确实找到了流水线:docs.spring.io/spring-data/redis/docs/2.1.5.RELEASE/reference/…,并且引用了redis.io/topics/mass-insert;你也可以试试 StringRedisTemplate 。根据存储的数据,如果您想使用原始命令,您可以使用 MSET 操作,该操作可以一次写入多个键。
标签: java spring-boot redis spring-data-redis