【Redis篇】Hash的认识以及相关命令操作

目录

前言

基本命令

HSET

HGET

HEXISTS

HDEL 

HKEYS

HVALS

HGETALL 

HMGET

HLEN 

 HSETNX

HINCRBY

 HINCRBYFLOAT

 内部编码

 高内聚,低耦合


前言

可以看出:

Redis 的 Hash 是一个键(key)下包含多个字段(field),每个字段对应一个值(value)。一个 Hash 对象就像一个存储字段-值对的小型数据集合。

  • Key:Redis 中的主键,用于标识整个 Hash 数据结构。
  • Field:Hash 内部的字段,相当于小型键。
  • Value:字段对应的值。

    哈希类型中的映射关系通常称为 field-value,用于区分 Redis 整体的键值对(key-value),注意这里的 value 是指 field 对应的值,不是键(key)对应的值,请注意 value 在不同上下文的作用。

命令执⾏效果时间复杂度
hset key field value设置值O(1)
hget key field获取值O(1)
hdel key field [field ...]删除 fieldO(k), k 是 field 个数
hlen key计算 field 个数O(1)
hgetall key获取所有的 field-valueO(k), k 是 field 个数
hmget field [field ...]批量获取 field-value
hmset field value [field value ...]批量获取 field-valueO(k), k 是 field 个数
hexists key field判断 field 是否存在O(1)
hkeys key获取所有的 fieldO(k), k 是 field 个数
hvals key获取所有的 valueO(k), k 是 field 个数
hsetnx key field value设置值,但必须在 field 不存在时才能设置成功O(1)
hincrby key field n对应 field-value +nO(1)
hincrbyfloat key field n对应 field-value +nO(1)
hstrlen key field计算 value 的字符串⻓度O(1)

基本命令

HSET

设置 hash 中指定的字段(field)的值(value)。

语法: HSET key field value [field value ...]
 

127.0.0.1:6379> hset key f1 v1
(integer) 1
127.0.0.1:6379> hset key f2 v2 f3 v3 f4 v4
(integer) 3
127.0.0.1:6379> hset key f1 111
(integer) 0
127.0.0.1:6379> hget key f1
"111"

返回值

  • 如果 field 是一个新字段(之前不存在),返回 1。
  • 如果 field 已经存在,返回 0(值被更新)。

注意事项

  1. 字段覆盖:

    • 如果设置一个已存在的字段,其值会被直接覆盖,不会保留旧值。

  2. Key 的初始化:

    • 如果 key(Hash 对象)不存在,HSET 会自动创建一个新的 Hash 并添加字段。

  3. 推荐用法:

    • 如果需要一次性设置多个字段,可以使用 HSET 而不是循环调用多次。

HGET

获取 hash 中指定字段的值。

语法:HGET key field

127.0.0.1:6379> hget key f2
"v2"
127.0.0.1:6379> hget key f5
(nil)
127.0.0.1:6379> hget key2 f1
(nil)

返回值

  • 如果字段存在,返回字段的值。
  • 如果字段不存在,返回 nil。
  • 如果键(key)不存在,返回 nil。

HEXISTS

判断 hash 中是否有指定的字段。

语法:HEXISTS key field

127.0.0.1:6379> hexists key f1 
(integer) 1
127.0.0.1:6379> hexists key f5
(integer) 0
127.0.0.1:6379> hexists ke2 f1
(integer) 0

返回值

  • 1:如果字段存在。
  • 0:如果字段不存在,或者 Hash(key)本身不存在。

HDEL 

删除 hash 中指定的字段。
语法:HDEL key field [field ...]

127.0.0.1:6379> hdel key f1 
(integer) 1
127.0.0.1:6379> hdel key f2 f3 f4
(integer) 3
127.0.0.1:6379> hdel key f5
(integer) 0

返回值

  • 返回成功删除的字段数量(integer)。
  • 如果指定的字段不存在,则不会计入返回值。

HKEYS

获取 hash 中的所有字段。
语法:  HKEYS key

127.0.0.1:6379> hset key f1 v1 f2 v2 f3 v3
(integer) 3
127.0.0.1:6379> hkeys key
1) "f1"
2) "f2"
3) "f3"
127.0.0.1:6379> hkeys key2
(empty array)

返回值

  • 返回一个包含所有字段名称的列表。
  • 如果 Hash 键不存在,返回一个空列表。
  • 如果键对应的值不是 Hash 类型,会报错。

HVALS

获取 hash 中的所有的值。
语法:HVALS key

127.0.0.1:6379> hvals key
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> hvals key2
(empty array)

