当前位置: 首页 > news >正文

Redis远程字典服务器(5) —— hash类型详解

目录

一,hash基本情况

二,hash常用命令详解

2.1 hset,hget,hexists,hdel

2.2 hexists,hdel

2.3 hkeys,hvals

2.4 hgetall,hmget

2.5 hlen,hsetnx

2.6 hincrby,incrbyfloat

三,hash编码方式

3.1 ziplist

3.2 hashtable

3.3 演示

四,应用场景


一,hash基本情况

哈希是我们目前接触到的数据结构中最重要的一个:

  1. 日常开发中,出场频率非常高
  2. 面试中,非常重要的考点

 Redis自身已经是键值对结构了,就是通过哈希的方式来组织的,而hash类型,就是把key这一层组织完之后,到了value这一层,其中的一种类型还可以再是一个哈希表:

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

关于哈希的详细解释以前已经介绍过,传送门:C++&&数据结构——哈希表_c++哈希表-CSDN博客 

二,hash常用命令详解

2.1 hset,hget,hexists,hdel

hset就是同时建立key-valuefield-value键值对,前者是Redis的键值对,后者是value的键值对hget就是查询键值对:

2.2 hexists,hdel

hexists的作用是判断指定key的field是否存在,存在就返回1,否则返回0;hdel就是删除,删除key的某一个field-value,当key的field数量为0时,会顺带把key一起删了:

2.3 hkeys,hvals

hkeys作用是根据key找到所有的field并打印出来;hvals作用是获取所有的field和value,但不会显示field:

当然,像这样的“查询所有”的这种操作,也会有和keys *一样的问题的,但是也有解决方法,就是hscan遍历Redis的hash类型,属于“渐进式遍历”,我们后面再讲~ 

2.4 hgetall,hmget

hgetall相当于把上面两个命令合起来,同时显示field和value,以两两交替的方式打印出来;hgetall是一次查所有,但是我们有时只要查一部分,所以可以用hmget,就是根据命令行输入field获取对应value,可以一次查多个:

注意

  1. hgetall同样有keys * 的问题
  2. hmget的显示顺序和我们命令行输入的field的顺序是一致的
  3. 也有hmset一次设置多个field和value,但是不用,因为hset已经可以支持一次设置多个field和value了

2.5 hlen,hsetnx

hlen是获取hash中field-value键值对的个数;hsetnx和前面的setnx一样,如果field不存在就创建,存在就直接返回:

2.6 hincrby,incrbyfloat

hash类型中field的value也可以当作int处理,hincrby可以加减整数,incrbyfloat可以加减小数:

三,hash编码方式

3.1 ziplist

我们经常用到的压缩有rar,zip,7z等,通常是一些具体的压缩算法,本质是针对数据进行重新编码,不同的数据有不同的特定,结合这些特点进行精妙的计算,重新编码过后,就嫩缩小数据的体积:

 ziplist同理,内部的数据结构也是精心设计的,表示一个普通的哈希表,可能会浪费一定的空间(哈希是一个数组,数组上有些位置有元素,有些没有),使用ziplist就可以节省空间,内部的具体实现我们以后再看源码解析

当然,有好处自然会有坏处:读写元素较慢,如果元素较少,慢的并不明显,所以当哈希的元素个数较少,就会用ziplist去优化

当哈希类型元素个数⼩于 hash-max-ziplist-entries 配置(默认 512 个,我们一般会根据业务修改)、 同时所有值都⼩于 hash-max-ziplist-value 配置(默认 64 字节)时,Redis 会使⽤ ziplist 作为哈 希的内部实现,ziplist 使⽤更加紧凑的结构实现多个元素的连续存储,所以在节省内存⽅⾯⽐ hashtable 更加优秀。

3.2 hashtable

只有“元素个数太少”,“长度比较短”两个条件都具备,才会优化成ziplist,当hash类型⽆法满⾜ 这两个条件时,Redis 会使⽤ hashtable 作为哈希 的内部实现,因为此时 ziplist 的读写效率会下降,⽽ hashtable 的读写时间复杂度为 O(1)。

3.3 演示

元素很多时就用hashtable来存 

四,应用场景

