2.redis数据结构之Hash

news2025/1/24 11:40:49

Hash-散列类型:H

为什么选择Hash?

假设有User对象以JSON序列化的形式存储到Redis中,User对象有id,username、password、age、name等属性,存储的过程如下:

保存、更新:

User对象 -> json(string) -> redis

如果在业务上只是更新age属性,其他的属性并不做更新我应该怎么做呢? 如果仍然采用上边的方法在传输、处理时会造成资源浪费,因为只需要更新age属性,使用String却要把User对象全量传输然后覆盖更新。

下边讲的hash可以很好的解决这个问题。

hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。如下:

image.png

赋值: HSET key field1 value1

HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0。

redis 一次只设置一个字段值 语法:HSET key field value ​ 127.0.0.1:6379> hset user username zhangsan (integer) 1

赋值: HMSET key field1 value1 field2 value2

redis 一次可以设置多个字段值 语法:HMSET key field value [field value ...] 127.0.0.1:6379> hmset user age 20 username lisi OK

redis 当字段不存在时赋值,类似HSET,区别在于如果字段已存在,该命令不执行任何操作 如果user中没有age字段则设置age值为30,否则不做任何操作 语法:HSETNX key field value 127.0.0.1:6379> hsetnx user age 30 (integer) 0

取值 :HGET key field

redis 一次只能获取一个字段值 语法:HGET key field 127.0.0.1:6379> hget user username "zhangsan"

取值 :HMGET key field1 field2

redis 一次可以获取多个字段值 语法:HMGET key field [field ...] 127.0.0.1:6379> hmget user age username 1) "20" 2) "lisi" ​ 获取所有字段值 语法:HGETALL key 127.0.0.1:6379> hgetall user 1) "age" 2) "20" 3) "username" 4) "lisi"

删除字段:HDEL key field1 field2

可以删除一个或多个字段,返回值是被删除的字段个数

redis 语法:HDEL key field [field ...] 127.0.0.1:6379> hdel user age (integer) 1 127.0.0.1:6379> hdel user age name (integer) 0 127.0.0.1:6379> hdel user age username (integer) 1

增加数字:HINCRBY key field increment

redis 语法:HINCRBY key field increment 127.0.0.1:6379> hincrby user age 2 将用户的年龄加2 (integer) 22 127.0.0.1:6379> hget user age 获取用户的年龄 "22“

判断属性是否存在HEXISTS key field

redis 语法:HEXISTS key field 127.0.0.1:6379> hexists user age 查看user中是否有age字段 (integer) 1 127.0.0.1:6379> hexists user name 查看user中是否有name字段 (integer) 0

只获取key的字段名HKEYS key

redis 语法: HKEYS key ​ ​ 127.0.0.1:6379> hmset user age 20 name lisi OK 127.0.0.1:6379> hkeys user 1) "age" 2) "name" 127.0.0.1:6379> hvals user 1) "20" 2) "lisi"

只获取key字段值HVALS key

redis 语法: HVALS key ​ 127.0.0.1:6379> hmset user age 20 name lisi OK 127.0.0.1:6379> hkeys user 1) "age" 2) "name" 127.0.0.1:6379> hvals user 1) "20" 2) "lisi"

获取字段数量:HLEN key

redis 语法:HLEN key 127.0.0.1:6379> hlen user (integer) 2

应用-购物车存储商品信息

商品字段

【商品id、商品名称、商品描述、商品库存、商品好评】

定义商品信息的key

商品1001的信息在 Redis中的key为:[items:1001]

缓存商品信息

获取商品信息

redis 192.168.101.3:7003> HGET items:1001 id "3" 192.168.101.3:7003> HGETALL items:1001 1) "id" 2) "3" 3) "name" 4) "apple" 5) "price" 6) "999.9"

应用-分布式锁可重入特性

redisson分布式锁框架选择使用hash作为分布式锁的数据结构。

大key是我们要加锁的业务数据,比如订单号。

小key使用的是我们加锁的机器id+线程id。

value就是可重入的次数。

对应的命令如下:

