如何为 Redis 中的数据建模以获得复杂的数据结构?

PAA*_*PAA 5 spring redis jedis spring-data-redis spring-boot

我参考了链接:http://panuoksala.blogspot.com/2015/09/redis-many-to-many.html来开发下面的代码。我已经实现了一些代码,看起来到目前为止什么都无法实现

获取用户1组:

hget User:1 Groups
Run Code Online (Sandbox Code Playgroud)

不产生结果。

我想从数据建模的角度获得更多答案。我已经对如下代码进行了建模,但它没有按照我的要求工作 -

组.java

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@RedisHash("groups")
public class Group {
    @Id
    private Long groupId;
    private String name;

    private List<User> users;
}
Run Code Online (Sandbox Code Playgroud)

和用户.java

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@RedisHash("users")
public class User {
    @Id
    private Long userId;
    private String name;
    List<Group> groups;
}
Run Code Online (Sandbox Code Playgroud)

用户组测试.java

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class UserGroupTest extends RepositoryTestSupport{
    @Autowired UserRepository userRepository;
    @Autowired GroupRepository groupRepository;

    @Before
    public void setUp() {

        // User -> Group relations 
        Group group1 = Group.builder().groupId(1L).name("Nature-Group").build();
        Group group2 = Group.builder().groupId(2L).name("Music-Group").build();
        Group group3 = Group.builder().groupId(3L).name("Sports-Group").build();

        User user1 = User.builder().userId(1L).name("John").groups(Arrays.asList(group1, group2)).build();
        User user2 = User.builder().userId(2L).name("Sally").groups(Arrays.asList(group2, group3)).build();
        User user3 = User.builder().userId(3L).name("Chris").groups(Arrays.asList(group3)).build();

        userRepository.save(user1);
        userRepository.save(user2);
        userRepository.save(user3);


        // second contains Group -> User
        User myuser1 = User.builder().userId(1L).name("John").build();
        User myuser2 = User.builder().userId(2L).name("Sally").build();
        User myuser3 = User.builder().userId(3L).name("Chris").build();

        Group mygroup1 = Group.builder().groupId(1L).name("Nature-Group").users(Arrays.asList(myuser1)).build();
        Group mygroup2 = Group.builder().groupId(2L).name("Music-Group").users(Arrays.asList(myuser1, myuser2)).build();
        Group mygroup3 = Group.builder().groupId(3L).name("Sports-Group").users(Arrays.asList(myuser2, myuser3)).build();

        groupRepository.save(mygroup1);
        groupRepository.save(mygroup2);
        groupRepository.save(mygroup3);
    }

    @Test
    public void test() {

    }
}
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我们可以使用两个不同的集合来跟踪关系。

首先,我们将用户和组存储到集合中。然后我们将关系存储到两个单独的哈希“结构”中。第一个包含用户 -> 组关系,第二个包含组 -> 用户关系。

在此输入图像描述

127.0.0.1:6379> HGET users:1 groups
(nil)
127.0.0.1:6379> HGET users:1 Groups
(nil)
127.0.0.1:6379> HGET users:1 Group
(nil)
Run Code Online (Sandbox Code Playgroud)

如何对 POJO 类进行建模以便实现所有这些结果?

hmset User:1 Groups 1,2  (Store user to database)
hmset Group1 Users 1      (Store group to database)

Get User 1 groups:
hget User:1 Groups

Remove user from group:
hmset User:1 Group ""
hmset Group:1 Users: ""
Run Code Online (Sandbox Code Playgroud)