返回值

  • 返回一个列表,包含 Hash 中所有字段的值。
  • 如果 Hash 键不存在,返回一个空列表。
  • 如果键对应的值不是 Hash 类型,会报错。

HGETALL 

获取 hash 中的所有字段以及对应的值。
语法: HGETALL key

127.0.0.1:6379> hgetall key
1) "f1"
2) "v1"
3) "f2"
4) "v2"
5) "f3"
6) "v3"
127.0.0.1:6379> hgetall key2
(empty array)

返回值

  • 成功:返回哈希表中所有字段和值,格式是字段和值交替出现的列表。
  • 失败:如果键不存在,返回一个空列表。

在使用HKEYS,HVALS HGETALL 时,如果哈希元素个数比较多,会存在阻塞 Redis 的可能。

HMGET

 一次获取 hash 中多个字段的值。

语法:HMGET key field [field ...]

127.0.0.1:6379> hset key f1 v1 f2 v2 f3 v3 f4 v4
(integer) 4
127.0.0.1:6379> hmget key f1 f2 f3 f4 f5
1) "v1"
2) "v2"
3) "v3"
4) "v4"
5) (nil)

返回值

  • 成功:返回对应字段的值列表。如果某个字段不存在,返回 nil
  • 失败:如果哈希表不存在,返回一个包含 nil 的列表。

HLEN 

获取 hash 中的所有字段的个数。
语法:HLEN key

127.0.0.1:6379> hlen key
(integer) 4
127.0.0.1:6379> hlen key2
(integer) 0

返回值

  • 如果哈希表存在,返回字段的数量(整数)。
  • 如果哈希表不存在,返回 0

 HSETNX

在字段不存在的情况下,设置 hash 中的字段和值。

语法:HSETNX key field value
 

127.0.0.1:6379> hset key f1 111 f2 222 f3 333
(integer) 3
127.0.0.1:6379> hsetnx key f1 1111111
(integer) 0
127.0.0.1:6379> hsetnx key f4 444
(integer) 1
127.0.0.1:6379> hvals key
1) "111"
2) "222"
3) "333"
4) "444"

返回值

  • 1:如果字段不存在并且成功设置了值。
  • 0:如果字段已存在,未做任何更改。

HINCRBY

将 hash 中字段对应的数值添加指定的值。

语法:HINCRBY key field increment

127.0.0.1:6379> hset key f1 100 f2 200
(integer) 2
127.0.0.1:6379> hincrby key f1 10
(integer) 110
127.0.0.1:6379> hincrby key f2 -90
(integer) 110

返回值

  • 返回更新后的字段值,即递增后的新值。

 HINCRBYFLOAT

HINCRBY 的浮点数版本。
语法:HINCRBYFLOAT key field increment

127.0.0.1:6379> hset key f1 100.2 f2 150.5
(integer) 2
127.0.0.1:6379> hincrbyfloat key f1 50.4
"150.60000000000000001"
127.0.0.1:6379> hincrbyfloat key f2 -50.1
"100.4"
127.0.0.1:6379> hvals key 
1) "150.60000000000000001"
2) "100.4"

 内部编码

哈希的内部编码有俩种:

  • ziplist(压缩列表):当哈希类型元素个数小于 hash-max-ziplist-entries 配置(默认 512 个)、同时所有值都小于 hash-max-ziplist-value 配置(默认 64 字节)时,Redis 会使用 ziplist 作为哈希的内部实现,ziplist 使⽤更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比 hashtable 更加优秀。
  • hashtable(哈希表):当哈希类型无法满足 ziplist 的条件时,Redis 会使用 hashtable 作为哈希的内部实现,因为此时 ziplist 的读写效率会下降,而 hashtable 的读写时间复杂度为 O(1)。 
127.0.0.1:6379> hset key f1 v1
(integer) 1
127.0.0.1:6379> object encoding key
"ziplist"
127.0.0.1:6379> hset key f1 sfsfsfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
(integer) 0
127.0.0.1:6379> hget key f1
"sfsfsfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
127.0.0.1:6379> object encoding key
"hashtable"

 高内聚,低耦合

来谈一个题外话题,何为高内聚,低耦合?

高内聚:高内聚是指一个模块、类或方法内部的功能紧密相关,职责单一,内部的各个部分相互协作来完成同一目标。高内聚能够提高代码的可维护性、可重用性和可扩展性。

简单来说,就是将所有有关联的东西放在一起,最后放一个指定位置,才能方便寻找。

低内聚示例:假如我是一个丢三落四的人,每次我找衣服,它可能出现的位置 可能在床上, 沙发,或者又是凳子上,桌上,甚至可能在地上 , 虽然说衣柜里面可能有一些,但是分散在各地,每次寻找它们都可能困难,如果将它们整理好,全部放进衣柜,将会大大减少我们寻找的时间。。。。