最主要的应用场景还是作为缓存来使用,但是hash类型作为缓存有点特别,下面来具体讲讲

string也是可以用作缓存的,但是Redis是经常和MySQL打交道的,所以如果要存储MySQL表里面那样的结构化数据,使用hash类型更合适一些:

其实上述场景也可以用strin类型也能做到,需要用到 json 这样的数据格式

  1. 但是如果使用json的格式来表示上面的user时,如果我只想获取或修改其中的一个field,就需要把整个json都读出来,解析成对象,然后重写对应的field,再写回去,效率变低
  2. 而使用hash,就可以使用field表示对象的每个舒徐(相当于操作MySQL的每个列),次数就可以非常方便地修改任何一个属性的值了
  3. 但是使用hash的方式,确实读写field更直观和高效,但是付出的是空间的代价,而且还需要控制hash再ziplist和hashtable两种内部编码的转换,可能会造成较大的内存消耗

相关文章:

Redis远程字典服务器(5) —— hash类型详解

目录 一,hash基本情况 二,hash常用命令详解 2.1 hset,hget,hexists,hdel 2.2 hexists,hdel 2.3 hkeys,hvals 2.4 hgetall,hmget 2.5 hlen,hsetnx 2.6 hincrby&am…...

MySQL | 行锁——记录锁、间隙锁 、临键锁、插入意向锁

1、InnoDB中的行锁 行锁(Row Lock) 也称为记录锁,顾名思义,就是锁住某一行(某条记录row)。需要注意的是,MySQL服务器层并没有实现行锁机制,行级锁只在存储引擎层实现。 优点&#x…...

【网络编程】TCP通信基础模型实现

tcpSer.c #include <myhead.h> #define SER_IP "192.168.119.143" // 设置IP地址 #define SER_PORT 6666 // 设置端口号 int main(int argc, const char *argv[]) {// 1.创建socketint serfd socket(AF_INET, SOCK_STREAM, 0);// 参数1表示ipv4// 参数2表…...

css rem之2024

话题开始前 我们都知道1rem是等于html fontSize标签的字体大小的&#xff0c;我们主要用来做移动端网页设计稿等比例在手机上面的显示。 看到的问题 这个html fontsize的大小是通过js动态计算的&#xff0c;而这个js的运行时晚于html渲染的&#xff0c;所以会导致一个问题&am…...

python自动化笔记:pytest框架

目录 一、pytest介绍二、测试用例命名规则2.1、pytest命名规则2.2、python命名规范 三、pytest运行方式3.1、主函数方式3.2、命令行方式3.3、通过pytest.ini的配置文件运行&#xff08;常用&#xff09; 四、跳过测试用例4.1 无条件跳过4.2 有条件跳过 五、用例的前后置&#x…...

wpf 路径动画 举例

先&#xff0c;我们需要在XAML中定义一个Path&#xff0c;这个Path将定义动画的路线。然后&#xff0c;我们将使用DoubleAnimationUsingPath来沿着这个路径移动一个元素&#xff08;比如一个矩形&#xff09;。 <Window x:Class"WpfApp.MainWindow" xmlns"…...

【C++】classes and object 2.8 取地址及const取地址操作符重载

这两个默认成员函数一般不用重新定义 &#xff0c;编译器默认会生成。 #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std; class Date { public:Date* operator&(){return this;}const Date* operator&()const{return this;} privat…...

milvus helm k8s开启监控

https://milvus.io/docs/monitor.md 文章写的很清晰 &#xff0c;我这边做一下个人补充&#xff0c;初版可能只是配置&#xff0c;具体的grafana 监控报表后期补一下。 架构如下&#xff1a; values.yaml 配置 enabled: true 改为true metrics:enabled: trueserviceMonitor:…...

牛奶饮用学习笔记

1. 常见牛奶类型 1.1 蒙牛-每日鲜语-0脂肪鲜牛奶 项目每100mL NRV%能量146kJ 能量计算 250 mL 146 kJ / 100 mL 365 kJ 250\text{mL}\times146\text{kJ}/100\text{mL} 365\text{kJ} 250mL146kJ/100mL365kJ 1.2 伊利-舒化-高钙型无乳糖牛奶 项目每100mL NRV%能量269kJ …...

