Redis:hash数据类型

文章目录

  • hash
  • 常用命令
    • hset
    • hget
    • hexists
    • hdel
    • hkeys
    • hvals
    • hmget
  • 压缩
  • hash和string

本篇总结的是,在Redis中的哈希数据类型

hash

在Redis内部本身,其实就是一种键值对的结构,而在key-value的value本身,其实也可以是一种哈希结构

而在value的哈希结构中,一般叫做是field-value结构

常用命令

hset

hset key field value [field value ...]

而在这里的value,只能是以字符串的形式出现,返回值是设置成功的数量:

127.0.0.1:6379> hset key1 f1 111
(integer) 1
127.0.0.1:6379> hset key1 f2 222 f3 333
(integer) 2

hget

这个命令只能获取单个field的值:

hget key field

具体使用:

127.0.0.1:6379> hget key1 f1
"111"
127.0.0.1:6379> hget key1 f2
"222"
127.0.0.1:6379> hget key1 f1 f2
(error) ERR wrong number of arguments for 'hget' command

hexists

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

时间复杂度是O(1),返回值是0表示没有,返回值是1表示存在

127.0.0.1:6379> hexists key1 f1
(integer) 1
127.0.0.1:6379> hexists key1 f100
(integer) 0

hdel

删除hash中指定的字段,del删除的是key,而hdel删除的是field

返回值也是本次操作删除的字段的个数

hdel key field [field ...]

具体事例如下:

127.0.0.1:6379> hdel key1 f1 f2
(integer) 2

hkeys

先根据key找到对应的hash,再遍历hash

127.0.0.1:6379> hkeys key1
1) "f3"
2) "f1"
3) "f2"

这个操作也是有一定的风险存在的,具体类似于之前讲过的keys *,这个操作可能会因为某个key对应的hash结构中存在大量的数据,导致最终单线程模型下的Redis被阻塞

hvals

和hkeys相对,能够获取到hash中所有的value值

127.0.0.1:6379> hkeys key1
1) "f3"
2) "f1"
3) "f2"
127.0.0.1:6379> hvals key1
1) "333"
2) "111"
3) "222"

hmget

类似于之前的mget,一次可以查询多个field

127.0.0.1:6379> hmget key f1 f2 f3
1) (nil)
2) (nil)
3) (nil)
127.0.0.1:6379> hmget key1 f1 f2 f3
1) "111"
2) "222"
3) "333"

上述的这些命令都是有一定风险的,可能会造成线程阻塞,原因在于这些命令都是要一次完成所有的操作,所以可能会阻塞Redis,那有没有其他的方法呢?

这里介绍一个命令叫做hscan,它属于是渐进式遍历,相当于是敲一次命令遍历一小部分,再敲一次,遍历一小部分,连续执行多次,就可以完成整个的遍历过程了,相当于是化整为零的操作

压缩

谈到哈希,就要先说说压缩算法了,压缩算法常见的有rar,zip,gzip,7z等等,而压缩的本质,其实就是对于数据进行重新编码,而针对于不同的数据,它们会有不同的特点,就可以依据这些不同的特点进行特定的设计,从而在编码之后,就能够达到缩小体积的效果

而这里想表述的含义是,ziplist也是如此,作为哈希的编码方式,它内部的数据结构也是精心设计的,目的就是在于要节省内存空间,对于表示一个普通的哈希表来说,可能会造成一些内存浪费的问题,比如说,hash是一个数组,而作为数组,就会导致有些地方有元素,有些地方没有元素,那么没有元素的位置其实就是一种资源的浪费,那为了解决这样的问题,就有了ziplist这种编码方式

对于这种编码方式来说,它的一个特点就是读写元素的效率会变低,速度会变慢,如果元素比较少还好,但是一旦元素达到一定的程度,此时就会导致效率明显降低,所以此时就有了另外一种编码方式叫做hashtable

总结

因此我们说:

  1. 哈希表的元素比较少的时候,就使用ziplist来表示,如果比较多就使用hashtable来表示
  2. 每个value的值长度都比较短的时候,就使用ziplist来表示,如果某个value的值太长了,就会转换成hashtable

