[Redis]Hash类型

基本命令

hset命令

设置 hash 中指定的字段(field)的值(value)

返回值:添加的字段的个数(注意是添加的个数,而不包括修改的)

hset key field value [field value ...]

 hget命令

获取 hash 中指定字段的值

返回值:字段对应的值或者 nil

hget key field

 

hexists命令

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

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

hexists key field

 

 hdel命令

删除 hash 中指定的字段

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

hdel key field [field ...]

 

hkeys命令

获取 hash 中的所有字段

返回值:字段列表

hkeys key 

hvals命令

获取 hash 中的所有的值

返回值:所有的值

hvals key 

hgetall命令

获取 hash 中的所有字段以及对应的值

返回值:字段和对应的值

hgetall key

 

 hmget命令

⼀次获取 hash 中多个字段的值

返回值:字段对应的值或者 nil

HMGET key field [field ...]

 在使用 hgetall 时,如果哈希元素个数比较多,会存在阻塞 Redis 的可能。如果开发人员只需要获取部分 field,可以使用 HMGET,如果一定要获取全部 field,可以尝试使用 hscan 命令,该命令采用渐进式遍历哈希类型

 hlen命令

获取 hash 中的所有字段的个数,(返回键值对的个数)

返回值:字段个数

hlen key

 

hsetnx命令

在字段不存在的情况下,设置 hash 中的字段和值

返回值:1 表示设置成功,0 表示失败

hsetnx key field value

 

hincrby命令

将 hash 中字段对应的数值添加指定的值

返回值:该字段变化之后的值 

hincrby key field increment

hincrbyfloat命令

hincrby的浮点数版本

返回值:该字段变化之后的值

hincrbyfloat key field increment 

 

 

内部编码

哈希的内部编码有两种:

• ziplist(压缩列表):当哈希类型元素个数小于 hash-max-ziplist-entries 配置(默认 512 个) 同时所有值都小于 hash-max-ziplist-value 配置(默认 64 字节)时,Redis 会使用 ziplist 作为哈希的内部实现,ziplist 使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比 hashtable 更加优秀。

• hashtable(哈希表):当哈希类型无法满足 ziplist 的条件时,Redis 会使用 hashtable 作为哈希 的内部实现,因为此时 ziplist 的读写效率会下降,而 hashtable 的读写时间复杂度为 O(1)。

 

 总结:

默认设置下,通常内部编码是ziplist,当有value大于64字节时,内部编码会转换为 hashtable,或者field超过512个时,内部编码也会转换为 hashtable

使用场景

存储用户信息

结构

相比于使用 JSON 格式的字符串缓存用户信息,哈希类型变得更加直观,并且在更新操作上变得 更灵活。可以将每个用户的 id 定义为键后缀,多对 field-value 对应用户的各个属性

 

但是需要注意的是哈希类型和关系型数据库有两点不同之处:

• 哈希类型是稀疏的,而关系型数据库是完全结构化的,例如哈希类型每个键可以有不同的 field,而关系型数据库一旦添加新的列,所有行都要为其设置值,即使为 null

• 关系数据库可以做复杂的关系查询,而 Redis 去模拟关系型复杂查询,例如联表查询、聚合查询等基本不可能,维护成本高。 

缓存方式

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

set user:1:name James

set user:1:age 23

set user:1:city Beijing

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

缺点:占用过多的键,内存占用量较大,同时用户信息在 Redis 中比较分散,缺少内聚性,所以这种方案基本没有实用性。 

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

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

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

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

 3.哈希类型

hmset user:1 name James age 23 city Beijing

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

缺点:需要控制哈希在 ziplist 和 hashtable 两种内部编码的转换,可能会造成内存的较大消耗。 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ(三)SpringBoot整合,可靠性投递,死信队列,延迟队列,消费端限流,消息超时

文章目录 整合Springboot概述消费者生产者 消息可靠性投递故障原因解决方案生产者端消息确认机制(故障情况1)故障情况2解决方案故障情况3解决方案 消费端限流概念 消息超时概念队列层面:配置队列过期消息本身:配置消息过期 死信队…

GUI 01:GUI 编程概述,AWT 相关知识,Frame 窗口,Panel 面板,及监听事件的应用

一、前言 记录时间 [2024-05-30] 疑问导航 GUI 是什么?GUI 如何使用?GUI 有哪些应用? 学习目的 写一些自己心中的小工具;Swing 界面的维护;了解 MVC 架构,以及监听事件。 本文对图形用户界面&#xff08…

Django——Admin站点(Python)

#前言: 该博客为小编Django基础知识操作博客的最后一篇,主要讲解了关于Admin站点的一些基本操作,小编会继续尽力更新一些优质文章,同时欢迎大家点赞和收藏,也欢迎大家关注等待后续文章。 一、简介: Djan…

【Spring Cloud】微服务日志收集系统-ELK+Kafka

目录 任务背景本文相关文件资料Elasticsearch特性 LogstashKibanaELKELK的缺点引入消息中间件 ELKKafkaKafka概念 ELKKafka环境搭建1.将安装素材上传至服务器 cd /usr/local/soft2.防止Elasticsearch因虚拟内存问题启动失败3.创建镜像li/centos7-elasticsearch4.创建容器5.验证…

编译安装PHP服务(LAMP3)