php防止页面重复刷新或者重复提交

2.核心代码 显示的逻辑&#xff1a; //获取防止刷新的唯一标识符,start $intFlag substr(md5(time()),6); $strFlag BAOXIAOSS_.$my_user_id.$intFlag; $smarty->assign(check_is_agin_post, $strFlag); //获取防止刷新的唯一标识符,end注意&#xff1a;前端页面提交加入…...

Springboot3 配置sql打印到控制台

一、pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId><version>3.1.2</version></dependency> 二、application.yml com.lingyang.system # log4j2配…...

深入理解 GO 语言并发

1. 使用并发 在深入了解 Go 如何处理并发之前,先查看并发的概念。在计算机发展的早期阶段,计算机系统只有一个处理器负责执行所有指令。由于这种体系结构,计算机程序被编写成以串行的方式运行,在这种方式下,程序按照预定义的顺序逐个指令地执行。 随着计算机程序变得越来越…...

leetcode39组合总和

题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被选…...

【JPCS独立出版,EI稳定检索】2024年工业机器人与先进制造技术国际学术会议(IRAMT 2024,9月27-29)

2024年工业机器人与先进制造技术国际学术会议&#xff08;IRAMT 2024&#xff09;将于2024年9月27-29日在中国成都举办。 此次会议将围绕工业机器人、机电技术、机械及制造等领域的最新研究成果展开讨论&#xff0c;并广泛邀请了国内外领域内的著名专家与学者。会议旨在搭建一个…...

Fal.ai Flux 1-Pro/Viva.ai/哩布哩布AI:AI绘图部分免费工具+原图提示词Prompt

目录 #1 找软件 #2 懂提示词 #3 更难的一步&#xff0c;会英文 我个人认为&#xff0c;想要玩文生图&#xff0c;你要会3个步骤&#xff1a; #1 找软件 主流文生图软件&#xff1a;Midjourney、Stable Diffusion、Dall-E 3 巧了&#xff0c;我用的都是小众、免费的画笔工…...

C++学习笔记----2、使用C++进行优雅编程(十)---- 格式化

许多人因为编程风格的问题被搞得焦头烂额&#xff0c;就因为对于在if中使用几个空格争论不休&#xff0c;导致友谊的小船说翻就翻。如果公司有相应的编程规范&#xff0c;只能说你比较幸运。因为有可能你不喜欢这些规范&#xff0c;但做为一个正常人来讲&#xff0c;至少有规范…...

双指针| Java | (hot100) 力扣283, 11, 15, 42做题总结