hash和string

那么现在的问题是,为什么要使用hash?难道使用JSON进行表示string难道不可以吗?其实是可以的,但是这会面临一个问题,比如要对于数据进行修改,需要把JSON先进行序列化,然后更改数据后再进行反序列化,这样的成本显然是比直接操作hash要高的,因此才引入了hash这样的概念

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

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

相关文章

【c++算法篇】滑动窗口

🔥个人主页:Quitecoder 🔥专栏:算法笔记仓 目录 1.长度最小的子数组2.无重复字符的最长子串3.最大连续1的个数 III4.将 x 减到 0 的最小操作数5.水果成篮6.找到字符串中所有字母异位词7.串联所有单词的子串8.最小覆盖子串 滑动窗…

李宏毅-Self-attention机制详解

原视频链接:attention 一. 基本问题分析 1. 模型的input 无论是预测视频观看人数还是图像处理,输入都可以看作是一个向量,输出是一个数值或类别。然而,若输入是一系列向量,长度可能会不同,例如把句子里的…

C 深入指针(4)

目录 一、字符指针变量 1 初始化 2 与字符串数组的区别 二、数组指针变量 1 初始化 2 二维数组传参本质 三、函数指针变量 1 初始化 2 用法 四、typedef关键字 五、函数指针数组 一、字符指针变量 1 初始化 //VS2022 x64 #include <stdio.h> int main() {…

机器人非线性阻抗控制系统

机器人非线性控制系统本质上是一个复杂的控制系统&#xff0c;其状态变量和输出变量相对于输入变量的运动特性不能用线性关系来描述。这种系统的形成基于两类原因&#xff1a;一是被控系统中包含有不能忽略的非线性因素&#xff0c;二是为提高控制性能或简化控制系统结构而人为…

人形机器人场景应用全解析,2024睿抗 AI ROBOT创新挑战赛火热报名中!

人工智能&#xff08;AI&#xff09;已成为推动科技革命和产业变革的关键力量。随着大模型等AIGC技术的迅猛发展&#xff0c;AI正深刻改变我们的生活并重新定义生产方式。越来越多人期望将AI技术从纯粹的思维和计算扩展到与物理世界的互动中&#xff0c;即发展具身智能。 为了推…

探索中国文本到视频AI模型——Vidu

引言 随着人工智能技术的不断进步&#xff0c;我们见证了从文本到视频内容生成的革命。最近&#xff0c;一个名为Vidu的中国文本到视频AI模型引起了全球的关注。由清华大学和中国AI初创公司声书科技联合开发的Vidu&#xff0c;于2024年4月27日宣布&#xff0c;它声称能够生成高…

测试周期记录

测试周期是软件开发生命周期中的一个重要环节&#xff0c;它包括单元测试、集成测试、系统测试和验收测试等阶段。本文将详细介绍测试周期的各个阶段及其重要性&#xff0c;帮助读者更好地理解测试周期在软件开发过程中的作用。 一、单元测试 单元测试是测试周期中的第一个阶段…

个人工控方面收藏网址记录(持续更新中)

1、OPC类 OPC Foundation GitHub Downloads - Unified Automation (unified-automation.com) 物联网IoT协议之OPC UA快速入门教程 | 源码先生的调试人生 (debugself.com) OPC Servers - OPC UA Migration - 100 Solutions by Matrikon (matrikonopc.com) Prosys OPC UA Simu…

k8s coredns配置

1.coredns可根据集群具体数量修改pod数&#xff0c;官方推荐比例为5/1&#xff0c;即有15台服务器最好是3个pod。 2.coredns会继承pod所在主机的dns解析,修改了主机的dns解析之后&#xff0c;coredns有一段时间的缓存&#xff0c;重启coredns才会在集群内部立刻生效该解析。 …

SpringBoot3集成WebSocket

