Database design 我应该做一个检查还是只是在Redis中设置一个记录?

Database design 我应该做一个检查还是只是在Redis中设置一个记录?,database-design,redis,Database Design,Redis,当用户播放我的应用程序时,我会将他们的会话保存到每日、每周、每月和所有时间表中。我想知道在插入之前,查看用户是否已经在表中是否明智。假设它们不在表中,则需要以另一种方式进行读写操作,而不管是哪种方式,只需进行一次写操作。这基本上取决于您的要求。 由于缺乏信息,我假设当你说每日、每周、每月和所有时间表时,你指的是TTL值 然后有两种情况 如果用户最近一次访问,则必须延长密钥的到期时间 因此,如果您需要覆盖这些密钥的TTL,则不需要读取(如果用户最近的访问必须延长密钥的到期时间) 后续访问不得更改T

当用户播放我的应用程序时,我会将他们的会话保存到每日、每周、每月和所有时间表中。我想知道在插入之前,查看用户是否已经在表中是否明智。假设它们不在表中,则需要以另一种方式进行读写操作,而不管是哪种方式,只需进行一次写操作。

这基本上取决于您的要求。 由于缺乏信息,我假设当你说每日、每周、每月和所有时间表时,你指的是TTL值

然后有两种情况

  • 如果用户最近一次访问,则必须延长密钥的到期时间
  • 因此,如果您需要覆盖这些密钥的TTL,则不需要读取(如果用户最近的访问必须延长密钥的到期时间)

  • 后续访问不得更改TTL
  • 否则,如果会话到期时间必须保持不变(从第一次访问开始),则必须使用GET读取设置前是否存在该值。根据并发性要求,这两个操作可以是原子操作,也可以不是原子操作


    p.S.如前所述,此答案基于一些假设。请分享有关您的关键结构的更多详细信息

    抱歉,缺少信息。我没有使用TTL,我使用的是4个不同的表:d、w、m和a。当用户启动应用程序时,我只需将他们的会话插入4个位置。我有一个cron设置,每晚午夜运行,它只会删除players:d表,如果是本周第一天,它会删除players:w和本月第一天players:m。让我确认一件事,你正在使用Redis,对吗?如果您正在使用它,那么我建议您研究一下按键的TTL功能。在任何情况下,这都取决于需求。您需要问自己一个问题,这些会话值是否会受到以后访问的影响?从您的评论来看,它们似乎不存在,而您的cron作业设置实际上消除了检查(因为您没有设置TTL)它是否已经存在的需要。所以你可以简单地把钥匙放在世界上而不必担心是的,我用的是Redis。我对一些记录使用TTL,但我没有测试TTL的性能,而只是删除整个表。我假设TTL需要更多的服务器负载,但我可能错了。在我看来,一个cron任务只是删除散列键似乎会更好。会话值每次都是相同的,所以我不在乎它是否每次都覆盖它。据我所知,TTL没有重载,它还提供对键的更好控制。但正如您所知,它的持续时间。如果我建议您可以使用sessionid作为键,并带有一些前缀和必需的TTL和伪值,那么一切都会自行处理。我运行了一些基准测试,发现这实际上取决于您的情况。例如,如果您认为大多数用户都会返回用户,那么进行检查会更快。但是,如果您不确定返回用户的百分比,那么只进行插入会更快。至于TTL,我选择使用cron来删除daily表。这仅仅是一个redis调用,它使我不必在每条记录上计算和设置正确的TTL。