Dieser Artikel wird Ihnen helfen, den Hash-Datentyp in Redis zu verstehen und die grundlegenden Operationen von Hash-Typ-Daten vorzustellen. Ich hoffe, er wird Ihnen hilfreich sein!
Schauen wir uns zuerst dieses Beispiel an
Im vorherigen Abschnitt haben wir etwas über den String-Speichertyp gelernt. Wenn jedoch für die Speicherung von Objektdaten häufig Aktualisierungsanforderungen erforderlich sind, ist der Vorgang umständlich. Zum Beispiel: user:id:100 -> {"id":100,"name":"Frühlingsfestgala","fans":12355,"blogs":99,"focus:83 Code> Wenn Sie lokale Daten in einem Objekt aktualisieren müssen, müssen Sie alle Daten ersetzen. Daher gelten die folgenden Anforderungen: <a href="http://www.php.cn/course/.%20list/54.html.%20" target="_blank">Redis-Video-Tutorial</a>]<code>user:id:100 -> {"id":100,"name":"春晚","fans":12355,"blogs":99,"focus:83}
,如果需要更新一个对象中的局部数据,就需要替换掉所有数据,于是有了以下的需求。【相关推荐:Redis视频教程】
新的需求:对一系列存储的数据进行编组,方便管理,比如存储一个对象的信息需要的存储结构:一个存储空间保存多个键值对数据
如下图:
为了解决这个问题,我们引入新的数据类型:hash
。同时 hash 存储结构也做了以下优化
hset key field value
# 查询单个字段数据 hget key field # 查询所有数据 hgetall key
hdel key field1 [field2]
hmset key field1 value1 field2 value2
hmget key field1 field2
hlen key
hexists key field
hkey key hvals key
hincrby key field increment hincrbyfloat key field increment
hash 类型数据操作注意事项
hash 类型下的 value 只能存储字符串,不允许存储其他数据类型,不存在嵌套对象。如果数据未获取到,对应的结果为(nil);
每个 hash 可以存储 2 的 32 次方减 1 个键值对;
hash 类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性,但 hash 设计初衷不是为了存储大量对象而设计,切记不可滥用,更不可以将 hash 作为对象列表使用;
hgetall 操作可以获取全部属性,如果内部 field 过多,遍历整个数据效率会很低,有可能成为数据访问瓶颈。
概述
在这里我们不讨论购物车与数据库间的持久化同步,也不讨论购物车与订单之间的关系,同时忽略未登录用户购物车信息存储。我们仅仅用 redis 的存储模型来 对购物车 的条目进行 添加、浏览、更改数量、删除、清空
实现方案
示例代码如下:
# 001 用户购买 ID为101商品 100件,ID为102的商品 200件 hmset 001 101 100 102 200 # 002 用户购买 ID为102商品 1件,ID为104的商品 7件 hmset 002 102 1 104 7
商品信息加速
当前仅仅是将数量存储到 redis 中,并没有起到加速作用,因为商品信息还需要查询数据库。可以使用以下方案解决:
每条购物车中的商品信息记录保存为两个 field
命名格式:商品 id:nums 保存数据:数值
命名格式:商品 id:info 保存数据:json
示例代码如下:
# 001 用户 购买 ID为101的商品 2件,商品的信息为:{"name":"good name"} hmset 001 101:num 2 101:info "{\"name\":\"goods name\"}" # 002 用户 购买 ID为101的商品 1件,商品的信息为:{"name":"good name"} hmset 002 101:num 1 101:info "{\"name\":\"goods name\"}"
在上面的101:info
对应的值中,字符串包含了空格,所以用双引号引用起来,达到转义的目的。
商品信息独立保存
由于 field2 可能在多条商品记录中存在,因此 field2 里的数据可保存到独立的 hash。此时,如果每添加一条购物车记录,就保存一次 hash 数据,显然是不合理的,可以通过hsetnx
hash
. Am Gleichzeitig wurde auch die Hash-Speicherstruktur erstellt. Die folgende Optimierung:🎜hsetnx key field value
# 将id为101 的商品独立存起来 hsetnx info 101 "{\"name\":\"goods name\"}"
# p01商家下,c30充值券1000张,c50充值券1000张,c100充值券1000张 hmset p01 c30 1000 c50 1000 c100 1000
# p01商家,商品c30售出1件 hincrby p01 c30 -1 # p01商家,商品c100售出20件 hincrby p01 c100 -20
101:info
oben entspricht, enthält die Zeichenfolge Leerzeichen und wird daher in doppelte Anführungszeichen gesetzt, um den Zweck zu erreichen entkommen. 🎜🎜Produktinformationen werden unabhängig gespeichert🎜🎜Da Feld2 in mehreren Produktdatensätzen vorhanden sein kann, können die Daten in Feld2 in einem unabhängigen Hash gespeichert werden. Derzeit ist es offensichtlich nicht sinnvoll, die Hash-Daten jedes Mal zu speichern, wenn ein Warenkorbdatensatz hinzugefügt wird. Sie können die Daten über die Operation hsetnx
speichern. Wenn die Daten vorhanden sind, wird der Speichervorgang nicht ausgeführt durchgeführt. 🎜🎜Das Befehlsformat ist wie folgt🎜rrreee🎜Das Codebeispiel ist wie folgt🎜# 将id为101 的商品独立存起来 hsetnx info 101 "{\"name\":\"goods name\"}"
案例:双 11 活动日,销售手机充值卡的商家对移动、联通、电信的 30 元、50 元、100 元商品推出抢购活动,每种商品的抢购上限为 100。
解决方案
实现过程
商品初始信息
# p01商家下,c30充值券1000张,c50充值券1000张,c100充值券1000张 hmset p01 c30 1000 c50 1000 c100 1000
当 c30 售出1件时,值减 1; 当 c100 售出 20 件时,值减 20,如下代码
# p01商家,商品c30售出1件 hincrby p01 c30 -1 # p01商家,商品c100售出20件 hincrby p01 c100 -20
string 存储 json 字符串:读取方便,在更新的时候会整体进行更新
hash 存对象具体的字段:更新灵活
引入 hash 数据类型之后,我们就解决了 string 存储对象,更新对象时需要整体更新的问题。
更多编程相关知识,请访问:编程入门!!
Das obige ist der detaillierte Inhalt vonLassen Sie uns über den Hash-Datentyp in Redis und seine Bedienung sprechen.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!