标签&#xff1a;WebSocket&#xff0c;Session&#xff0c;Postman。 一、简介 WebSocket通过一个TCP连接在客户端和服务器之间建立一个全双工、双向的通信通道&#xff0c;使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据&#xf…

003_PyCharm的安装与使用

如果你正在学习PyQt&#xff0c;本系列教程完全可以带你入门直至入土。 所谓从零开始&#xff0c;就是从软件安装、环境配置开始。 不跳过一个细节&#xff0c;不漏掉一行代码&#xff0c;不省略一个例图。 IDE 开始学习一个编程语言&#xff0c;我们肯定是首先得安装好它&…

std::funture和std::promise

#include <iostream> #include <thread> #include <future>void calculateResult(std::promise<int>& promiseObj) {// 模拟耗时计算std::this_thread::sleep_for(std::chrono::seconds(2));// 设置结果到 promise 中promiseObj.set_value(42); }i…

信息系统项目管理师——十大管理过程输入、工具和技术、输出(论文篇)二

六、项目风险管理 规划风险管理 在撰写关于“规划风险管理”的论文时&#xff0c;这个过程是项目风险管理的第一步&#xff0c;旨在建立风险管理的框架&#xff0c;为整个项目周期内的风险识别、分析、应对和监控奠定基础。以下是规划风险管理过程中可能涉及的输入、工具和技…

Python学习(五)异常处理

异常概念 异常的捕获方法 try: f open("D:/abc.txt","r",encoding"UTF-8") except: print("出现异常了&#xff0c;因为文件不存在&#xff0c;我将open的模式&#xff0c;改为w模式去打开") f open("D:/abc.txt&qu…

Python代码:十、字符串连接

1、题目 小明有两个最好的朋友&#xff0c;他们的名字分别用input读入记录在两个字符串中&#xff0c;请使用字符串连接&#xff08;&#xff09;帮助牛牛将两个朋友的名字依次连接在一个字符串中输出。 2、代码 import sysstr1 input() str2 input() str3 str1 str2 pr…

从0到1:使用HuggingFace的管线加载Diffusion模型生成第一张图像!

Hugging Face系列1&#xff1a;详细剖析Hugging Face网站资源 前言本篇摘要1. Hugging Face Hub三大件1.1 模型1.1.1 模型简介1.1.2 制作模型卡片1.1.3 模型下载和上传1.1.4 模型应用 1.2 数据集1.2.1 数据集简介1.2.2 调用代码1.2.3 AutoTrain在线微调 1.3 Space应用1.3.1 内容…

理解 Python 中的 `super()` 与 `__init__()` 方法

在 Python 的面向对象编程中&#xff0c;super() 函数和 __init__() 方法是两个非常重要的概念。它们在类的继承和初始化过程中扮演着关键的角色。本文将深入探讨这两个概念的工作原理&#xff0c;并通过示例代码来展示它们的使用。 基本原理 __init__() 方法 __init__() 是…

Vue中的全局事件总线:EventBus与$bus的比较详解与实战应用

EventBus实例&#xff1a; var EventBus new Vue() 会创建一个名为EventBus的Vue实例&#xff0c;并将其存储在变量EventBus中。Vue.prototype.$bus new Vue() 则直接在Vue的原型上创建一个新的Vue实例&#xff0c;并将其赋值给$bus属性。 使用方式&#xff1a; var EventBus…

C# 结合 JavaScript 对 Web 控件进行数据输入验证

目录 关于数据验证 范例运行环境 验证设计 JavaScript 方法 设计 实现 调用示例 C# 方法 设计 实现 调用示例 小结 关于数据验证 在 Web 应用的录入界面&#xff0c;数据验证是一项重要的实现功能&#xff0c;数据验证是指确认 Web 控件输入或选择的数据&#xff…

类对象作为类成员

在C中&#xff0c;类对象可以作为另一个类的成员变量。这种设计方式可以用于创建复杂的对象结构&#xff0c;使得一个类的对象能够包含另一个类的对象。这种嵌套类的组合方式可以增强代码的可重用性和模块化。 类对象作为类成员的示例 让我们通过一个示例来解释这一概念。假设…