【Redis】Redis十大数据类型—哈希hash

news2024/10/2 12:27:12

介绍

Hash 是一个键值对(key - value)集合,其中 value 的形式入:value=[{field1,value1},...{fieldN,valueN}]。Hash 特别适合用于存储对象。

Hash和String对象的区别

6077a1a10341be439a5eb8ab8b7d45fa.png

内部实现

Hash 类型的底层数据结构是由压缩列表或哈希表实现的:

  • 如果哈希类型元素个数小于 512 个(默认值,可由 hash-max-ziplist-entries 配置),所有值小于 64 字节(默认值,可由 hash-max-ziplist-value 配置)的话,Redis 会使用压缩列表作为 Hash 类型的底层数据结构;
  • 如果哈希类型元素不满足上面条件,Redis 会使用哈希表作为 Hash 类型的 底层数据结构。

常用命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ruwxqXak-1681911967514)(C:\Users\kd\AppData\Roaming\Typora\typora-user-images\image-20230419025447085.png)]

示例

HSET

HSET key field value [field value ...]

存储一个哈希表key的键值

127.0.0.1:6379> HSET user:001 name kd age 10 sex n
(integer) 3

HGET

HGET key field

返回哈希表key对应的field键值

127.0.0.1:6379> HGET user:001 name
"kd"
127.0.0.1:6379> HGET user:001 age
"10"
127.0.0.1:6379> HGET user:001 sex
"n"

HMSET

HMSET key field value [field value ...]

在一个哈希表key中存储多个键值对

127.0.0.1:6379> HMSET user:002 name zs age 20 id 12
OK

HMGET

HMGET key field [field ...]

批量获取哈希表key中多个field键值

127.0.0.1:6379> HMGET user:002 name age id
1) "zs"
2) "20"
3) "12"

HGETALL

HGETALL key

返回哈希表key中的所有键值

127.0.0.1:6379> HGETALL user:001
1) "name"
2) "kd"
3) "age"
4) "10"
5) "sex"
6) "n"

HDEL

HDEL key field [field ...]

删除哈希表key中的field键值

127.0.0.1:6379> HDEL user:002 name
(integer) 1
127.0.0.1:6379> HGETALL user:002
1) "age"
2) "20"
3) "id"
4) "12"

HLEN

HLEN key

返回哈希表key中field的数量

127.0.0.1:6379> HGETALL user:002
1) "age"
2) "20"
3) "id"
4) "12"
127.0.0.1:6379> HLEN user:002
(integer) 2

HEXISTS

HEXISTS key field

在哈希表key中是否存在field

127.0.0.1:6379> HEXISTS user:002 name
(integer) 0
127.0.0.1:6379> HEXISTS user:002 age
(integer) 1

HKEYS

HKEYS key

返回哈希表key中所有的field

127.0.0.1:6379> HKEYS user:002
1) "age"
2) "id"

HVALS

HVALS key

返回哈希表key中的所有value

127.0.0.1:6379> HKEYS user:001
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> HVALS user:001
1) "kd"
2) "10"
3) "n"

HINCRBY

HINCRBY key field increment

为哈希表key中field键的值加上增量increment,只有integer可以加

127.0.0.1:6379> HINCRBY user:001 age 10
(integer) 20
127.0.0.1:6379> HINCRBY user:001 age 300
(integer) 320
127.0.0.1:6379> HVALS user:001
1) "kd"
2) "320"
3) "n"
127.0.0.1:6379> HINCRBY user:001 name 2
(error) ERR hash value is not an integer

HINCRBYFLOAT

HINCRBYFLOAT key field increment

为哈希表key中field键的值加上增量increment,增量为float

127.0.0.1:6379> HINCRBYFLOAT user:001 age 0.3
"320.29999999999999999"
127.0.0.1:6379> HINCRBYFLOAT user:001 age 0.3
"320.59999999999999998"
127.0.0.1:6379> HINCRBYFLOAT user:001 age 0.3
"320.89999999999999997"
127.0.0.1:6379> HINCRBYFLOAT user:001 age 0.3
"321.19999999999999996"
127.0.0.1:6379> HINCRBYFLOAT user:001 age 0.3
"321.49999999999999994"
127.0.0.1:6379> HVALS user:001
1) "kd"
2) "321.49999999999999994"
3) "n"

HSETNX

HSETNX key field value

当field不存在时,进行赋值,如果存在,则无效

127.0.0.1:6379> HSETNX user:001 name kd
(integer) 0
127.0.0.1:6379> HSETNX user:001 stu 20
(integer) 1

应用场景

