【redis】数据类型之hash

Redis中的Hash数据类型是一种用于存储键值对集合的数据结构。与Redis的String类型不同,Hash类型允许你将多个字段(field)和值(value)存储在一个单独的key下,从而避免了将多个相关数据存储为多个独立的key。这样做的好处是减少了key的数量,使得数据的管理和操作更加高效。

hash这个数据类型类似java中的HashMap,都由key-value键值对组成。

有关hash类型的命令可以通过help @hash命令来查看。有关命令的使用可以通过help 命令来查看,例如help hset

HSET

hset:设置hash指定字段的值。

语法:

HSET key field value [field value ...]

使用:

127.0.0.1:6379> hset h1 name morris age 18
(integer) 2

HGET

hget:获取hash指定字段的值。

语法:

HGET key field

使用:

127.0.0.1:6379> hget h1 name
"morris"

HKEYS

hkeys:获取hash所有的字段。

语法:

HKEYS key

使用:

127.0.0.1:6379> hkeys h1
1) "name"
2) "age"

HVALS

hvals:获取hash所有的值。

语法:

HVALS key

使用:

127.0.0.1:6379> hvals h1
1) "morris"
2) "18"

HGETALL

hgetall:获取hash所有的字段和值。

语法:

HGETALL key

使用:

127.0.0.1:6379> hgetall h1
1) "name"
2) "morris"
3) "age"
4) "18"

HEXISTS

hexists:判断hash中某个字段是否存在。

语法:

HEXISTS key field

使用:

127.0.0.1:6379> hexists h1 name
(integer) 1

HLEN

hlen:返回hash中键值对的个数。

语法:

HLEN key

使用:

127.0.0.1:6379> hlen h1
(integer) 2

HINCRBY

hincrby:给hash中指定字段的值增加一个整型。

语法:

INCRBY key increment

使用:

127.0.0.1:6379> hincrby h1 age 1
(integer) 19

HINCRBYFLOAT

hincrbyfloat:给hash中指定字段的值增加一个浮点型。

语法:

INCRBYFLOAT key increment

使用:

127.0.0.1:6379> hincrbyfloat h1 age 0.5
"19.5"

HSTRLEN

hstrlen:获取hash指定字段的值的长度。

语法:

HSTRLEN key field

使用:

127.0.0.1:6379> hstrlen h1 name
(integer) 6

HMSET

hmset:批量设置hash,这个跟hset命令一样了,只是hset只支持设置一个,能保证原子性。

语法:

HMSET key field value [field value ...]

使用:

127.0.0.1:6379> hmset k k1 v1 k2 v2 k3 v3
OK127.0.0.1:6379> hgetall k
1) "k1"
2) "v1"
3) "k2"
4) "v2"
5) "k3"
6) "v3"

HMGET

hmget:批量获取hash的字段对应的值。

语法:

HMGET key field [field ...]

使用:

127.0.0.1:6379> hmget k k1 k2 k3
1) "v1"
2) "v2"
3) "v3"

HSETNX

hsetnx:字段不存在则设置成功,类似setnx命令,只能设置一个字段。

语法:

HSETNX key field value

使用:

127.0.0.1:6379> hsetnx kk name bob
(integer) 1

HDEL

hdel:删除字段。

语法:

HDEL key field [field ...]

使用:

127.0.0.1:6379> hdel k k1
(integer) 1127.0.0.1:6379> hkeys k
1) "k2"
2) "k3"

HRANDFIELD

hrandfield:用于随机返回一个或多个存储在指定key中的哈希表(hash)里字段的值。

语法:

HRANDFIELD key [count [WITHVALUES]]

使用:

127.0.0.1:6379> hrandfield h1 1 withvalues
1) "age"
2) "18"

HSCAN

hscan:用于迭代哈希表(Hashes)中键值对的命令,有点类似于SCAN。

语法:

HSCAN key cursor [MATCH pattern] [COUNT count]

使用:

127.0.0.1:6379> hscan h1 0 MATCH a* COUNT 1
1) "0"
2) 1) "age"2) "18"

内部编码

哈希类型的内部编码有两种:

  • 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> object encoding h1
"ziplist"127.0.0.1:6379> hset y str "one string is bigger than 64 byte...............one string is bigger than 64 byte..............."
(integer) 1127.0.0.1:6379> object encoding y
"hashtable"

使用场景

hash常用来存储关系型数据库中的记录。

假设现在数据库有一张user表,如下:

1653388638422.png

下面给出三种方案来缓存用户信息。

  1. 使用原生字符串类型存储,每个属性一个键。

1653388638821.png

127.0.0.1:6379> mset user:1:name morris user:1:age 18 user:1:city beijing
OK127.0.0.1:6379> mset user:2:name bob user:1:age 20 user:1:city hongkong
OK127.0.0.1:6379> keys user:1:*
1) "user:1:age"
2) "user:1:name"
3) "user:1:city"127.0.0.1:6379> mget user:1:name user:1:age user:1:city
1) "morris"
2) "20"
3) "hongkong"

