Redis数据结构之哈希表

这里的哈希表说的是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.xdnf.cn/news/146172.html

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

相关文章

linux 操作系统下dhcrelay命令介绍和案例应用

linux 操作系统下dhcrelay命令介绍和案例应用 dhcrelay是一个用于DHCP(动态主机配置协议)中继的命令,主要功能是在没有本地DHCP服务器的子网中转发DHCP请求。这使得不同子网的DHCP客户端能够与位于其他子网中的DHCP服务器进行通信。 dhcrela…

基于微信小程序的购物系统+php(lw+演示+源码+运行)

基于微信小程序的购物系统 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了基于微信小程序的购物系统的开发全过程。通过分析基于微信小程序的购物系统管理的不足,创建了一个计算机管理基于微信小…

如何使用 Python 连接 MySQL 数据库?什么是 ORM(对象关系映射),如何使用

数据库是现代软件开发中的核心部分,而 Python 作为一种流行的编程语言,广泛应用于数据处理和分析工作。通常我们需要通过 Python 连接数据库并执行一些常见的操作,如插入、查询、更新和删除数据。在实际开发中,MySQL 是非常常用的…

LeetCode[中等] 155. 最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int get…

线程知识点补充

我们之前: 主线程下来,调用了一个方法run方法,方法执行完后再继续往下走主线程。 咱们期望: 两个同时执行,交替执行。 一些核心概念说明: 一个程序写好是静态的,给他运行起来就是一个进程了…

java计算机毕设课设—土地档案管理系统(附源码、文章、相关截图、部署视频)

这是什么系统? 资源获取方式在最下方 java计算机毕设课设—土地档案管理系统(附源码、文章、相关截图、部署视频) 土地档案管理系统是一种将传统纸质档案进行数字化管理的软件。通过该系统,用户能够高效地进行土地档案的存储、查阅、修改和删除等操作…

unity3d入门教程八-飞机大战

unity3d入门教程八-飞机大战 19.2竖屏设置19.3主控脚本19.4制作子弹19.5制作飞机19.6制作怪物19.7击中目标19.8随机生成怪物19.9预制体怪物随机更换头像19.10怪物相关优化19.11游戏背景19.12游戏最终优化一、 HP显示二、怪物预制体三、分值显示四、背景音乐 19.2竖屏设置 切换到…

鸿蒙媒体开发系列08——AudioCapturer录制音频

如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。 1、概述 我们在鸿蒙媒体开发系列07——AVRecorder音频录制中我们了解到&#xff0c…

【后端开发】JavaEE初阶—线程的理解和编程实现

前言: 🌟🌟本期讲解多线程的知识哟~~~,希望能帮到屏幕前的你。 🌈上期博客在这里:【后端开发】JavaEE初阶——计算机是如何工作的???-CSDN博客 🌈感兴趣的小伙…

Linux介绍;Linux安装;Linux常见错误

一,Linux简介 1.1操作系统 指人和计算机硬件沟通交流的平台。 1.2常见的操作系统 1.21 PC windows MacOS Linux 1.22 移动端 Android IOS 鸿蒙 塞班 1.3什么是Linux Linux,一般指GNU/Linux(单独的Linux内核并不可直接使用&…

【漏洞复现】泛微OA E-Office jx2_config.ini 敏感信息泄漏漏洞

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

buucft hashcat

使用文本编辑器打开时乱码 使用010editor打开发现时xml文档 拷贝到kali,使用binwalk查看,发现时xml文档,改后缀名为ppt。打开发现有密码 Accent OFFICE Password Recovery 64位-Office密码恢复软件 v20.09 免费版 - 下载吧 试试这个Accent O…

飞腾计算模块RapidIO性能测试

1、背景介绍 飞腾计算模块采用FT2000 64核处理器,搭配Tsi721 PCIE转RapidIO芯片,实现飞腾平台下的SRIO数据通信。操作系统采用麒麟信安,内核版本4.19.90. 2、驱动加载 驱动加载部分类似之前写过的X86平台下的RapidIO驱动加载,具…

Ngnix 在windows上的简单使用

安装 下载链接: nginx: download 选择页面中 Stable version 下的windows版本直接下载解压到本地。 运行nginx: 解压到本地后,结构如图: cmd 进入到上图的根目录,运行 start nginx ,即可开启。 打开 http://localhost 进行查看,如果正常打开nginx的测试页面,则说…

借10万块,年化利息明明是3.8%,为啥就变成了2.07%?

今天咱们来聊一聊贷款的奥秘,特别是那个令人爱恨交织的年利率。听起来直观得很,3.8%就像是每年给银行支付贷款总额的3.8%作为利息,但实际上,这里面的学问挺深的。有时候,名义上的3.8%年化,最终一算&#xf…

电子元器件之MOS管,附上几个常用MOS管电路和仿真。

MOS管是一种常用的电子元器件。 1.MOS管的类别 MOSFET简称MOS,是一种绝缘栅型场效应管。按照类别可以分为增强型mos管和耗尽型mos管。 导电沟道的形成方式‌ 增强型MOS管:在没有外加电压时,源极和漏极之间没有导电沟道存在。只有当栅极电…

打开Anaconda Navigator没反应,卡在Initializing...的解决方案

一、问题描述 打开Anaconda Navigator时,一直卡在Initializing...没反应,如下图所示: 二、解决方案 进入Anaconda安装目录下找到并打开文件夹attribution(笔者Anaconda安装目录在D盘下,读者可自行查找自己安装目录中…

基于stm32物联网身体健康检测系统

在当今社会,由于经济的发展带来了人们生活水平不断提高,但是人们的健康问题却越来越突出了,各种各样的亚健康随处可在,失眠、抑郁、焦虑症,高血压、高血糖等等侵袭着人们的健康,人们对健康的关注达到了一个…

超越极限!Qwen2.5 助力多领域智能应用

前沿科技速递🚀 近日,Qwen2.5 系列重磅发布,成为开源语言模型领域的又一里程碑。作为一款全新的通用语言模型,Qwen2.5 在支持自然语言处理的基础上,还在编程、数学等领域进行了专项优化。Qwen2.5 模型支持长文本生成&a…

2024年中国研究生数学建模竞赛D题“大数据驱动的地理综合问题”全析全解

问题一解答:降水量与土地利用/土地覆被类型的时空演化特征描述 1. 降水量的描述性统计方法 降水量是一个连续变化的变量,可以通过以下几种描述性统计方法进行时空演化特征的总结: 平均降水量:统计中国范围内1990至2020年各年份的…