Redis数据结构之哈希表

news2024/9/22 8:43:11

这里的哈希表说的是value的类型是哈希表

一.相关命令

1.hset key field value

一次可以设置多个

返回值是设置成功的个数

注意,哈希表中的键值对,键是唯一的而值可以重复

所以有下面的结果:

key中原来已经有了f1,所以再使用hset时,返回值是0,表示没有设置新的字段,但是根据hget的结果可以知道,f1的value已经修改了

2.hget key field获取指定的字段的值

这里的字段指的是field,而不是key

时间复杂度:O(1)

3.hexists key field 判官是否有指定的字段

这里的字段指的是field

一次只能判断一个字段

返回值:1表示存在,0表示不存在

时间复杂度:O(1)

4.hdel key field

一次可以删除多个

返回值是成功删除掉的个数

时间复杂度:O(1)

5.hkeys key获取hash中的所有列表

时间复杂度:O(N),N表示key中field的个数,所以当field很少时,就可以看成O(1)

与keys一样有一定的风险,如果field很多,就可能造成其他命令无法及时接收,导致请求偏向mySql,造成mySql崩溃

6.hvals获取hash中所有的值

时间复杂度:O(N)

7.hgetall key 获取hash中所有的字段以及值

时间复杂度:O(N),N表示字段的个数

8.hmget key field [field]一次获取多个字段的值

9.hlen key 获取hash中所有字段的个数

10.hsetnx 在字段不存在的情况下才设置

注意,不存在hsetex

11.hincrby key field increment

返回值是增加后的结果

12.hincrbyfloat key field increment

可以对整数进行加浮点数的操作,也可以对浮点数进行加整数的操作

二.内部编码

redis中hash表的内部编码有两种:ziplist和hashtable

ziplist:压缩列表。

我们常说的rar、zip、gzip、7z……都是一些常见的压缩算法。

压缩的本质:针对数据进行重新编码。不同的数据有不同的特点。结合这些特点,进行精妙的设计,重新编码后就能缩小体积。

例如:abbcccdee,重新编码为1a2b3c1d2e

事实上,上述压缩算法都是精妙设计的,ziplist也同理,内部的数据结构也是精心设计的,节省内存空间。

但是ziplist进行压缩会有代价:读取速度慢。如果元素个数少,则慢的不明显,多了则雪上加霜。

而hashtable的读写时间复杂度是O(1)。

所以只有当hash表中字段个数较少并且每个字段的值也很短时才会使用ziplist,如果元素个数多或者某些字段的值很长就会使用hashtable

三.使用场景

当作缓存,存储结构化数据

前面说过,String也可以作为缓存使用,但是针对于存储结构化数据,使用哈希表类型会更合适

如下是一张关系型数据表保存用户信息:

将它映射到redis中存储,其中value是hash类型,如下:

这里的user1和user2就是键,后面的哈希表就是值。

但是要是使用string字符串存储,就需要用到json这样的数据格式。

就比如某个场景下只需要获取其中的一个field或者修改其中的一个field,那就得把整个json格式的数据全部读取出来,然后解析成对象,再去操作field。操作完毕后再将对象转化成json格式字符串再重新存储。这样真的很麻烦。但要是使用hash来表示userinfo,就可以使用field表示对象的每一个属性,获取时也可以单个field获取,这样的话,读取field更高效。

但是,虽然读取field更高效,却付出了空间的代价!!!因为要控制hash在ziplist和hashtable这两种存储方式的转换中,可能造成内存的大量消耗

哈希类型和关系型数据库的区别

1.哈希类型是稀疏的,而关系型数据库是完全结构化的。就是说哈希类型的每个键可以有不同的value,比如其中一个键设置了地址信息,而另一个键就可以不设置。但要是关系型数据库,一旦添加了新的列,就必须设置值,要么就设置成NULL

缓存方式对比

截至目前,我们已经能够使用三种方式来作为缓存,下面给出三种方式的优缺点

1.原生字符串类型

set user:1:name John

set user:1:age 23

set user:1:address Beijing

优点:实现简单,针对个别属性的变更也很灵活

缺点:占用过多的键,内存占用量较大,同时用户信息再redis中比较分散,缺少内聚性,所以这种方案基本上没有实用性,是低内聚的表现。但是程序设计助球队是高内聚低耦合(高内聚就是把所有相关联的东西放在一起;耦合指的是两个代码/模块之间的关联关系,关联关系越大,相互的影响就越大,耦合度就越高)