redis HSET 订单号 6f3d66cd176c:Thread-1 1

底层数据结构-压缩列表和哈希表

压缩列表转化成hash表条件

创建新列表时 redis 默认使用redisencodingziplist编码,当以下任意一个条件被满足时, 列表会被转换成 redisencodinglinkedlist 编码:

  • 试图往列表新添加一个字符串值,且这个字符串的长度超过 server.listmaxziplist_value :默认值为 64字节。
  • ziplist 包含的节点超过server.listmaxziplist_entries:默认值为 512

Hash 类型底层结构什么时候使用压缩列表,什么时候使用哈希表呢?

其实,Hash类型设置了用压缩列表保存数据时的两个阈值,一旦超过了阈值,Hash 类型就会用哈希表来保存数据了。

这两个阈值分别对应以下两个配置项:

hash-max-ziplist-entries:表示用压缩列表保存时哈希集合中的最大元素个数 512。

hash-max-ziplist-value:表示用压缩列表保存时哈希集合中单个元素的最大长度 64字节。

注意:这两个条件是可以修改的,在 redis.conf 中:

redis list-max-ziplist-value 64 list-max-ziplist-entries 512

如果我们往 Hash 集合中写入的元素个数超过了 hash-max-ziplist-entries ,或者写入的单个元素大小超过了 hash-max-ziplist-value,Redis就会自动把Hash类型的实现结构由压缩列表转为哈希表。

一旦从压缩列表转为了哈希表,Hash 类型就会一直用哈希表进行保存,而不会再转回压缩列表了。在节省内存空间方面,哈希表就没有压缩列表那么高效了。

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

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

相关文章

基于mha+mycat2+gtid的半同步主从复制双vip高可用MySQL集群

目录 项目名称 项目架构图 项目概述 项目准备 项目步骤 一、使用ansible编写palybook实现4台二进制安装MySQL环境的部署,并把master上的基础数据下发到所有slave服务器上 1. 建立免密通道 2.安装ansible在ansible服务器上,并写好主机清单 3.将…

Ubuntu20.04安装软件报错:The following packages have unmet dependencies

Ubuntu20.04更换阿里云源后安装软件都会报错:The following packages have unmet dependencies 查看资料,大概是ubuntu本身的源比较版本较老,而阿里云的源比较新,因此版本不匹配造成依赖的库不匹配,所以只要将阿里云的…

【微服务】03-HttpClientFactory与gRpc

文章目录 1.HttpClientFactory :管理外向请求的最佳实践1.1 核心能力1.2 核心对象1.3 HttpClient创建模式 2.gRPC:内部服务间通讯利器2.1 什么是gRPC2.2 特点gRPC特点2.3.NET生态对gRPC的支持情况2.4 服务端核心包2.5 客户端核心包2.5 .proto文件2.6 gRP…

opencv 水果识别+UI界面识别系统,可训练自定义的水果数据集

目录 一、实现和完整UI视频效果展示 主界面: 测试图片结果界面: 自定义图片结果界面: 二、原理介绍: 图像预处理 HOG特征提取算法 数据准备 SVM支持向量机算法 预测和评估 完整演示视频: 完整代码链接 一、…

redis--集群

redis集群 Redis 集群是一种用于分布式存储和管理数据的解决方案,它允许将多个 Redis 实例组合成一个单一的逻辑数据库,提供更高的性能、容量和可用性。 redis集群的优点 高可用性: Redis集群使用主从复制和分片技术,使得数据可…

提高nodejs中promise的性能

提高nodejs中promise的性能 我们先来看一个常见问题,假设我们有 N 条记录需要处理,或者例如,为每条记录发出 API 请求以获取数据。 通常情况下我们都是使用promise.all方法来实现这一需求: // 记录 const data [{}, {}, {}];/…

Linux网络编程:线程池并发服务器 _UDP客户端和服务器_本地和网络套接字

文章目录: 一:线程池模块分析 threadpool.c 二:UDP通信 1.TCP通信和UDP通信各自的优缺点 2.UDP实现的C/S模型 server.c client.c 三:套接字 1.本地套接字 2.本地套 和 网络套对比 server.c client.c 一:线…

