【发布时间】:2021-08-29 07:01:40
【问题描述】:
我正在编写一个类似聊天的小型应用程序,它基本上有两个实体“房间”和“用户”。数据存储在 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) 方法,它应该将给定的用户附加到房间的参与者集中。
我的第一次尝试是这样的:
- 读取当前房间
- id房间的参与者列表不包含用户,添加它
- 保存房间
我认为这个解决方案是个坏主意,因为应用程序将在多个节点上并行运行,在这里看到竞争条件只是时间问题。
我认为我可以使用Partialupdate,但如果可以附加到嵌入式列表、集合或类似内容,则找不到任何东西。
感谢任何帮助。谢谢!
【问题讨论】:
标签: java spring spring-boot spring-data spring-data-redis