高内聚的优势

  1. 更易维护:因为每个模块都只处理一个相对独立的功能,所以修改和扩展时不会影响其他部分。

  2. 更高的可重用性:高内聚的模块通常具有较高的可重用性,因为它们的功能独立且清晰。

  3. 更易于测试:模块化和职责单一的设计使得单元测试变得更加简单。

  4. 提升代码可读性:代码结构清晰,功能分明,开发人员容易理解和使用。

低耦合: 低耦合是指系统或模块之间的依赖关系较弱,彼此之间的联系尽可能少,能够独立修改和扩展,而不影响其他部分。

简单来说,如果俩个模块/代码之间的关联关系越大 很容易相互影响,那么它们的耦合就是很大,所谓的追求低耦合,就是将每块代码模块尽可能减小相互联系,不然一出bug,将会同时影响到很多地方

高耦合示例:在一个智能家居系统中,像空调,电视,灯光,窗帘等等家居中,这些只能跟一个中央控制系统连接,假设这个控制系统出异常了,所有的家居受到了影响,导致了这些家具罢工。所有进行它们的解耦,可以将每个家居设置独立开关,不影响别的家具影响。

低耦合的优势在于提高了系统的灵活性和可维护性。各模块之间的依赖较少,修改某一部分时不易影响其他部分,减少了错误传播的风险。同时,低耦合也增强了模块的重用性和测试性,有助于系统的扩展与演进。


结语: 写博客不仅仅是为了分享学习经历,同时这也有利于我巩固知识点,总结该知识点,由于作者水平有限,对文章有任何问题的还请指出,接受大家的批评,让我改进。同时也希望读者们不吝啬你们的点赞+收藏+关注,你们的鼓励是我创作的最大动力! 

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

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

相关文章

可解释机器学习 | Python实现LGBM-SHAP可解释机器学习