优点:简单直观,每个属性都支持更新操作。

缺点:占用过多的键,内存占用量较大,同时用户信息内聚性比较差。

  1. 将数据库中的一行记录序列化为json,用一个key保存。
127.0.0.1:6379> set user:1 '{"id":1,"name":"morris","age":18,"city":"beijing"}'
OK127.0.0.1:6379> get user:1
"{"id":1,"name":"morris","age":18,"city":"beijing"}"127.0.0.1:6379> set user:2 '{"id":2,"name":"bob","age":20,"city":"hongkong"}'
OK127.0.0.1:6379> get user:2
"{"id":2,"name":"bob","age":20,"city":"hongkong"}"

优点:简化编程,如果合理的使用序列化可以提高内存的使用效率。

缺点:序列化和反序列化有一定的开销,同时每次更新属性都需要把全部数据取出进行反序列化,更新后再序列化到Redis中。

  1. 使用hash存储,每行记录的一列对应一个field-value。

1653388639211.png

127.0.0.1:6379> hset user:1 name morris age 18 city beijing
(integer) 3127.0.0.1:6379> hset user:2 name bob age 20 city hongkong
(integer) 3127.0.0.1:6379> hgetall user:1
1) "name"
2) "morris"
3) "age"
4) "18"
5) "city"
6) "beijing"127.0.0.1:6379> hgetall user:2
1) "name"
2) "bob"
3) "age"
4) "20"
5) "city"
6) "hongkong"

优点:简单直观,如果使用合理可以减少内存空间的使用。

缺点:要控制哈希在ziplist和hashtable两种内部编码的转换,hashtable会消耗更多内存。

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

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

相关文章

element-plus 解决el-dialog背后的页面滚动问题,及其内容有下拉框出现错位问题

这个问题通常是因为 el‑dialog 默认会锁定 body 的滚动&#xff08;通过给 body 添加隐藏滚动条的样式&#xff09;&#xff0c;从而导致页面在打开对话框时跳转到顶部。解决方法是在使用 el‑dialog 时禁用锁定滚动功能。 <el-dialogv-model"dialogVisible":lo…

SpringBoot+Dubbo+zookeeper 急速入门案例

项目目录结构&#xff1a; 第一步&#xff1a;创建一个SpringBoot项目&#xff0c;这里选择Maven项目或者Spring Initializer都可以&#xff0c;这里创建了一个Maven项目&#xff08;SpringBoot-Dubbo&#xff09;&#xff0c;pom.xml文件如下&#xff1a; <?xml versio…

游戏引擎学习第96天

讨论了优化和速度问题&#xff0c;以便简化调试过程 节目以一个有趣的类比开始&#xff0c;提到就像某些高端餐厅那样&#xff0c;菜单上充满了听起来陌生或不太清楚的描述&#xff0c;需要依靠服务员进一步解释。虽然这听起来有些奇怪&#xff0c;但实际上&#xff0c;它反映…

Spring Boot + MyBatis Field ‘xxx‘ doesn‘t have a default value 问题排查与解决

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 执行代码的时候,出现某个字段无法添加 ### Error updating database. Cause: java.sql.SQLException: Field e_f_id doesnt have a default value ### The error may exist in cn

【分布式理论9】分布式协同:分布式系统进程互斥与互斥算法

文章目录 一、互斥问题及分布式系统的特性二、分布式互斥算法1. 集中互斥算法调用流程优缺点 2. 基于许可的互斥算法&#xff08;Lamport 算法&#xff09;调用流程优缺点 3. 令牌环互斥算法调用流程优缺点 三、三种算法对比 在分布式系统中&#xff0c;多个应用服务可能会同时…

redo和binlog区别

事务是数据库区别于文件系统的最重要功能&#xff0c;数据库事务支持ACID四个特性&#xff0c;其中I&#xff1a;隔离性是通过锁的方式实现的&#xff0c;剩下的A&#xff1a;原子性 C&#xff1a;一致性 D&#xff1a;持久性是通过redo日志、undo日志、binlog日志来实现的。 我…

安宝特方案 | AR助力制造业安全巡检智能化革命!

引言&#xff1a; 在制造业中&#xff0c;传统巡检常面临流程繁琐、质量波动、数据难以追溯等问题。安宝特AR工作流程标准化解决方案&#xff0c;通过增强现实AR技术&#xff0c;重塑制造业安全巡检模式&#xff0c;以标准化作业流程为核心&#xff0c;全面提升效率、质量与…

芋道源码(无遮羞布版)Spring Boot 全景指南

芋道源码&#xff08;无遮羞布版&#xff09;Spring Boot 全景指南 项目地址:https://gitcode.com/gh_mirrors/ru/ruoyi-spring-boot-all 一、项目目录结构及介绍 芋道源码&#xff08;ruoyi-spring-boot-all&#xff09;项目基于Spring Boot构建&#xff0c;旨在提供一个全…

