Redis似乎没有任何与关系数据库中的“表”相对应的实体。
例如,我必须存储:
(token, user_id)
(cart_id, token, [{product_id, count}])
Run Code Online (Sandbox Code Playgroud)
如果不将这两者分开存储,则该get方法会从两者中搜索,这会造成混乱。
顺便说一句,(cart_id, token, [{product_id, count}])是购物车,redis中如何设计这样的数据结构?
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。AsINCR返回新值,您只需调用 increment 并获取新 ID,get cartid:counter如果您想快速查看已创建的购物车数量,它将始终为您提供最大的 ID。有点整洁,海事组织。
现在,棘手的地方在于,如果您想使用过期时间来自动使购物车过期,而不是让它们“躺着”直到您想要清理东西。通过设置购物车哈希(具有产品、计数映射)的过期时间,您的购物车将自动过期。但是,他们的参考文献仍将在token:to:cart散列中挂出。删除它是一个简单的周期性任务,它处理 的成员token:to:cart并exists检查购物车的密钥。如果它不存在,则从哈希中删除它。
Redis 是一个键值存储。来自redis.io:
Redis 是一个开源(BSD 许可)内存数据结构存储,用作数据库、缓存和消息代理。它支持数据结构,例如字符串、散列、列表、集合、具有范围查询的排序集、位图、超级日志和具有半径查询的地理空间索引。
因此,如果您想存储两种不同的类型(tokens 和carts),您将需要为不同的数据类型存储两个键。例如:
127.0.0.1:6379> hset tokens.token_id@123 user user123
(integer) 1
127.0.0.1:6379> hget tokens.token_id@123 user
"user123"
Run Code Online (Sandbox Code Playgroud)
其中tokens是仅用于令牌的命名空间。它存储为 Redis-Hash:
Redis 哈希是字符串字段和字符串值之间的映射,因此它们是表示对象的完美数据类型
要存储列表,我会执行以下操作:
127.0.0.1:6379> hmset carts.cart_1 token token_id@123 cart_contents cart_contents_key1
OK
127.0.0.1:6379> hmget carts.cart_1 token cart_contents
1) "token_id@123"
2) "cart_contents_key1" # cart_contents is a list of receipts.
Run Code Online (Sandbox Code Playgroud)
cart_contents表示为 Redis-List:
127.0.0.1:6379> rpush cart_contents.cart_contents_key1 receipt_key1
(integer) 1
127.0.0.1:6379> lrange cart_contents.cart_contents_key1 0 -1
1) "receipt_key1"
Run Code Online (Sandbox Code Playgroud)
收据是元组 ( product_id, count) 的 Redis-Hash:
127.0.0.1:6379> hmset receipts.receipt_key1 product_id 43 count 2
OK
127.0.0.1:6379> hmget receipts.receipt_key1 product_id count
1) "43" # Your final product id.
2) "2"
Run Code Online (Sandbox Code Playgroud)
但在这种情况下你真的需要 Redis 吗?
| 归档时间: |
|
| 查看次数: |
4527 次 |
| 最近记录: |