Redis 的 hash(哈希类型) 数据类型与结构和应用场景 您所在的位置:网站首页 redis存储hash Redis 的 hash(哈希类型) 数据类型与结构和应用场景

Redis 的 hash(哈希类型) 数据类型与结构和应用场景

2023-12-10 08:04| 来源: 网络整理| 查看: 265

Hash 数据类型与结构 一、Hash 类型介绍

Redis hash数据结构 是一个键值对(key-value)集合,它是一个 string 类型的 field 和 value 的映射表,redis 本身就是一个 key-value 型数据库,因此 hash 数据结构相当于在 value 中又套了一层 key-value 型数据。所以 redis 中 hash 数据结构特别适合存储关系型对象。比如用来存储学生基本信息,或者用户信息等。

常用命令

hmset 命令

描述:用于同时将多个 field-value (字段-值)对设置到哈希表中。假如hash表中已经存在 field,则会对其进行覆盖。如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作。

命令使用:[hmset 命令] [key 表名] [field 名称] [value值] [field 名称] [value值] ...

127.0.0.1:6379> hmset users id 1 username starsky age 18 sex 1 OK 127.0.0.1:6379>

hmget 命令

描述:用于返回 hash 表中 field 字段对应的值,如果 field 不存在,那么返回 nil 值。

命令使用:[hmget 命令] [key 表名] [field 名称] [field 名称] ...

127.0.0.1:6379> hmget users id username age sex 1) "1" 2) "starsky" 3) "18" 4) "1" 127.0.0.1:6379>

hset 命令

描述:对 hash 表中 field 对应的value进行赋值,如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。

命令使用:[hset 命令] [key 表名] [field 名称] [value 值]

127.0.0.1:6379> hset users address gd (integer) 1 127.0.0.1:6379> hset users sex 0 (integer) 0 127.0.0.1:6379> hmget users id username age sex address 1) "1" 2) "starsky" 3) "18" 4) "0" 5) "gd" 127.0.0.1:6379>

hvals 命令

描述:用于返回哈希表所有 field 对应的值。

命令使用:[hvals 命令] [key 表名]

127.0.0.1:6379> hvals users 1) "1" 2) "starsky" 3) "18" 4) "0" 5) "gd" 127.0.0.1:6379>

hdel 命令

描述:用于删除指定哈希表中的一个或多个field,不存在的field将被忽略。

命令使用:[hdel 命令] [key 表名] [field 名称] ...

127.0.0.1:6379> hdel users sex address (integer) 2 127.0.0.1:6379> hvals users 1) "1" 2) "starsky" 3) "18" 127.0.0.1:6379>

hgetall 命令

描述:用于返回哈希表中,所有的字段和值。

命令使用:[hgetall 命令] [key 表名]

127.0.0.1:6379> hgetall users 1) "id" 2) "1" 3) "username" 4) "starsky" 5) "age" 6) "18" 127.0.0.1:6379>

Hash 类型应用场景 一、购物车

购物车功能主要是通过用户点击商品添加到购物车,前端会传递商品id以及用于需要购买的数据到后端,php 通过前端传递的参数进而完成购物车的添加,增加或者减少购物车购买数量,删除或者清空购物车等功能。

如果说是使用redis来做我们可以以用户 id 为 key,商品 id 为 field,商品数量为 value,恰好构成了购物车的3个要素。

如:

[命令] [购物车用户:ID] [产品:ID] [数量] 127.0.0.1:6379> hmset shopcartuser:1 product:1 2 OK 127.0.0.1:6379> hmget shopcartuser:1 product:1 1) "2" 127.0.0.1:6379>

二、存储对象

hash 类型的 (key, field, value) 的结构与对象的(对象id, 属性, 值)的结构相似,也可以用来存储对象。

在介绍string类型的应用场景时有所介绍,string + json 也是存储对象的一种方式,那么存储对象时,到底用 string + json 还是用 hash 呢?

两种存储方式的对比如下表所示:

String + jsonHash效率很高高容量低低灵活性低高序列化简单复杂

当对象的某个属性需要频繁修改时,不适合用 string+json,因为它不够灵活,每次修改都需要重新将整个对象序列化并赋值,如果使用 hash 类型,则可以针对某个属性单独修改,没有序列化,也不需要修改整个对象。比如,商品的价格、销量、关注数、评价数等可能经常发生变化的属性,就适合存储在hash类型里。

当然,不常变化的属性存储在 hash 类型里也没有问题,比如商品名称、商品描述、上市日期等。但是,当对象的某个属性不是基本类型或字符串时,使用 hash 类型就必须手动进行复杂序列化,比如,商品的标签是一个标签对象的列表,商品可领取的优惠券是一个优惠券对象的列表等,即使以 coupons(优惠券)作为 field,value 想存储优惠券对象列表也还是要使用 json 来序列化,这样的话序列化工作就太繁琐了,不如直接用 string + json 的方式存储商品信息来的简单。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有