#java #spring #spring-boot #spring-data #spring-data-redis
Вопрос:
Я пишу небольшое приложение, похожее на чат, в котором в основном есть две сущности «комнаты» и «пользователи». Данные хранятся в Redis, так как у них очень короткий срок службы, и так как я хочу ознакомиться с ними.
Две структуры данных выглядят упрощенно следующим образом.
Room.java
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Reference;
import org.springframework.data.redis.core.RedisHash;
import javax.validation.constraints.Size;
import java.util.List;
@RedisHash("rooms")
@Data
public class Room {
@Id
private final String id;
private final String name;
@Reference
private final List<User> participants;
...
}
User.java
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
@RedisHash("users")
@Data
public class User {
@Id
private final Long id;
private final String username;
...
}
Теперь я хочу реализовать joinRoom(String roomId, User user)
метод, который должен добавить данного пользователя в набор участников комнаты.
Моей первой попыткой было понравиться это:
- прочитайте текущую комнату
- если в списке участников комнаты нет пользователя, добавьте его
- сохраните комнату
Я думаю, что это решение кричит о плохой идее, так как приложение будет работать параллельно на нескольких узлах, и увидеть здесь состояние гонки-только вопрос времени.
Он подумал, что я мог бы использовать Partialupdate, но не могу ничего найти, если можно добавить во встроенные списки, наборы или что-то подобное.
Любая помощь будет признательна. Спасибо!
Ответ №1:
Если вы используете Redisson в качестве клиента Redis, вам следует взглянуть на реализацию RLock, которую можно получить от клиента.
Повторные блокировки подходят для распределенного варианта использования.
Комментарии:
1. Хорошо, спасибо! Я посмотрю на это.