如何将值添加到 Spring Data Redis 中的嵌入集

Posted

技术标签:

【中文标题】如何将值添加到 Spring Data Redis 中的嵌入集【英文标题】:How can I add values to an embedded set in Spring Data Redis 【发布时间】: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,但如果可以附加到嵌入式列表、集合或类似内容,则找不到任何东西。

感谢任何帮助。谢谢!

【问题讨论】:

【参考方案1】:

如果您使用 Redisson 作为 Redis 客户端,您应该查看来自客户端的RLock 实现。

Redisson 锁适合分布式用例。

【讨论】:

很好,谢谢!我去看看。

以上是关于如何将值添加到 Spring Data Redis 中的嵌入集的主要内容,如果未能解决你的问题,请参考以下文章

Spring-data-redis 的实现原理

spring-data-redis 可以实现消息队列吗

spring-data-redis 怎么监听消息队列有消息来了

Spring-data-redis + Lettuce 如何使用 Pipeline

spring boot -spring data-redis

spring-session-data-redis使用redis共享session