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

【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 ...]

 

返回值如果 field 是一个新字段(之前不存在),返回 1。如果 field 已经存在,返回 0(值被更新)。
注意事项字段覆盖:如果设置一个已存在的字段,其值会被直接覆盖,不会保留旧值。Key 的初始化:如果 key(Hash 对象)不存在,HSET 会自动创建一个新的 Hash 并添加字段。推荐用法:如果需要一次性设置多个字段,可以使用 HSET 而不是循环调用多次。

HGET

获取 hash 中指定字段的值。

语法:HGET key field


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

HEXISTS

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

语法:HEXISTS key field


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

HDEL 

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


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

HKEYS

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


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

HVALS

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


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

HGETALL 

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


返回值成功:返回哈希表中所有字段和值,格式是字段和值交替出现的列表。失败:如果键不存在,返回一个空列表。
在使用HKEYS,HVALS HGETALL 时,如果哈希元素个数比较多,会存在阻塞 Redis 的可能。

HMGET

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

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


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

HLEN 

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


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

 HSETNX

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

语法:HSETNX key field value

 

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

HINCRBY

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

语法:HINCRBY key field increment


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

 HINCRBYFLOAT

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


 内部编码

哈希的内部编码有俩种: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" 

 高内聚,低耦合

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

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

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



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




高内聚的优势更易维护:因为每个模块都只处理一个相对独立的功能,所以修改和扩展时不会影响其他部分。更高的可重用性:高内聚的模块通常具有较高的可重用性,因为它们的功能独立且清晰。更易于测试:模块化和职责单一的设计使得单元测试变得更加简单。提升代码可读性:代码结构清晰,功能分明,开发人员容易理解和使用。
低耦合: 低耦合是指系统或模块之间的依赖关系较弱,彼此之间的联系尽可能少,能够独立修改和扩展,而不影响其他部分。

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

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



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

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

Read more

C++: 深入解析std::back_inserter(一篇详尽的博客)

C++: 深入解析std::back_inserter(一篇详尽的博客)

std::back_inserter 看似一个小工具,但在写现代 C++ 时它极常用、也非常有用。本文从概念、原理、用法、示例、性能和常见坑全方位讲清楚,帮助你不但会用,而且用得稳、用得妙。 概览:是什么、为什么要它 * 是什么:std::back_inserter 是一个函数模板,返回一个 std::back_insert_iterator<Container>(一个迭代器适配器)。 * 作用:把一个“支持 push_back 的容器”的尾部包装成一个输出迭代器(output iterator),可以把元素“写入”容器末尾。这样你就可以把容器当作 std::copy、std::transform

By Ne0inhk
【AI时代速通QT】第一节:C++ Qt 简介与环境安装

【AI时代速通QT】第一节:C++ Qt 简介与环境安装

目录 前言 一、为什么是 Qt?—— C++ 开发者的必备技能 二、Qt 的核心魅力:不止于跨平台 2.1 优雅之一:代码隔离,清晰明了 2.2 优雅之二:信号与槽(Signal & Slot)机制 2.3 优雅之三:QSS,像写网页一样美化你的应用 三、环境搭建实战:一步步搞定 Qt 安装 3.1 第一步:获取安装包 3.2 第二步:选择正确的版本 3.3 第三步:Windows 下的安装详解 3.4 第四步:

By Ne0inhk
【C++STL】map与set(举例+详解,一文说懂)!

【C++STL】map与set(举例+详解,一文说懂)!

🌟个人主页:第七序章   🌈专栏系列:C++ 目录 ❄️前言: 一、☀️序列式容器与关联式容器 二、☀️键值对 三、☀️树形结构的关联式容器 四、☀️set 4.1 🌙set介绍  4.2 🌙set的构造和迭代器 4.3 🌙set的增删查 4.4 🌙insert和迭代器遍历使用样例  4.5 🌙find和erase使用样例 4.6 🌙multiset和set的差异 4.7 🌙set相关题目练习 五、☀️multiset 5.1 🌙multiset介绍 5.2 🌙multiset使用 六、☀️map 6.1 🌙map介绍 6.2

By Ne0inhk
延迟渲染中的 C++ 实现要点与性能权衡

延迟渲染中的 C++ 实现要点与性能权衡

延迟渲染中的 C++ 实现要点与性能权衡 一、延迟渲染简介 延迟渲染(Deferred Rendering)是现代游戏图形渲染中广泛采用的一种光照计算方法。与传统的**前向渲染(Forward Rendering)**相比,其主要优势在于: * 可同时处理大量光源(Point、Spot、Directional) * 每个像素仅需计算一次光照 * 分离几何绘制与光照流程,利于多阶段优化 延迟渲染三阶段概览 Geometry Pass 写入 GBufferLighting Pass 读取 GBuffer + 光照计算Post-Processing Pass Tonemap 等 二、C++ 中延迟渲染的模块化设计 为构建一个延迟渲染器,通常采用模块化设计: classDeferredRenderer{public:voidInit();voidGeometryPass();voidLightingPass();voidCompositePass();private: GBuffer mGBuffer; LightManager mLightManager;

By Ne0inhk