2.序列化字符串类型——例如JSON格式的字符串

set user:1 经过序列化后的用户对象字符串

优点:针对总是以整体作为操作的信息比较合适编程成也比较简单,同时。如果序列化方案选择合适,内存使用的效率也很高

缺点:本身序列化和反序列化需要一定的开销,同时如果总是操作个别属性则不是很灵活

3.哈希类型

hmset user:1 name John age 23 address Beijing

优点:简单直观灵活。尤其是针对信息的局部变更和获取

缺点

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

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

相关文章

AI智能跟踪技术核心!

1. 目标检测技术 在视频序列的第一帧中,通过目标检测算法确定要追踪的目标对象的位置和大小。 技术实现:目标检测算法可以基于传统的图像处理技术,如颜色、纹理、形状等特征,也可以基于深度学习方法,如卷积神经网络&…

利用人工智能改变视频智能

人工智能视频分析正在将安全摄像头变成强大的传感器,可以改善您监控站点安全的方式。借助人工智能 (AI),摄像头可以独立准确地检测威胁,而无需人工不断观看视频。 这并不奇怪——过去几年,这一直是安全行业协会 (SIA) 提出的几大…

Linux命令--05----find 日志

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 find1.语法语法&#xff1a;find 目标目录(路径) <选项> 参数 2.示例3.find 结合 xargs4.案例.* 模糊匹配 绝对路径 find 在 Linux 命令中&#xff0c;fin…

nginx架构篇(三)

文章目录 一、Nginx实现服务器端集群搭建1.1 Nginx与Tomcat部署1. 环境准备(Tomcat)2. 环境准备(Nginx) 1.2. Nginx实现动静分离1.2.1. 需求分析1.2.2. 动静实现步骤 1.3. Nginx实现Tomcat集群搭建1.4. Nginx高可用解决方案1.4.1. Keepalived1.4.2. VRRP介绍1.4.3. 环境搭建环境…

银河麒麟V10系统崩溃后的处理

银河麒麟V10系统崩溃后的处理 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 当银河麒麟桌面操作系统V10崩溃无法启动时&#xff0c;直接使用备份还原工具不可行。此时&#xff0c;应采取以下步骤&#xff1a; 进入救援模式或LiveCD&#x…

基于Java springboot+mybatis 网上商城系统

基于Java springbootmybatis 网上商城系统 一、系统介绍二、功能展示1.主页(客户)2.登陆&#xff08;客户&#xff09;3.注册&#xff08;客户&#xff09;4.购物车(客户)5.我的订单&#xff08;客户&#xff09;6.用户管理&#xff08;管理员&#xff09;7.分类管理&#xff0…

ICM20948 DMP代码详解(35)

接前一篇文章&#xff1a;ICM20948 DMP代码详解&#xff08;34&#xff09; 上一回终于解析完了inv_icm20948_initialize_lower_driver函数&#xff0c;本回回到icm20948_sensor_setup函数&#xff0c;继续往下进行解析。为了便于理解和回顾&#xff0c;再次贴出icm20948_senso…

缓存中间件Redis进阶之路二(快速安装Redis)

一、快速安装Redis “工欲善其事&#xff0c;必先利其器”&#xff0c;在代码实战之前&#xff0c;需要在本地开发环境安装好Redis。对于不同的开发环境&#xff0c;Redis的安装及配置方式也不尽相同&#xff0c;本文将以Windows开发环境为例&#xff0c;介绍Redis的快速安装与…

Kafka 为什么这么快?

Kafka 是一款性能非常优秀的消息队列&#xff0c;每秒处理的消息体量可以达到千万级别。今天来聊一聊 Kafka 高性能背后的技术原理。 1 批量发送 Kafka 收发消息都是批量进行处理的。我们看一下 Kafka 生产者发送消息的代码&#xff1a; private Future<RecordMetadata>…

【数据结构C语言】【入门】【首次万字详细解析】入门阶段数据结构可能用到的C语言知识,一章让你看懂数据结构!!!!!!!

