Redis:如何像多表一样使用它

Redis:如何像多表一样使用它,redis,Redis,在关系数据库中,Redis似乎没有任何与“表”对应的实体 例如,我必须存储: (token, user_id) (cart_id, token, [{product_id, count}]) 如果不将这两个存储区分开,则get方法将从这两个存储区中搜索,这将导致混乱 顺便问一下,(购物车id,令牌,[{product\u id,count}])是一个购物车,如何在redis中设计这样的数据结构?redis是一个键值存储。发件人: Redis是一种开源(BSD许可)内存数据结构 存储,用作数

在关系数据库中,Redis似乎没有任何与“表”对应的实体

例如,我必须存储:

(token, user_id) 

(cart_id, token, [{product_id, count}])
如果不将这两个存储区分开,则
get
方法将从这两个存储区中搜索,这将导致混乱


顺便问一下,
(购物车id,令牌,[{product\u id,count}])
是一个购物车,如何在redis中设计这样的数据结构?

redis是一个键值存储。发件人:

Redis是一种开源(BSD许可)内存数据结构 存储,用作数据库、缓存和消息代理。它支持数据 结构,例如字符串、哈希、列表、集合、排序集合 范围查询、位图、hyperloglogs和地理空间索引 radius查询

因此,如果要存储两种不同的类型(
token
s和
cart
s),则需要为不同的数据类型存储两个键。例如:

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" 
其中,
tokens
是仅用于标记的命名空间。它存储为Redis哈希:

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.
购物车内容
表示为Redis列表:

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"
收据是元组的Redis散列(
product\u id
count
):

但在这种情况下,你真的需要Redis吗

在关系数据库中,Redis似乎没有任何与“表”对应的实体

对,因为它不是关系数据库。这是一个数据结构服务器,它与其他服务器非常不同,需要使用不同的方法

最终,要按照预期的方式使用Redis,您不需要考虑关系,而需要考虑代码中使用的数据结构。更具体地说,当您想要使用数据时,您如何需要它?这将是最有可能将其存储在Redis中的方法

在本例中,有几个选项,但是哈希方法对这个非常有效,所以我将在这里详细介绍它

首先,创建一个散列,称之为
users:to:tokens
。将用户id和令牌的值作为密钥存储在哈希表中。下一步,创建一个名为“tokens:to:users”的哈希值。你可能想要这两个——从另一个看一个-这个基础会提供。

下一步,你的手推车。这也是一个散列:
carts:cart\u id
。在这个散列中,您有产品标识和计数

最后是您的第三个hash
token:to:cart
,它将令牌的索引构建到购物车id。我会更进一步,执行
user:to:cart
,以便能够按用户拉购物车

至于是否将注释记号存储在地图中,我倾向于选择“否”。只需存储ID,您就可以轻松构建Redis购物车密钥,而不必将密钥的完整路径存储在数据存储中,从而节省内存使用

实际上,如果您可以这样做,请对所有ID使用整数。通过使用整数,您可以利用Redis的整数存储优化来降低内存使用率。存储整数的散列运算效率很高,速度也很快

如果需要,您可以使用Redis构建您的ID。您可以使用
INCR
命令为每种数据类型构建计数器,例如
userid:counter
cartid:counter
tokenid:counter
。当
INCR
返回新值时,您只需调用一次increment就可以获得新的ID,
get cartid:counter
将始终为您提供最大的ID,如果您想快速查看创建了多少个Cart。我觉得挺不错的


现在,棘手的是,如果您想使用expiration自动使Cart过期,而不是让它们“躺在那里”直到您想清理东西。通过在购物车哈希(包含产品、计数映射)上设置过期时间,您的购物车将自动过期。但是,它们的引用仍将挂在
token:to:cart
hash中。删除这是一个简单的周期性任务,它处理
令牌:to:cart
的成员,并对cart的密钥执行
exists
检查。如果它不存在,请将其从哈希中删除。

查看:我的答案被低估了。谢谢!
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"