问题描述
我使用 redis 作为缓存,一旦我要从 oracle 数据库中获取一个表,然后将这些记录插入到 redis 缓存中。 我正在为两者使用存储库,因此我正在执行以下操作:
oracleRepo.findAll().forEach(record -> {
RedisEntity redisEntity = objectMapper.convertValue(record, RedisEntity.class);
redisRepo.save(redisEntity);
});
但是,当我将它保存到 redis 时,这很慢,因为它大约有 50 万条记录。 我知道我可以改进从数据库中获取数据并使用分页的方式,但这会改善对 redis 的保存。 有没有办法对redis进行批量插入,因为现在它似乎正在为它试图保存的每条记录打开和关闭redis连接。
1楼
一种可能的方法是批处理来自 Oracle 的响应并使用在 redis 服务器中设置这些键。
使用管道将多个命令发送到 redis 服务器将允许继续处理批处理,而无需等待永久 SET 操作的响应。
以下是使用 redis 管道的 Spring Boot 示例代码:
//pop a specified number of items from a queue
List<Object> results = stringRedisTemplate.executePipelined(
new RedisCallback<Object>() {
public Object doInRedis(RedisConnection connection) throws DataAccessException {
StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
for(int i=0; i< batchSize; i++) {
stringRedisConn.rPop("myqueue");
}
return null;
}
});