图解Redis 06 | Hash数据类型的原理及应用场景

ops/2024/11/2 14:12:29/

介绍

Hash 类型特别适合存储对象,例如用户信息等。

String类型也可以用于存储用户信息,Hash与String存储用户信息的区别如下图所示:

内部实现

Hash 类型 的底层数据结构是通过压缩列表(Ziplist)或哈希表(Hash Table)实现的:

  • 如果 Hash 类型的元素个数小于 512(默认值,可通过配置 hash-max-ziplist-entries 调整),并且所有值都小于 64 字节(默认值,可通过配置 hash-max-ziplist-value 调整),Redis 会使用压缩列表作为底层数据结构。

  • 如果Hash类型的元素不满足上述条件,那么Redis将会使用哈希表作为Hash类型的底层数据结构。

    在 Redis 7.0 版本中,压缩列表数据结构已经被废弃,取而代之的是 Listpack 数据结构。Listpack 是一种新的压缩数据结构,其目的是提供更好的性能和更高的存储效率。

常用命令

插入单个元素。
hset key field value#示例
> hset myhash k1 v11 
> hset myhash k2 v21
查询单个元素。
hget key field#示例
> hget myhash k2
“v2”
当某个key不存在时,插入数据。
hsetnx key field value#示例
> hsetnx myhash k3 v3
(integer) 1
> hget myhash k3
"v3"

如果尝试插入一个已存在的键,则原始值将不会改变,如下例所示:

> hsetnx myhash k3 val3
(integer) 0
> hget myhash k3
"v3"
删除键中的一个或多个元素。
hdel myhash field [field …]#示例
> hdel myhash k1 v1
(integer) 1

注意:hdel 命令只用于从哈希表中删除一个或多个特定的字段,但它不会删除整个key。如果你想删除整个哈希表,你应该使用 del 命令。

累加某个整数类型的字段值。
hincrby key field increment#示例
> hset myhash k4 4
1
> hincrby myhash k4 2
(integer) 6
> hget myhash k4
"6"

更多操作命令,详见文章末尾。

应用场景

购物车

以用户id为key,以商品sku id为field,以商品数量为value刚好构成了购物车的三个要素,如下图所示。

涉及的命令如下:

#将商品添加到购物车中,{user_id} 是用户的ID,{sku_id} 是商品的SKU ID,1 是初始数量。
HSET cart:{user_id} {sku_id} 1# 增加购物车中某个商品的数量
HINCRBY cart:{user_id} {sku_id} 1# 统计购物车中商品的总数量,即购物车中包含多少个不同的商品。
HLEN cart:{user_id}# 删除商品
HDEL cart:{user_id} {sku_id}# 获取购物车中所有商品信息
HGETALL cart:{user_d}

然而,需要注意的是,这里Redis仅保存了商品SKU ID和数量,而商品的完整信息(如名称、价格、描述等)需要通过商品ID去数据库中查询,以便展示完整的商品信息。

缓存对象

Hash 类型的 (key, field, value) 结构与对象的 (objectid, attribute, value) 结构类似,因此也可以用于存储对象。

我们以用户信息为例,其在关系数据库中的结构是这样的:

我们可以使用下面的命令将用户对象的信息存储到Hash类型中:

> HMSET uid:1 name Jerry age 20
OK> HMSET uid:2 name Tom age 20
OK> HGETALL uid:1
1) "name"
2) "Jerry"
3) "age"
4) "20"

在介绍String类型的应用场景的时候已经介绍过了,String+Json也是一种存储对象的方式,那么在存储对象的时候,到底应该用String+json还是Hash呢?

String + JSON:这种方式将整个对象序列化为一个 JSON 字符串,存储在 Redis 的 String 类型中。这种方法适用于对象结构复杂且整体更新较少的情况。

Hash:这种方式将对象的每个属性存储为 Hash 类型的字段值对。这种方法适用于对象中一些属性频繁变化的情况。

更多hash操作命令

1. 查询一个或多个字段值。
hmget key field [field …]> hmget uid:1 name age
1) "Jerry"
2) "20"
2. 查询某个key的所有字段。
hkeys key> hkeys uid:1
1) "name"
2) "age"
3. 查询某个键的所有字段值。
hvals key> hvals uid:1
1) "Jerry"
2) "20"
4. 对某个浮点型字段进行累加。
hincrbyfloat key field increment> hset floathash k1 1.2
1
> hincrbyfloat floathash k1 2.2
3.4
5. 查询某个字段是否存在。
hexists key field> hexists  floathash k1
(integer) 1

http://www.ppmy.cn/ops/130445.html

相关文章

Chromium 中chrome.topSites扩展接口定义c++

一、chrome.topSites 使用 chrome.topSites API 访问新标签页上显示的热门网站(即最常访问的网站)。不包括用户自定义的快捷方式。 权限 topSites 您必须声明“topSites”扩展程序清单中授予使用此 API 的权限。 {"name": "My exten…

从需求到实践:中国少儿编程教育的崛起与家长教育理念的变迁

随着经济的发展和居民收入水平的提升,中国家庭在子女教育上的支出保持着持续增长的态势。过去五年,无论是在城镇还是农村地区,教育消费已成为家庭支出中的重要组成部分,占据人均消费支出10%以上的比重。与此同时,随着家…

Spring Boot框架在信息学科平台开发中的高级应用

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…

如何使用 Vite 创建一个项目(Vue 或者 React)

如何使用 vite 创建一个 Vue 或者 React 项目? 打开终端,输入命令 npm create vitelatest外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 修改你需要的项目名 选择你要创建的项目的框架(Vue 还是 React 这是个问题&am…

在软件工程开发中,瀑布式开发和螺旋式开发的优缺点比较

在软件工程开发中,瀑布式开发和螺旋式开发是两种常见的软件开发模型,它们各自具有独特的优缺点,并在实际应用中展现出不同的特点。 瀑布式开发的优缺点 优点: 阶段划分清晰:瀑布模型将软件开发过程划分为一系列有序…

Elasticsearch中时间字段格式用法详解

Elasticsearch中时间字段格式用法详解 攻城狮Jozz关注IP属地: 北京 2024.03.18 16:27:51字数 758阅读 2,571 Elasticsearch(简称ES)是一个基于Lucene构建的开源、分布式、RESTful搜索引擎。它提供了全文搜索、结构化搜索以及分析等功能,广泛…

1、liunx系统安装

一、简介 Linux系统内核指的是一个由Linus Torvalds(创始人)Linux基金会,负责维护,提供硬件抽象层、硬盘及文件系统控制及多任务功能的系统核心程序。 红帽公司是全球最大的开源技术厂商,RHEL是全世界内使用最广泛的L…

c 到 c++ 过渡

c基础入门 #include <iostream> #include <cmath> #include <unistd.h> // 总结&#xff1a;按照书写依次往下&#xff0c;先看 iostream 再看 cxxx 最后 xxx.husing namespace std; // 本质&#xff1a;自定义作用域&#xff0c;作用域就在该命名空间内部。…