原创在https://blog.csdn.net/kevin_tech/article/details/126458080中。

缓存对象

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

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

8dd839ef3450951c4ab72a0951f7a237.png

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

# 存储一个哈希表uid:1的键值
> HSET uid:1 name Tom age 15
2
# 存储一个哈希表uid:2的键值
> HSET uid:2 name Jerry age 13
2
# 获取哈希表用户id为1中所有的键值
> HGETALL uid:1
1) "name"
2) "Tom"
3) "age"
4) "15"

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

一般对象用 String + Json 存储,对象中某些频繁变化的属性可以考虑抽出来用 Hash 类型存储。

购物车

以用户 id 为 key,商品 id 为 field,商品数量为 value,恰好构成了购物车的3个要素。

ccd2d336ecfbed26e9184a58e5a0247a.png

涉及的命令如下:

  • 添加商品:HSET cart:{用户id} {商品id} 1
  • 添加数量:HINCRBY cart:{用户id} {商品id} 1
  • 商品总数:HLEN cart:{用户id}
  • 删除商品:HDEL cart:{用户id} {商品id}
  • 获取购物车所有商品:HGETALL cart:{用户id}

当前仅仅是将商品ID存储到了Redis 中,在回显商品具体信息的时候,还需要拿着商品 id 查询一次数据库,获取完整的商品的信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/436948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMVC 接收前端传递的参数

SpringMVC 接受前端传参 1、前端传参需要注意请求的Content-type, 主要使用的有两种: application/x-www-form-urlencodedapplication/json application/x-www-form-urlencoded是浏览器的默认编码格式 ,对于原生的form 表单提交参数,就是使用…

【大数据之Hadoop】十六、MapReduce之Join

1 Reduce Join Map端: 为来自不同表或文件的key/value对,打标签以区别不同来源的记录。然后用连接字段作为key,其余部分和新加的标志作为value,最后进行输出。 Reduce端: 在每一个分组当中将那些来源于不同文件的记录…

【剑指 offer】调整数组顺序使奇数位于偶数前面

✨个人主页:bit me👇 ✨当前专栏:算法训练营👇 调 整 数 组 顺 序 使 奇 数 位 于 偶 数 前 面 核心考点:数组操作,排序思想的扩展使用 描述: 输入一个整数数组,实现一个函数来调…

vue2数据响应式原理(3) 带你手写一个defineReactive响应式函数并理解其本质

然后 我们来学一下defineReactive函数 defineReactive其实是一个要声明的函数 基本都是作为一个响应式函数 因为vue的使用比较经典 因此 也成了 响应式的一个代表函数 而定义它的意义在于 defineProperty不好用 具体不好用在哪呢? 我们打开上文用到的项目 将output…

第六讲 循环结构

我们在写程序的时候,极有可能遇到需要重复执行某条指令或某些指令的场景,例如我们需要每隔1秒钟在屏幕上输出一次“hello, world”并持续输出一个小时。如下所示的代码可以完成一次这样的操作,如果要持续输出一个小时,我们就需要把…

Javaee spring jdbctemplate查询数据库,基于纯注解实现

为啥要用纯注解方式呢&#xff1f;因为xml中代码还是有点多&#xff0c;纯注解可以解决该问题 现在要做的很简单&#xff0c;就是用新建的SpringConfig这个类去替代xml 在测试类中加载核心配置类 SpringConfig类中 Configuratio Spring.xml配置类 ComponentScan <!--开…

Linux搭建Web服务器(三)——服务器编程基本框架以及事件处理模式

目录 0x01 服务器编程基本框架 0x02 两种高效的事件处理模式 Reactor 模式 Proactor 模式 模拟Proactor 模式 0x01 服务器编程基本框架 虽然服务器程序的种类繁多&#xff0c;但是其基本框架都是一样的&#xff0c;不同之处是在于处理逻辑。对于我们在这个服务器的搭建可以…

基于Jenkins实现Docker应用的持续集成与部署

先决条件 1. 服务器部署安装有docker 在docker应用开发中最常见的就是开发Dockerfile文件&#xff0c;可以使用代码仓库来管理它。 而在企业私有开发环境中是无法访问公有代码仓库&#xff08;如Github&#xff09;的。这时可以搭建私有代码仓库。 部署安装svn私有仓库 安…

GPT-4 验明真身的三个经典问题:快速区分 GPT-3.5 与 GPT-4

现在已经有很多 ChatGPT 的套壳网站&#xff0c;以下分享验明 GPT-4 真身的三个经典问题&#xff0c;帮助你快速区分套壳网站背后到底用的是 GPT-3.5 还是 GPT-4。 测试问题 1&#xff1a;What is tomorrow in relation to yesterday’s today&#xff1f;&#xff08;昨天的当…

