好像Redis在关系型数据库中没有对应“表”的实体。
对,因为它不是关系数据库。它是一个非常不同的数据结构服务器,需要不同的方法才能很好地使用。
最终要以预期的方式使用 Redis,您需要不考虑关系术语,而是考虑您在代码中使用的数据结构。更具体地说,当您想要使用数据时,您如何需要数据?这将是最有可能将其存储在 Redis 中的方式。
在这种情况下,有几个选项,但哈希方法非常适合这个,所以我会在这里详细说明。
首先,创建一个哈希,命名为users:to:tokens。将用户 ID 作为键存储在散列中,并将值作为令牌存储。接下来创建逆,一个名为“tokens:to:users”的哈希。您可能会同时需要这两者 - 能够从另一个中查找一个 - 而这个基础将提供这一点。
接下来,为您的购物车。这也将是一个哈希:carts:cart_id。在此哈希中,您有 product_id 和计数。
最后是您的第三个哈希token:to:cart,它为购物车 id 构建了一个标记索引。我会更进一步,做user:to:cart 以便能够按用户拉车。
现在关于是否将主题演讲存储在地图中,我倾向于选择“否”。通过仅存储 ID,您可以轻松构建 Redis 购物车密钥,而无需将密钥的完整路径存储在数据存储中,也可以节省内存使用量。
确实,如果可以的话,请为所有 ID 使用整数。通过使用整数,您可以利用 Redis 的整数存储优化来降低内存使用率。存储整数的哈希非常高效且非常快速。
如果需要,您可以使用 Redis 来构建您的 ID。您可以使用INCR 命令为userid:counter、cartid:counter 和tokenid:counter 等每种数据类型构建一个计数器。当INCR 返回新值时,您只需调用一次即可递增并获取新 ID,如果您想快速查看已创建的购物车数量,get cartid:counter 将始终为您提供最大的 ID。有点整洁,IMO。
现在,棘手的地方在于,如果您想使用过期来自动使购物车过期,而不是让它们“闲逛”直到您想清理它们。通过在购物车哈希(具有产品、计数映射)上设置过期时间,您的购物车将自动过期。但是,他们的引用仍将挂在 token:to:cart 哈希中。删除它是一个简单的周期性任务,它处理token:to:cart 的成员并对购物车的键进行exists 检查。如果它不存在,则从哈希中删除它。