leetcode 11 盛最多水的容器 双层for循环暴力 超出时间限制 class Solution {public int maxArea(int[] height) {int h0;int v0;for(int i0; i<height.length; i) {for(int ji1; j<height.length; j) {h Math.min(height[i],height[j]);v Math.max(v, h*(j-i));}}…...

matlab求解方程

【MATLAB】求解含有三角函数的方程_matlab求解三角函数方程-CSDN博客 Matlab求解方程或函数的根&#xff0c;root,fzero,solve,fsolve的区别_matlab root-CSDN博客 非线性方程(组)&#xff1a;MATLAB内置函数 solve, vpasolve, fsolve, fzero, roots [MATLAB] - GentleMin - …...

MySQL基础--视图,存储过程

介绍 视图是一种虚拟存在的表&#xff0c;视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的。 通俗的讲&#xff0c;视图只保存了查询的 SQL 逻辑&#xff0c;不保存查询结果&#xff0c;所以我…...

学习记录第二十六天

进程运行 1&#xff0c;子进程和父进程做相同的事----创建子进程 执行任务 2&#xff0c;子进程做与父进程不同的事 ----fork exec exec族 l VS v :主要是第二个参数的传参方式不同 p :表示寻找可执行文件 是通过PATA环境变量 e : 表示可以给…...

CATIA二次开发—API高效查询与架构解析

1. CATIA二次开发入门&#xff1a;从V5到V6的跨越挑战 如果你是从CATIA V5转向V6开发的工程师&#xff0c;可能会遇到这样的困惑&#xff1a;为什么在V5中得心应手的API调用方式&#xff0c;到了V6就完全不管用了&#xff1f;这就像突然从手动挡汽车换成了自动驾驶电动车&#…...

Jenkins Job DSL与Pipeline集成:现代DevOps工作流的10个最佳实践

Jenkins Job DSL与Pipeline集成&#xff1a;现代DevOps工作流的10个最佳实践 【免费下载链接】job-dsl-plugin A Groovy DSL for Jenkins Jobs 项目地址: https://gitcode.com/gh_mirrors/jo/job-dsl-plugin Jenkins Job DSL插件是现代DevOps自动化中不可或缺的工具&…...

别再折腾源码编译了!Ubuntu 22.04 LTS下用apt-get一键部署Asterisk PBX(附SIP账号配置详解)

别再折腾源码编译了&#xff01;Ubuntu 22.04 LTS下用apt-get一键部署Asterisk PBX&#xff08;附SIP账号配置详解&#xff09; 在开源通信领域&#xff0c;Asterisk作为功能最强大的PBX系统之一&#xff0c;长期困扰初学者的不是其丰富的功能&#xff0c;而是复杂的编译安装过…...

LinkedIn内容自动化发布:基于Node.js与Playwright的实战指南

1. 项目概述&#xff1a;为什么我们需要一个LinkedIn帖子自动化工具&#xff1f;如果你在运营个人品牌、管理公司账号&#xff0c;或者从事市场营销、招聘工作&#xff0c;那么对LinkedIn这个平台一定不陌生。它早已不是单纯的求职网站&#xff0c;而是全球最大的职业社交与内容…...

APP加固后审核被拒怎么办?iOS上架失败紧急解决流程与性能排查

花了大量心血开发的应用&#xff0c;提交到App Store后&#xff0c;等来的不是上架成功的邮件&#xff0c;而是一封来自苹果的审核拒绝信&#xff0c;理由还是“元数据被拒”或“二进制文件被拒”。更让人崩溃的是&#xff0c;排查下来&#xff0c;问题很可能指向刚做的iOS应用…...

iOS 27 开放 AI 生态@ACP#专业视频处理新标杆 ——GSV9001E/S 赋能 iPhone AI 多屏智能显示

一、iOS 27 开放 AI&#xff1a;引爆专业视频处理与多屏显示刚需iOS 27 全面开放第三方 AI 模型&#xff0c;iPhone 成为 AI 内容生成、多源信号整合、智能交互核心&#xff0c;直接催生AI 多屏拼接、无缝切换、画中画、HDR/SDR 转换、车载 / 工控多视图、医疗 AI 显示六大专业…...

GPU可编程性演进与自动化架构设计解析

1. GPU可编程性演进史&#xff1a;从固定管线到通用计算的蜕变之路在计算机图形学发展的早期阶段&#xff0c;GPU采用的是完全固定功能的图形管线架构。这种架构将整个渲染流程固化在硬件中&#xff0c;开发者只能通过OpenGL等图形API调用预设功能&#xff0c;无法对渲染过程进…...

学生党福音:用最便宜的TT马达和STM32F103C8T6,我焊出了能遥控的平衡小车

低成本DIY平衡小车&#xff1a;TT马达与STM32的极致性价比方案 当我在宿舍里第一次看到那辆价值近千元的商业平衡小车时&#xff0c;脑海中立刻浮现出一个问题&#xff1a;能不能用更便宜的材料实现类似功能&#xff1f;作为一名预算有限的学生&#xff0c;我开始探索如何用最…...

ubuntu 快捷键和常用命令

在使用 ubuntu 作为主机后&#xff0c;对于一些常见的操作&#xff0c;需要更加快捷的方式执行&#xff0c;这也是我选择 ubuntu 的主要原因。这篇文章手机 ubuntu 的快捷键和一些常用的命令。 快捷键 f2是重命名 linux控制台快捷键 ctrl a e CtrlShiftn 新终端 ShiftCt…...

智慧树刷课插件:3个核心功能帮你告别重复点击,学习效率提升300%

智慧树刷课插件&#xff1a;3个核心功能帮你告别重复点击&#xff0c;学习效率提升300% 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台繁琐的手动操作…...