《Shunted Transformer: Shunted Self-Attention》CVPR 2022 oral

论文链接&#xff1a;https://openaccess.thecvf.com/content/CVPR2022/papers/Ren_Shunted_Self-Attention_via_Multi-Scale_Token_Aggregation_CVPR_2022_paper.pdf 代码链接&#xff1a;https://github.com/OliverRensu/Shunted-Transformer​ 1. 动机 视觉转换器(ViT)模型…

vscode怎么对选定的代码格式化?ctrl+k,ctrl+f(格式化代码)

先选中代码&#xff1a; 然后按CTRL K 再按CTRLF 也可以先选择要格式化的代码块&#xff0c;ctrlshiftp&#xff0c;搜索format&#xff0c;然后第二个就是&#xff1a;

助你掌握搜索神器,10个实用的Elasticsearch查询技巧

前言 Elasticsearch是一个非常流行的搜索引擎&#xff0c;已经成为了许多企业的首选解决方案。然而&#xff0c;我们要想成为一个优秀的程序员&#xff0c;就必须掌握各种查询技巧。本文将向大家介绍10个实用的Elasticsearch查询技巧&#xff0c;并配上详细的代码示例&#xff…

Python基础实战1-简单介绍python

1 Python介绍 Python是一门优雅而健壮的编程语言&#xff0c;它继承了传统编程语言的强大性和通用性&#xff0c;同时也借鉴了脚本语言和解释语言的易用性。 1.1 Python的历史 Python是由创始人贵铎范罗萨姆&#xff08;Guido van Rossum&#xff09;在阿姆斯特丹于1989年圣…

在数字化质变“奇点”时刻,看数字生产力跃升的华为观

&#xff08;华为轮值董事长孟晚舟&#xff09; 进入2023年&#xff0c;以大语言模型为代表的新AI&#xff0c;打开了全球对于数字生产力的全新认知&#xff1a;高盛集团经济学家认为&#xff0c;ChatGPT等生成式AI最终可能在10年的时间里使得全球年GDP增长7%&#xff08;近7万…

pinia持久化存储方案——pinia-storage(自己写的,持续更新)

pinia持久化存储方案——pinia-storage pinia-storagepinia-storage Introduction版本更新说明(update introduction)安装(install)npm 安装&#xff08;npm install&#xff09; QuickStartcreate piniastore/indexstore/indexPinia.tsstore/indexPinia.js main.ts | main.jsA…

Direct3D 12——几何着色器——几何着色器概念

几何着色器 几何着色器这个可选阶段便位于顶点着色器与像素着色器之间。几何着色器所输出的图元由顶点列表定义而成。在退岀几何着色器时&#xff0c;必将顶点的位置变换到齐次 裁剪空间。换言之&#xff0c;经过几何着色器阶段的处理后&#xff0c;我们就得到了位于齐次裁剪空…

MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点3:EXPLAIN ANALYZE

文章目录 MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点3&#xff1a;EXPLAIN ANALYZEEXPLAIN ANALYZE介绍EXPLAIN ANALYZE的特性EXPLAIN 和EXPLAIN ANALYZE的结果对比例题例题解析参考 MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点3&#xff1a;EXPLAIN ANALYZE EXPLAIN…

部门来了个测试人,听说是00后,上来一顿操作给我看呆了...

今天上班开早会就是新人见面仪式&#xff0c;听说来了个很厉害的大佬&#xff0c;年纪还不大&#xff0c;是上家公司离职过来的&#xff0c;薪资已经达到中高等水平&#xff0c;很多人都好奇不已&#xff0c;能拿到这个薪资应该人不简单&#xff0c;果然&#xff0c;自我介绍的…

网络原理(TCP/UDP)

目录 一. 网络基础 1. IP地址 2. 端口号 3. 协议 4. OSI七层模型 二. UDP协议 2.1 UDP的协议端格式&#xff1a; 2.2 UDP的特点 三. TCP协议 3.1 TCP协议段格式 3.2 TCP原理 &#xff08;1&#xff09;确认应答机制 &#xff08;2&#xff09;超时重传机制 &#xff…

CmBacktrace库在工程中的添加和应用

CmBacktrace 介绍在工程中添加CmBacktrace断言打印全局变量的值循环输出错误信息串口处理看门狗处理 介绍 CmBacktrace下载 CmBacktrace &#xff08;Cortex Microcontroller Backtrace&#xff09;是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位&#xff0c;错…