科技查新过不了怎么办

“科技查新过不了怎么办&#xff1f;” “科技查新不通过的原因是什么&#xff1f;” 想必这些问题一直困扰着各位科研和学术的朋友们&#xff0c;尤其是对于查新经验不够多的小伙伴&#xff0c;在历经千难万险&#xff0c;从选择查新机构、填写线上委托单到付费&#xff0c;…

【AI时代】Page Assist - 本地 AI 模型的 Web UI (谷歌浏览器) 本地DeepSeek启用联网功能

Page Assist - 本地 AI 模型的 Web UI 一、部署本地模型 参考教程&#xff1a;https://blog.csdn.net/Bjxhub/article/details/145536134二、安装插件 Page Assist 浏览器谷歌商店搜索 Page Assist &#xff0c;安装该插件。 注意&#xff1a;需要一点科学的魔法。 三、使用…

SSM开发(十三) Spring的入门及demo应用(含完整源码)

目录 一、认识Spring框架 二、Spring框架优缺点 三、Spring框架体系结构 Spring结构图 核心容器Core Container模块 数据访问/集成Data Access/Integration Web AOP and Instrumentation 消息(Messaging)——Messaging 测试(Test) 四、Spring项目布局 五、Spring…

collabora online+nextcloud+mariadb在线文档协助

1、环境 龙蜥os 8.9 docker 2、安装docker dnf -y install dnf-plugins-core dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sed -i shttps://download.docker.comhttps://mirrors.tuna.tsinghua.edu.cn/docker-ce /etc/yum.repos.…

Spring MVC 拦截器(Interceptor)与过滤器(Filter)的区别?

1、两者概述 拦截器&#xff08;Interceptor&#xff09;&#xff1a; 只会拦截那些被 Controller 或 RestController 标注的类中的方法处理的请求&#xff0c;也就是那些由 Spring MVC 调度的请求。过滤器&#xff08;Filter&#xff09;&#xff1a; 会拦截所有类型的 HTTP …

音频知识基础

音频知识基础 声音属性声音度量人耳特性通道数音频数字化传输接口 声音属性 响度 响度是人耳对声音强弱的主观感受&#xff1b; 主要和声波的振幅相关&#xff0c;同时也和频率有一定关系&#xff1b; 音调 音调是人耳对声音高低的主观感受&#xff1b; 主要与频率相关&#…

SQL Server 逻辑查询处理阶段及其处理顺序

在 SQL Server 中&#xff0c;查询的执行并不是按照我们编写的 SQL 语句的顺序进行的。相反&#xff0c;SQL Server 有自己的一套逻辑处理顺序&#xff0c;这个顺序决定了查询的执行方式和结果集的生成。了解这些处理阶段和顺序对于优化查询性能和调试复杂查询非常重要。 SQL …

Ruby 日期 时间处理指南

Ruby 日期 & 时间处理指南 在软件开发中,日期和时间处理是不可或缺的一部分。对于Ruby这样的编程语言,它提供了强大的库来帮助开发者轻松处理日期和时间相关的任务。本文将详细介绍Ruby中的日期和时间处理,包括常用类、方法以及最佳实践。 Ruby日期与时间类 Ruby中处…

微信小程序文件流转base64文件,wx.arrayBufferToBase64()方法已弃用

wx.arrayBufferToBase64 方法在微信小程序的基础库版本 2.4.0 起已废弃&#xff0c;不建议继续使用。 我们可以将ArrayBuffer 转换为 base64&#xff0c;使用base64-js来实现转换。具体操作如下&#xff1a; 1、安装base64-js,可以通过npm进行安装&#xff0c;或者从github获取…

CTF中PHP的一些函数(学习记录)

isset()函数用于检查一个变量是否已经被设置并且非NULL empty()函数用于检查一个变量是否为空 strpos()函数用于查找一个字符串在另一个字符串中首次出现的位置 preg_match()函数是一个强大的工具&#xff0c;用于执行正则表达式匹配。它搜索字符串中与给定模式匹配的内容 va…

HTTP请求响应分析:HTTP/1.1→HTTP/2

1. HTTP协议概览 HTTP&#xff08;HyperText Transfer Protocol&#xff09;是客户端&#xff08;浏览器&#xff09;与服务器通信的基础协议&#xff0c;其核心由请求消息&#xff08;Request&#xff09;和响应消息&#xff08;Response&#xff09;构成。当前主流版本为HTT…

二、通义灵码插件保姆级教学-IDEA(使用篇)

一、IntelliJ IDEA 中使用指南 1.1、代码解释 选择需要解释的代码 —> 右键 —> 通义灵码 —> 解释代码 解释代码很详细&#xff0c;感觉很强大有木有&#xff0c;关键还会生成流程图&#xff0c;对程序员理解业务非常有帮忙&#xff0c;基本能做到哪里不懂点哪里。…