1

我创建了两个模板,我有扩展模板 De 用户 (AbsctractUser) 和带有字段 total_score 的模板 (Score)。

从我对带有redis的django缓存的理解来看,只要不修改该行,redis就会将信息保存在缓存中。

total_score 字段将定期更新,例如每 10 分钟 100 次,如果添加到 AbstractUser 模板中,这将强制 redis 在每次页面更改(视图)时定期更新用户的缓存,而如果我创建第二个 Score 模板使用 OnetoOne 关系,该关系将仅在相关的 2 个页面上更新,或者视图加载 Score 模型。

或者我可以直接将字段 total_score 放在我的抽象用户中并定期更新。但对我来说,我失去了抽象用户模型的 redis 效率。我想知道我的推理是否正确...

我能读到的是,OnetoOne 对于扩展已经存在的表很有用,但是对于创建新项目,必须避免 OnetoOne,并直接在模型中添加字段。所以我一头雾水。先感谢您。

例子 :

适合 redis 缓存 (score_user) 更新行 score_user 的频繁更新:

class User(AbstractUser):

    name = CharField(_("Last name of User"), blank=True, max_length=255)
    forename = CharField(_("First name of User"), blank=True, max_length=255)

class Score(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE,primary_key=True)
    score_user = models.PositiveIntegerField(default=0)

VS

class User(AbstractUser):

    name = CharField(_("Last name of User"), blank=True, max_length=255)
    forename = CharField(_("First name of User"), blank=True, max_length=255)
    score_user = models.PositiveIntegerField(default=0)
4

2 回答 2

2

将您的分数字段与用户分开,因为标准化您的数据库架构。它取决于您希望查看详细信息用户和分数必须显示在同一页面上的情况,并且您需要一些性能然后使用抽象用户。进行 1 次查询,您将获得一切。

您已经提到,使用抽象用户会降低性能,然后使用 onetoone 关系。

您还可以在 redis 中制作单独的哈希或分数字符串来更新分数字段。不要更新用户会话哈希。

但是非规范化提高了性能。

于 2020-03-15T19:39:02.577 回答
1

两种方法都可以工作,有几种方法可以是 1. 为缓存传递自定义键,其中不包括 update_at 参数,您可以传递名称和名字的哈希

  1. 仅当这些字段更新时,您才能使保存后挂钩中的密钥无效,否则忽略
于 2020-03-15T18:18:58.870 回答