如何使用CSS实现一个3D旋转效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 3D效果实现⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域…

有线耳机插入电脑没声音

有线耳机插入电脑没声音 首先确保耳机和电脑都没问题,那就有可能是声音输出设备设置错误 右击任务栏的声音图标-打开声音设置-选择输出设备。

长时间序列的25米全球sar卫星镶嵌数据

数据简介 1992年JAXA(Japan Aerospace Exploration Agency,日本宇宙航空研究开发机构)发射了一颗JERS-1卫星,该卫星携带有18*24m分辨率的SAR传感器。随后,JAXA又在2006年和2014年分别发射了带有SAR传感器的alos卫星和…

拓世科技集团 | “书剑人生”李步云学术思想研讨会暨李步云先生九十华诞志庆

2023年,中国改革开放迎来了45周年,改革春风浩荡,席卷神州大地,45年间,中国特色社会主义伟大事业大步迈入崭新境界,一路上结出了饶为丰硕的果实。中华民族在这45年间的砥砺前行,不仅使中国的经济…

Clion 找不到头文件,无法DEBUG,无法进入断点,断点灰了

文章目录 1. 找不到远程toolchain的头文件2.gdb未安装或版本不对无法debug3.远程debug断点灰了 1. 找不到远程toolchain的头文件 ①检查cmake头文件引入指令include_directories(SYSTEM "/usr/lib/jvm/jdk-17-oracle-x64/include") ②菜单栏Tools->Resyinc with r…

运放的分类、运放的参数

一、运放的分类 运放按功能分为通用运放与专用运放(高速运放、精密运放、低IB运放等)。 1.1通用运放 除廉价外,没有任何最优指标的运放。 例:uA741,LM324,TL06X,TL07X、TL08X等 国外知名运放…

科技赋能,教育革新——大步迈向体育强国梦

在 "全民健身"、"体育强国建设"战略的推进下,体育考试成绩被纳入重要升学考试且分值不断提高,体育科目的地位逐步上升到前所未有的高度,在此趋势下,体育教学正演变出更多元化、个性化的需求。然而现实中却面临…

ubuntu20.04 编译安装运行emqx

文章目录 安装依赖编译运行登录dashboard压力测试 安装依赖 Erlang/OTP OTP 24 或 25 版本 apt-get install libncurses5-dev sudo apt-get install erlang如果安装的erlang版本小于24的话,可以使用如下方法自行编译erlang 1.源码获取 wget https://github.com/erla…

ARM开发,stm32mp157a-A7核IIC实验(采集温湿度传感器值)

1.实验目标:采集温湿度传感器值; 2.分析框图(模拟IIC控制器); 3.代码; ---iic.h封装时序协议头文件--- #ifndef __IIC_H__ #define __IIC_H__ #include "stm32mp1xx_gpio.h" #include "st…

bash: conda: command not found

问题描述: 在Pycharm上用SSH远程连接到服务器,打开Terminal准备查看用 conda 创建的虚拟环境时,却发现调用 conda 指令时出现以下报错: -bash: conda: command not found如果使用Xshell 利用端口号直接连接该 docker 容器&#…

学无止境·运维高阶⑦Docker进阶一(构建个人网盘)

Docker进阶一 1、使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。1.1 拉取镜像1.2 创建容器1.3登录查看 1、使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。 1.1 拉取镜像 [rootnode3 ~]# docker pull mysql:5.6 [rootnode3 ~]# docker pull own…

基于jeecg-boot的flowable流程跳转功能实现

更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/nbcio-boot 前端代码:https://gitee.com/nbacheng/nbcio-vue.git 在线演示(包括H5) : http://122.227.135.243:9888 今天我…

云计算在线实训系统建设方案

一、 人工智能与云计算系统概述 人工智能(Artificial Intelligence,简称AI)是一种模拟人类智能的科学和工程,通过使用计算机系统来模拟、扩展和增强人类的智能能力。人工智能涉及多个领域,包括机器学习、深度学习、自然…