机器学习 | Python实现GBDT梯度提升树模型设计 目录 机器学习 | Python实现GBDT梯度提升树模型设计基本介绍模型使用参考资料基本介绍 LightGBM(Light Gradient Boosting Machine)是一种基于决策树的梯度提升框架,是一种高效的机器学习模型。SHAP(SHapley Additive exPlan…

mysql--二进制安装编译安装yum安装

二进制安装 创建用户和组 [rootlocalhost ~]# groupadd -r -g 306 mysql [rootlocalhost ~]# useradd -r -g 306 -u 306 -d /data/mysql mysql 创建文件夹并添加所属文件用户和组 [rootlocalhost ~]# mkdir -p /data/mysql [rootlocalhost ~]# chown mysql:mysql /data/mysql …

大模型开发和微调工具Llama-Factory-->WebUI

WebUI LLaMA-Factory 支持通过 WebUI 零代码微调大模型。 通过如下指令进入 WebUI llamafactory-cli webui# 如果是国内, # USE_MODELSCOPE_HUB 设为 1,表示模型从 ModelScope 魔搭社区下载。 # 避免从 HuggingFace 下载模型导致网速不畅 USE_MODELSC…

【WPS】【EXCEL】将单元格中字符按照分隔符拆分按行填充到其他单元格

问题:实现如下图的效果 解答: 一、函数 IFERROR(TRIM(MID(SUBSTITUTE($A$2,",",REPT(" ",LEN($A$2))),(ROW(A1)-1)*LEN($A$2)1,LEN($A$2))),"") 二、在单元格C2中填写如下函数 三、全选要填充的单元格并且按CTRLD 函数…

Java有关数组的相关问题

Java中的栈和堆的含义 栈 存储局部变量:栈主要用于存储方法中的局部变量,包括基本数据类型(int、double、boolean等)和对象的引用(不包含对象本身)。 遵循后进先出原则:当一个方法被调用时&…

提升阅读体验,Balabolka让文字跃然“声”上

作为一个专业的语音合成工具,Balabolka为用户提供了全方位的文本朗读解决方案。这款软件不仅可以将各类文本实时转换为清晰的语音输出,还能将转换后的音频内容导出为多种主流格式。它强大的兼容性使其能够处理各类电子书和文档格式,让用户可以…

解决`-bash: ./configure:/bin/sh^M:解释器错误: 没有那个文件或目录`的问题

解决`-bash: ./configure:/bin/sh^M:解释器错误: 没有那个文件或目录`的问题 一、错误原因分析二、解决方法方法一:使用`dos2unix`工具方法二:使用`sed`命令方法三:使用`tr`命令方法四:在文本编辑器中转换方法五:在Windows系统中使用适当的工具三、预防措施四、总结在使…

Flink双流Join

在离线 Hive 中,我们经常会使用 Join 进行多表关联。那么在实时中我们应该如何实现两条流的 Join 呢?Flink DataStream API 为我们提供了3个算子来实现双流 join,分别是: join coGroup intervalJoin 下面我们分别详细看一下这…

Python生日祝福烟花

1. 实现效果 2. 素材加载 2个图片和3个音频 shoot_image pygame.image.load(shoot(已去底).jpg) # 加载拼接的发射图像 flower_image pygame.image.load(flower.jpg) # 加载拼接的烟花图 烟花不好去底 # 调整图像的像素为原图的1/2 因为图像相对于界面来说有些大 shoo…

26页PDF | 数据中台能力框架及评估体系解读(限免下载)

一、前言 这份报告详细解读了数据中台的发展历程、核心概念、能力框架及成熟度评估体系。它从阿里巴巴的“大中台,小前台”战略出发,探讨了数据中台如何通过整合企业内部的数据资源和能力,加速业务迭代、降低成本,并推动业务增长…

如何分段存储Redis键值对

说明:本文介绍针对一个value过长的键值对,如何分段存储; 场景 当我们需要存入一个String类型的键值对到Redis中,如下: (缓存接口) public interface CacheService {/*** 添加一个字符串键值…

C-操作符

操作符种类 在C语言中,操作符有以下几种: 算术操作符 移位操作符 位操作符 逻辑操作符 条件操作符 逗号表达式 下标引用,函数调用 拓展:整型提升 我们介绍常用的几个 算术操作符 (加)&#xff…

RabbitMQ 客户端 连接、发送、接收处理消息

RabbitMQ 客户端 连接、发送、接收处理消息 一. RabbitMQ 的机制跟 Tcp、Udp、Http 这种还不太一样 RabbitMQ 服务,不是像其他服务器一样,负责逻辑处理,然后转发给客户端 而是所有客户端想要向 RabbitMQ服务发送消息, 第一步&a…

题海拾贝——生成元(Digit Generator,ACM/ICPC SEOUL 2005,UVa1583)

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 欢迎点赞关注&#xff01; 1、题目描述 如果x加上x的各个数字之和得到y&#xff0c;就说x是y的生成元。给出(1<n<10…

欧科云链研究院:比特币还能“燃”多久?

出品&#xff5c; OKG Research 作者&#xff5c;Hedy Bi 本周二&#xff0c;隔夜“特朗普交易” 的逆转趋势波及到比特币市场。比特币价格一度冲高至约99,000美元后迅速回落至93,000美元以下&#xff0c;最大跌幅超6%。这是由于有关以色列和黎巴嫩有望达成停火协议的传闻引发…

hint: Updates were rejected because the tip of your current branch is behind!

问题 本地仓库往远段仓库推代码时候提示&#xff1a; error: failed to push some refs to 192.168.2.1:java-base/java-cloud.git hint: Updates were rejected because the tip of your current branch is behind! refs/heads/master:refs/heads/master [rejected] (…

设计模式面试大全:说一下单例模式,及其应用场景?

定义 单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一&#xff0c;此模式保证某个类在运行期间&#xff0c;只有一个实例对外提供服务&#xff0c;而这个类被称为单例类。 单例模式也比较好理解&#xff0c;比如一个人一生当中只能有一个真…

go-zero使用自定义模板实现统一格式的 body 响应

前提 go环境的配置、goctl的安装、go-zero的基本使用默认都会 需求 go-zero框架中&#xff0c;默认使用goctl命令生成的代码并没有统一响应格式&#xff0c;现在使用自定义模板实现统一响应格式&#xff1a; {"code": 0,"msg": "OK","d…

【Python网络爬虫笔记】5-(Request 带参数的get请求) 爬取豆瓣电影排行信息

目录 1.抓包工具查看网站信息2.代码实现3.运行结果 1.抓包工具查看网站信息 请求路径 url:https://movie.douban.com/typerank请求参数 页面往下拉&#xff0c;出现新的请求结果&#xff0c;参数start更新&#xff0c;每次刷新出20条新的电影数据 2.代码实现 # 使用网络爬…

玻璃效果和窗户室内效果模拟

一、玻璃效果 首先来讲如何模拟玻璃效果。玻璃的渲染包括三部分&#xff0c;普通场景物体的渲染、反射和折射模拟、毛玻璃模拟。作为场景物体&#xff0c;那么类似其它场景物体Shader一样&#xff0c;可以使用PBR、BlingPhong或者Matcap&#xff0c;甚至三阶色卡通渲染都可以。…