前言&#xff1a;欢迎各位光临本博客&#xff0c;这里小编带你直接手撕入门阶段的数据结构的C语言知识&#xff0c;让你不再看见数据结构就走不动道。文章并不复杂&#xff0c;愿诸君耐其心性&#xff0c;忘却杂尘&#xff0c;道有所长&#xff01;&#xff01;&#xff01;&am…

论文阅读 - MDFEND: Multi-domain Fake News Detection

https://arxiv.org/pdf/2201.00987 目录 ABSTRACT INTRODUCTION 2 RELATED WORK 3 WEIBO21: A NEW DATASET FOR MFND 3.1 Data Collection 3.2 Domain Annotation 4 MDFEND: MULTI-DOMAIN FAKE NEWS DETECTION MODEL 4.1 Representation Extraction 4.2 Domain Gate 4.…

【Stm32】从零建立一个工程

这里我们创建“STM32F103”系列的文件&#xff0c;基于“固件库” 1.固件库获取 https://www.st.com.cn/zh/embedded-software/stm32-standard-peripheral-libraries.html 2.使用Keil创建.uvprojx文件 前提是已经下载好了“芯片对应的固件” 3.复制底层驱动代码 将固件库下的…

【图表如何自动排序】

前提&#xff1a;有这样一个表&#xff1a;第1列为姓名&#xff08;用字母A~I代替&#xff09;&#xff0c;第2列假设为销量 用到的函数&#xff1a; Sort(自动排序的区域&#xff0c;以哪一列为基础来排序&#xff0c;降序or升序&#xff09; Choosecols(选择的区域&#xf…

Spring在不同类型之间也能相互拷贝?

场景还原 日常开发中&#xff0c;我们会定义非常多的实体&#xff0c;例如VO、DTO等&#xff0c;在涉及实体类的相互转换时&#xff0c;常使用Spring提供的BeanUtils.copyProperties&#xff0c;该类虽好&#xff0c;可不能贪用。 这不在使用过程中就遇到一个大坑&#xff0c…

二十、功率放大电路

功率放大电路 1、乙类功率放大器的工作过程以及交越失真; 2、复合三极管的复合规则 3、甲乙类功率放大器的工作原理、自举过程

智谱AI:CogVideoX-2b——视频生成模型的得力工具

智谱AI&#xff1a;CogVideoX-2b——视频生成模型的得力工具 文章目录 CogVideoX 简介——它是什么&#xff1f;CogVideoX 具体部署与实践指南一、创建丹摩实例二、配置环境和依赖三、上传模型与配置文件四、开始运行五、Web UI 演示 CogVideoX 简介——它是什么&#xff1f; …

电线覆盖物检测数据集 气球风筝鸟巢 1300张 voc yol

电线覆盖物检测数据集 气球风筝鸟巢 1300张 voc yol 电线覆盖物检测数据集 数据集描述 该数据集是一个专门用于检测电线及其周围环境中的异物的数据集&#xff0c;旨在帮助研究人员和开发者训练和评估基于深度学习的目标检测模型。数据集涵盖了五种常见的电线覆盖物类型&…

基于 Qwen2.5-Coder 模型和 CrewAI 多智能体框架,实现智能编程系统的实战教程

9 月 19 日&#xff0c;阿里开源了 Qwen2.5 系列大模型全家桶&#xff1a;除常规的语言模型 Qwen2.5 之外&#xff0c;还发布了专门针对编程的Qwen2.5-Coder模型和数学的 Qwen2.5-Math 模型&#xff0c;并且针对每个模型都提供了不同规模参数版本&#xff0c;包括&#xff1a; …

yolov8模型在手部关键点检测识别中的应用【代码+数据集+python环境+GUI系统】

yolov8模型在手部关键点检测识别中的应用【代码数据集python环境GUI系统】 背景意义 在手势识别、虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;等领域&#xff0c;手部关键点检测为用户提供了更加自然、直观的交互方式。通过检测手部关键点&#…

通信工程学习:什么是VLAN虚拟局域网

VLAN&#xff1a;虚拟局域网 VLAN&#xff08;Virtual Local Area Network&#xff0c;虚拟局域网&#xff09;是一种将物理局域网在逻辑上划分成多个广播域的通信技术。以下是关于VLAN的详细解释&#xff1a; 一、VLAN虚拟局域网的定义与概述 VLAN通过逻辑方式将网络中的设备…