目录 1.初始化设置,将安装PHP所需软件包传到/opt目录下 (1)关闭防火墙 (2)上传软件包到/opt目录 2.安装GD库和GD库关联程序,用来处理和生成图片 3.配置软件模块 4.编译及安装 5.优化把PHP 的可执行程…

先导微型数控桌面式加工中心

随着数控技术、传感器技术、人工智能等技术的不断发展,制造业的快速发展和技术的不断进步,小型五轴加工中心的性能将不断提升,五轴联动技术作为解决异性复杂零件高效优质加工问题的重要手段,使其具有更广泛的应用前景。小型五轴加…

【康耐视国产案例】智能AI相机:深度解析DataMan 380大视野高速AI读码硬实力

随着读码器技术的不断更新迭代,大视野高速应用成为当前工业读码领域的关键发展方向。客户对大视野高速读码器的需求源于其能显著减少生产成本并提升工作效率。然而,大视野应用场景往往伴随着对多个条码的读取需求,这无疑增加了算法的处理负担…

Playwright 自动化操作

之前有见同事用过playwright进行浏览器模拟操作,但是没有仔细了解,今天去详细看了下,发现playwright着实比selenium牛逼多了 Playwright 相对于selenium优点 1、自动下载chromnium, 无需担心chrome升级对应版本问题; 2、支持录屏操…

突破 LST/LRT 赛道中心化困境,Puffer Finance 何以重塑以太坊再质押未来

纵观过去的 2023 年,LST 赛道竞争进入“白热化”状态。去中心化、DeFi 增强、全链化成为市场争夺关键词,诸多 LST 赛道老牌项目纷纷陷入“中心化矛盾”,指责对方在以太坊去中心化进程中的不利作为。 在这样的竞争情形下,以太坊联…

从Socket到WebSocket

前言 不知道大家在学习网络编程的时候都是怎样的一种方式,我谨以此文章来记录我自己从头开始学习C网络编程时的经历,中间有许多我自己的一些想法和思考。当然作为一个刚开始学习的新手来说,有些内容也许不那么正确,只是代表了我在…

flink 操作mongodb的例子

简述 该例子为从一个Collection获取数据然后插入到另外一个Collection中。 Flink的基本处理过程可以清晰地分为以下几个阶段: 数据源(Source): Flink可以从多种数据源中读取数据,如Kafka、RabbitMQ、HDFS等。Flink会…

通过 CXCR4 靶向纳米线修补细胞表面以抑制癌症转移

引用信息 文 章:Cell surface patching via CXCR4-targeted nanothreads for cancer metastasis inhibition. 期 刊:Nature Communications(影响因子:16.6) 发表时间:2024/3/29 作 者&#xff1…

基于springboot实现大学生一体化服务平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现大学生一体化服务平台系统演示 摘要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统大学生综…

vivado 时序约束

时间限制 以下ISE设计套件时序约束可以表示为XDC时序约束 Vivado设计套件。每个约束描述都包含一个UCF示例和 等效的XDC示例。 在未直接连接到边界的网络上创建时钟时,UCF和XDC不同 的设计(如端口)。在XDC中,当在上定义带有create…

LwIP 之十 详解 TCP RAW 编程、示例、API 源码、数据流

我们最为熟知的网络通信程序接口应该是 Socket。LwIP 自然也提供了 Socket 编程接口,不过,LwIP 的 Socket 编程接口都是使用最底层的接口来实现的。我们这里要学习的 TCP RAW 编程则是指的直接使用 LwIP 的最底层 TCP 接口来直接实现应用层功能。这里先来一张图,对 LwIP 内部…

【JS重点知识02】栈、堆与数据类型 关系

一:栈堆空间分配区别: 1 栈:由操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈; 简单数据类型存放在栈中 2 堆:存储复杂数据类型(对象),…

C#知识|通用数据访问类SQLHelper的编写

哈喽,你好啊,我是雷工! 前面学习了C#操作SQLServer数据库数据的增删改查, 《C#知识|通过ADO.NET实现应用程序对数据库的增、删、改操作。》 其中实现的过程中有很多代码是重复的,此时作为高阶程序员为了使代码更优雅,避免重复, 从而要考虑代码的复用技术,针对此案例中代…

vscode 编程工具配置Java开发环境

vs code 开发环境配置。 环境准备: 1. 安装JDK/安装maven/安装vs code 首先安装好vs code 之后,需要安装 Extension Pack for Java 这么个插件 配置maven,进入setting, 3:配置 maven安装目录,4&#xff1a…

【机器学习】深入探索机器学习:利用机器学习探索股票价格预测的新路径

❀机器学习 📒1. 引言📒2. 多种机器学习算法的应用📒3. 机器学习在股票价格预测中的应用现状🎉数据收集与预处理🎉模型构建与训练🌈模型评估与预测🌞模型评估🌙模型预测⭐注意事项 &…

msvcp100.dll丢失怎样修复?几种快速有效修复msvcp100.dll丢失的方法

在使用电脑时是不是遇到过关于msvcp100.dll丢失文件丢失的情况?出现这样的情况有什么办法可以将丢失的msvcp100.dll文件快速恢复?今天的这篇文章就将教大家几种能够有效的解决msvcp100.dll丢失问题的方法。 方法一:重启电脑 重启电脑是一种简…