我正在尝试通过使用悲观锁来防止Redis中的比赛条件。
这是我到目前为止所做的:
@Override
public void put(final Subscription subscription) {
final String username = subscription.getUsername();
redisTemplate.execute(new SessionCallback<List<Subscription>>() {
@Override
public <K, V> List<Subscription> execute(RedisOperations<K, V> ops) {
ops.multi();
ops.watch((K) SUBSCRIPTION);
final List<Subscription> list = (List<Subscription>) ops.opsForHash().get((K) SUBSCRIPTION, username);
final List<Subscription> updated = orEmpty(list);
updated.removeIf(s -> s.getId().equals(generateId(username, subscription.getTargetUsername())));
updated.add(subscription);
ops.opsForHash().put((K) SUBSCRIPTION, username, updated);
ops.exec();
return updated;
}
});
}
这段代码看起来很糟糕,并且包含很多警告。
我想用lambda重写它,或者至少要泛化它。
我该如何进行RedisOperations>代替?