Как я могу добавить значения во встроенный набор в Spring Data Redis

#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. Хорошо, спасибо! Я посмотрю на это.