Spring RedisTemplate中的Redis MSET与TTL

10

我有一个Spring Boot应用程序,需要将数百万个键值对插入Redis中。

目前我正在使用multiSet方法每次处理1,000个键值对。

@Autowired
private final StringRedisTemplate template;

...

Map<String, String> keyValuePairs = new HashMap<>();
template.opsForValue().multiSet(keyValuePairs);

然而,我们还需要为每对设置TTL。看起来 multiSet 没有进行此操作的方法。使用 set 可以实现,但这将需要大量调用,因此可能不太高效。

// For each key value pair
template.opsForValue().set(key, value, timeout, unit);

有人知道如何以高效的方式完成这个操作或使用 set 吗?

谢谢

2个回答

3

管道技术可以解决你的问题;你可以创建一个管道,将所有要执行的命令填充到其中,然后批量发送给Redis。使用SET和EX参数,你可以一次性发送10,000个或更多命令。


5
以下是Spring Data Redis Pipelining功能文档的链接:http://docs.spring.io/spring-data/redis/docs/current/reference/html/#pipeline。 - mp911de

2

我曾经遇到同样的问题,最终通过 Redis 事务解决了它。在 operations.multi()operations.exec() 之间的所有操作都将作为一个事务执行,可以节省大量的网络调用。你还可以使用 operations.discard() 实现回滚。

List<Object> txResults = redisTemplate.execute(new SessionCallback<List<Object>>() {
                          public List<Object> execute(RedisOperations operations) throws DataAccessException {
                            operations.multi();
                            for (Map.Entry<String, Integer> entry : toUpsert.entrySet()) {
                                operations.opsForValue().set(entry.getKey(), entry.getValue(), expirySeconds, TimeUnit.SECONDS);
                            }
                            return operations.exec();
                          }
                        });

Spring文档:Redis事务


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接