Spring boot 如何在SpringBoot2.0中将Redis用作数据库来映射两个实体之间的关系?

Spring boot 如何在SpringBoot2.0中将Redis用作数据库来映射两个实体之间的关系?,spring-boot,redis,spring-data-redis,Spring Boot,Redis,Spring Data Redis,我有两个实体,即用户和身份验证令牌。对于每个用户,我都会生成一个JWT令牌,并将其存储在Redis缓存中,用于会话管理。我应该如何映射它,将用户id作为密钥,将令牌对象作为值? 我还将为一个用户提供多个令牌(最多2个),一个用于web,一个用于移动,因此将用户id作为密钥不是一个好的解决方案。 在Redis中映射这一点的正确方法是什么?我觉得,根据您的要求,您可以使用用户id和令牌类型的组合作为键,并将AuthenticationToken object作为值 要生成密钥,您可以附加用户id和令

我有两个实体,即用户身份验证令牌。对于每个用户,我都会生成一个JWT令牌,并将其存储在Redis缓存中,用于会话管理。我应该如何映射它,将用户id作为密钥,将令牌对象作为值? 我还将为一个用户提供多个令牌(最多2个),一个用于web,一个用于移动,因此将用户id作为密钥不是一个好的解决方案。
在Redis中映射这一点的正确方法是什么?

我觉得,根据您的要求,您可以使用用户id和令牌类型的组合作为键,并将AuthenticationToken object作为值

要生成密钥,您可以附加用户id和令牌类型,如下所示:

用户id==>10
令牌类型==>web/mobile

所以键将是10\u web/10\u mobile

我不太清楚AuthenticationToken对象中的内容。如果您需要任何与用户实体相关的内容,您可以在保存到
Redis
时在AuthenticationToken对象中添加该细节,方法是将属性或整个用户对象附加为带有注释的属性(如果您没有将用户实体链接到AuthenticationToken对象)

更新:我正在为
User
AuthenticationToken
添加一个示例实体关系,它可能会帮助您理解我想说的内容

用户实体

import javax.persistence.*;
import java.io.Serializable;

@Entity(name = "user")
public class User implements Serializable {

    @Id
    @GeneratedValue
    private Long userID;

    //Getters, Setters and other properties
}
令牌类型枚举(用于区分web/mobile令牌)

AuthenticationToken实体

import javax.persistence.*;
import java.io.Serializable;

@Entity(name = "user")
public class User implements Serializable {

    @Id
    @GeneratedValue
    private Long userID;

    //Getters, Setters and other properties
}
1.如果您还想在数据库中存储
User
AuthenticationToken
的链接,那么您可以使用以下实体:

import javax.persistence.*;
import java.io.Serializable;

@Entity(name = "authenticationtoken")
public class AuthenticationToken implements Serializable {

    @Id
    @GeneratedValue
    private Long id;

    @Column(unique = true)
    private String jwtToken;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user", referencedColumnName = "userID")
    private User user;

    @Column
    @Enumerated(EnumType.STRING)
    private TokenType tokenType;

    // Getters, Setters and other properties

}
import javax.persistence.*;
import java.io.Serializable;

@Entity(name = "authenticationtoken")
public class AuthenticationToken implements Serializable {

    @Id
    @GeneratedValue
    private Long id;

    @Column(unique = true)
    private String jwtToken;

    @Transient
    private User user;

    @Column
    @Enumerated(EnumType.STRING)
    private TokenType tokenType;

    // Getters, Setters and other properties

}
2.如果您不想在数据库中存储
User
AuthenticationToken
的链接,并且希望在JWT token中有详细信息,那么您可以使用以下实体:

import javax.persistence.*;
import java.io.Serializable;

@Entity(name = "authenticationtoken")
public class AuthenticationToken implements Serializable {

    @Id
    @GeneratedValue
    private Long id;

    @Column(unique = true)
    private String jwtToken;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user", referencedColumnName = "userID")
    private User user;

    @Column
    @Enumerated(EnumType.STRING)
    private TokenType tokenType;

    // Getters, Setters and other properties

}
import javax.persistence.*;
import java.io.Serializable;

@Entity(name = "authenticationtoken")
public class AuthenticationToken implements Serializable {

    @Id
    @GeneratedValue
    private Long id;

    @Column(unique = true)
    private String jwtToken;

    @Transient
    private User user;

    @Column
    @Enumerated(EnumType.STRING)
    private TokenType tokenType;

    // Getters, Setters and other properties

}
因此,如果您想为一个用户维护最多2个令牌(一个用于web,一个用于移动),您可以在生成新令牌之前以及在验证时,在Redis/数据库中按用户和令牌类型获取

希望它能帮助你:)