暂时未有相关云产品技术能力~
前言我们都知道 Redis 提供了丰富的数据类型,常见的有五种:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。今天我们就来详细的聊聊 Redis 这五大常见的数据类型之一 Hash;结构类型结构存储的值结构读写能力Hash包含键值对的无序散列表;添加,获取,删除单个元素;应用场景:缓存对象、购物车等。 概述简介Hash 是一个键值对(key-value)集合,其中 value 的形式如: value=[{field1,value1},...{fieldN,valueN}]。Hash 特别适合用于存储对象。Hash 与 String 对象的区别如下图所示:内部实现Hash 类型的底层数据结构是由压缩列表或哈希表实现的:如果哈希类型元素个数小于 512 个(默认值,可由 hash-max-ziplist-entries 配置),所有值小于 64 字节(默认值,可由 hash-max-ziplist-value 配置)的话,Redis 会使用压缩列表作为 Hash 类型的底层数据结构;如果哈希类型元素不满足上面条件,Redis 会使用哈希表作为 Hash 类型的底层数据结构。在最新 Redis 版本中,压缩列表数据结构已经废弃了,交由 listpack 数据结构来实现了。 常用命令# 存储一个哈希表 key 的键值 # HSET key field value [field value ...] 127.0.0.1:6379> HSET usr1 name sid10t (integer) 1 127.0.0.1:6379> HSET usr1 name sid10t age 19 (integer) 1 # 获取哈希表 key 对应的 field 键值 # HGET key field 127.0.0.1:6379> HGET usr1 name "sid10t" # 在一个哈希表 key 中存储多个键值对 # HMSET key field value [field value...] 127.0.0.1:6379> HMSET usr2 name sidiot age 18 OK # 批量获取哈希表 key 中多个 field 键值 # HMGET key field [field ...] 127.0.0.1:6379> HMGET usr2 name age 1) "sidiot" 2) "18" # 删除哈希表 key 中的 field 键值 # HDEL key field [field ...] 127.0.0.1:6379> HDEL usr1 age (integer) 1 127.0.0.1:6379> HDEL usr2 name age (integer) 2 # 返回哈希表 key 中 field 的数量 # HLEN key 127.0.0.1:6379> HLEN usr1 (integer) 1 127.0.0.1:6379> HLEN usr2 (integer) 0 # 返回哈希表 key 中所有的键值 # HGETALL key 127.0.0.1:6379> HGETALL usr1 1) "name" 2) "sid10t" 127.0.0.1:6379> HGETALL usr2 (empty array) # 为哈希表 key 中 field 键的值加上增量 increment # HINCRBY key field increment 127.0.0.1:6379> HINCRBY usr1 age 1 (integer) 19 # 判断哈希表中指定的 field 是否存在 # HEXISTS key field 127.0.0.1:6379> HEXISTS usr1 name (integer) 1 127.0.0.1:6379> HEXISTS usr1 info (integer) 0 # 获取哈希表中的所有 field # HKEYS key 127.0.0.1:6379> HKEYS usr1 1) "name" 2) "age" 127.0.0.1:6379> HKEYS usr2 (empty array) # 获取哈希表中的所有 value # HVALS key 127.0.0.1:6379> HVALS usr1 1) "sid10t" 2) "19" 127.0.0.1:6379> HVALS usr2 (empty array) 应用场景缓存对象Hash 类型的 (key,field, value) 的结构与对象的(对象 id, 属性, 值)的结构相似,也可以用来存储对象。我们以用户信息为例,它在关系型数据库中的结构是这样的:uidnameage1sid10t182sidiot16我们可以使用如下命令,将用户对象的信息存储到 Hash 类型:# 存储一个哈希表 uid:1 的键值 127.0.0.1:6379> HSET uid1 name sid10t age 18 (integer) 2 # 存储一个哈希表 uid:2 的键值 127.0.0.1:6379> HSET uid2 name sidiot age 16 (integer) 2 # 获取哈希表用户 id 为1中所有的键值 127.0.0.1:6379> HGETALL uid1 1) "name" 2) "sid10t" 3) "age" 4) "18" # ...Redis Hash 存储结构如下图:在介绍 String 类型的应用场景时有所介绍,String + Json 也是存储对象的一种方式,那么存储对象时,到底用 String + json 还是用 Hash 呢?一般对象用 String + Json 存储,对象中某些频繁变化的属性可以考虑抽出来用 Hash 类型存储。购物车以用户 id 为 key,商品 id 为 field,商品数量为 value,恰好构成了购物车的3个要素,如下图所示。涉及的命令如下:添加商品:HSET cart:{用户id} {商品id} 1添加数量:HINCRBY cart:{用户id} {商品id} 1商品总数:HLEN cart:{用户id}删除商品:HDEL cart:{用户id} {商品id}获取购物车所有商品:HGETALL cart:{用户id}当前仅仅是将商品 ID 存储到了 Redis 中,在回显商品具体信息的时候,还需要拿着商品 id 查询一次数据库,获取完整的商品的信息。后记Redis 五大常见数据类型之一的 Hash 就先讲到这里了,后续还会有其他类型的讲解呢,敬请关注!参考资料:《Redis 核心技术与实战》一文回顾 Redis 五大对象 (数据类型)谈谈Redis五种数据结构及真实应用场景 Redis的数据结构与应用场景Redis 常见数据类型和应用场景 上篇精讲:【Redis】五大常见的数据类型之 String 我是 ,期待你的关注; 创作不易,请多多支持; 系列专栏: Redis
2022年11月