【Redis】哈希类型的常用命令以及使用场景

news2024/11/28 14:43:24

Redis 哈希是一种用于存储键值对的数据结构。在 Redis 哈希中,每个键(key)都关联着一个哈希表(hash)。这个哈希表包含了多个字段(field)和值(value)。哈希非常适合存储对象,因为你可以通过字段名快速访问或修改对象的属性。

在我的博客中还介绍了关于String类型的详解,感兴趣的可以点击学习:
String类型的详解icon-default.png?t=N7T8https://blog.csdn.net/qq_45875349/article/details/139692572?spm=1001.2014.3001.5501

字符串和哈希在redis中存储的对比:

1. 常用命令

命令执行效果时间复杂度
hset key field value设置值O(1)
hget key field获取值O(1)
hdel key field [field …]删除fieldO(k),k是field个数
hlen key计算field个数O(1)
hgetall key获取所有的field-valueO(k),k是field个数
hmget field [field …]批量获取field-valueO(k), k  field个数
hmset field value [field value …]批量设置field-valueO(k),k是field个数
hexists key field判断field是否存在O(1)

hkeys key

获取所有的field
O(k),k是field个数

hvals key

获取所有的value

O(k),k是field个数
hsetnx key field value设置值,但必须在field不存在时才能设置成功O(1)
hincrby key field n对应field-value+nO(1)
hincrbyfloat key field n对应field-value+nO(1)
hstrlen key field计算value的字符串长度O(1)

相关命令演示

HSET key field value 设置值

设置用户的名字和年龄和余额:

HSET user:1000 name "John Doe"
HSET user:1000 age 30
HSET user:1000 balance 100.0

HGET key field 获取值

获取用户的名字

HGET user:1000 name

HDEL key field [field ...] 删除字段

HLEN key 计算field个数

hgetall key 获取所有的field和value

HMGET key field [field ...] 批量获取field-value

 

HMSET key field value [field value ...]批量设置field-value

hexists key field 判断 field 是否存在

hkeys key 获取所有的 field

hvals key 获取所有的 value
hsetnx key field value 设置值,但必须在 field 不存在时才能设置成功
hincrby key field n  对应 field-value +n
hincrbyfloat key field n  对应 field-value +n
hstrlen key field 计算 value 的字符串⻓度

2. 内部编码

Redis 中的哈希数据结构使用两种不同的内部编码方式:ziplist(压缩列表)和 hashtable(哈希表)。Redis 会根据哈希表中数据的大小和元素个数自动选择使用哪种编码方式。

2.1 压缩列表(ziplist)

压缩列表是一种特殊编码的双向链表,能够高效地存储和访问小规模数据。它的特点是:

  • 存储在连续的内存块中,减少内存碎片。
  • 使用特殊编码压缩小整数和短字符串。
  • 插入、删除操作需要移动大量内存数据,适用于元素较少的情况。

使用条件

  • 当哈希表的元素个数小于 hash-max-ziplist-entries(默认 512个)。
  • 当所有字段和值的长度都小于 hash-max-ziplist-value(默认 64 字节)。

配置示例(在 redis.conf 配置文件中):

hash-max-ziplist-entries 512
hash-max-ziplist-value 64

2.2 哈希表(hashtable)

哈希表是一种典型的哈希数据结构,使用哈希函数将键值对映射到一个数组中。它的特点是:

  • 支持快速的插入、删除和查找操作。
  • 随着数据量的增加,内存消耗较大。
  • 适用于大规模数据的存储和操作。

使用条件(不满足ziplist):

  • 当哈希表的元素个数大于等于 hash-max-ziplist-entries
  • 当任一字段或值的长度大于等于 hash-max-ziplist-value
下面的示例演示了哈希类型的内部编码,以及响应的变化。
1. 当字段个数较少且没有大的值时,内部编码为 ziplist
# 设置哈希表字段
127.0.0.1:6379> HMSET hashkey f1 v1 f2 v2
OK

# 查看哈希表的内部编码
127.0.0.1:6379> OBJECT ENCODING hashkey
"ziplist"
在这个示例中, hashkey 哈希表的字段较少且值较小,因此使用 ziplist 编码。

2. 当有值大于 64 字节时,内部编码会转换为 hashtable: 

# 设置一个大于 64 字节的值
127.0.0.1:6379> HSET hashkey f3 "one string is bigger than 64 bytes ... 比特就业课 ..."
OK

# 查看哈希表的内部编码
127.0.0.1:6379> OBJECT ENCODING hashkey
"hashtable"

3. 当字段个数超过 512 时,内部编码也会转换为 hashtable

# 设置超过 512 个字段
127.0.0.1:6379> HMSET hashkey f1 v1 f2 v2 f3 v3 ... f513 v513
OK

# 查看哈希表的内部编码
127.0.0.1:6379> OBJECT ENCODING hashkey
"hashtable"

3. 使用场景

1. 存储映射关系的信息(用户信息、商品信息、购物车)

在许多应用中,需要存储用户的信息,例如用户名、电子邮件、年龄等。使用 Redis Hash 可以非常方便地将这些信息存储在一起:

HMSET user:1000 name "John Doe" email "john.doe@example.com" age "30"

通过使用哈希类型,我们可以快速访问和更新用户的某个具体字段,而不需要读取整个对象。 

HGET user:1000 email
"john.doe@example.com"

HSET user:1000 age "31"
(integer) 1

电商平台需要存储大量的商品信息,包括商品名称、价格、库存等。Redis Hash 非常适合存储这种类型的数据:

HMSET product:2000 name "Laptop" price "999.99" stock "50"

可以快速查询和更新某个商品的字段:


HGET product:2000 price
"999.99" # 返回 "999.99"

HINCRBY product:2000 stock -1
(integer) 49 # 减少库存数量

2. 计数器

哈希类型可以用来实现复杂的计数器。例如,记录文章的各类统计信息,如点赞数、评论数、分享数等:

HMSET article:3000 views "1000" likes "150" comments "20" shares "5"
OK

 可以方便地增加或减少某个字段的值:

HINCRBY article:3000 views 1
(integer) 1001

HINCRBY article:3000 comments 1
(integer) 21

3. 会话管理

在 Web 应用中,可以使用 Redis Hash 来管理用户会话信息。例如,存储每个用户的会话数据:

HMSET session:4000 user_id "1000" login_time "2023-06-21 10:00:00" last_access "2023-06-21 10:05:00"
OK

 可以快速更新用户的最后访问时间:

HSET session:4000 last_access "2023-06-21 10:10:00"
(integer) 1

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

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

相关文章

Java | Leetcode Java题解之第171题Excel表列序号

题目: 题解: class Solution {public int titleToNumber(String columnTitle) {int number 0;int multiple 1;for (int i columnTitle.length() - 1; i > 0; i--) {int k columnTitle.charAt(i) - A 1;number k * multiple;multiple * 26;}ret…

44、基于深度学习的癌症检测(matlab)

1、基于深度学习的癌症检测原理及流程 基于深度学习的癌症检测是利用深度学习算法对医学影像数据进行分析和诊断,以帮助医生准确地检测癌症病变。其原理和流程主要包括以下几个步骤: 数据采集:首先需要收集包括X光片、CT扫描、MRI等医学影像…

【vite】define 全局常量定义

&#x1f9ed; define 说明 类型&#xff1a; Record<string, any> 定义全局常量替换方式。其中每项在开发环境下会被定义在全局&#xff0c;而在构建时被静态替换。 Vite 使用 esbuild define 来进行替换&#xff0c;因此值的表达式必须是一个包含 JSON 可序列化值&a…

xshell传输文件速率为0

你们好&#xff0c;我是金金金。 场景 此时我通过xshell客户端上传文件&#xff0c;速率一直为0 解决 安装 yum -y install lrzsz 即可 这个工具主要提供 rz 和 sz 命令&#xff0c;用于通过 Zmodem 协议在本地计算机和远程服务器之间传输文件 编写有误还请大佬指正&#xff0…

C++的智能指针 RAII

目录 产生原因 RAII思想 C11的智能指针 智能指针的拷贝与赋值 shared_ptr的拷贝构造 shared_ptr的赋值重置 shared_ptr的其它成员函数 weak_ptr 定制删除器 简单实现 产生原因 产生原因&#xff1a;抛异常等原因导致的内存泄漏 int div() {int a, b;cin >> a…

在Ubuntu系统中部署Java及Spring Boot开发环境

选择Java及Spring Boot构建Web服务具有显著优势&#xff0c;Java的跨平台兼容性保证了服务可在不同操作系统上顺畅运行&#xff0c;而Spring Boot的成熟框架则大大简化了开发流程&#xff0c;减少了繁琐配置。此外&#xff0c;强大的社区支持、易于维护与扩展的特性、优异的性能…

a-table 根据数据自动进行 行合并

<template><div class"chat_query_result"><button click"temp">点击</button><a-table :columns"columns" :data-source"data" bordered></a-table></div> </template><script&g…

计算机毕业设计hadoop+spark+hive游戏推荐系统 游戏数据分析可视化大屏 steam游戏爬虫 游戏大数据 大数据毕业设计 机器学习 知识图谱

游戏推荐系统开题报告 一、引言 随着信息技术和网络技术的飞速发展&#xff0c;电子游戏已成为人们日常生活中不可或缺的一部分。然而&#xff0c;面对海量的游戏资源&#xff0c;用户往往难以找到适合自己的游戏。因此&#xff0c;构建一个高效、准确的游戏推荐系统显得尤为…

C++ | Leetcode C++题解之第171题Excel表列序号

题目&#xff1a; 题解&#xff1a; class Solution { public:int titleToNumber(string columnTitle) {int number 0;long multiple 1;for (int i columnTitle.size() - 1; i > 0; i--) {int k columnTitle[i] - A 1;number k * multiple;multiple * 26;}return num…

万界星空科技MES系统中的仓库管理功能

制造执行系统&#xff08;Manufacturing Execution System&#xff0c;简称MES&#xff09;作为一种面向车间生产调度的管理信息系统&#xff0c;被广泛应用在车间作业调度和控制管理系统中&#xff0c;它以实现车间生产调度最优化为目标。同时&#xff0c;MES作为衔接ERP&…

Scikit-Learn梯度提升决策树(GBDT)

Scikit-Learn梯度提升决策树 1、梯度提升决策树(GBDT)1.1、Boosting方法1.2、GBDT的原理1.3、GBDT回归的损失函数1.4、梯度下降与梯度提升1.5、随机森林与GBDT1.6、GBDT的优缺点2、Scikit-Learn梯度提升决策树(GBDT)2.1、Scikit-Learn GBDT回归2.1.1、Scikit-Learn GBDT回归…

阿里云上构建_VPC专有网络_子网划分_原理说明_创建_释放---分布式云原生部署架构搭建006

可以看到有这种子网掩码计算工具可以使用 可以看到这个是,我们设计的一个子网 192.168.0.0/16 可以看到地址是 从192.168.0.1 到 192.168.255.254 有了子网,我们去看,可以看到在阿里云的管理后台,就有个 创建交换机.可以看到 然后指定这个交换机的网段 这里我们指定了192…

编写水文专业串口通讯软件的开发经历

编写水文专业串口通讯软件的开发经历 一、关于开发 YAC9900 水位雨量 RTU 通讯软件二、软件开发遇到的问题和困难1、开发架构的适应2、开发语言的学习3、.net core 8 架构中串口构建的难点4、YAC9900 水位雨量 RTU 通讯软件开发中的 UI 冻结 三、发现问题解决问题的具体办法1、…

会声会影2024专业免费版下载附带激活码序列号

&#x1f31f; 会声会影2024&#xff1a;你的视频编辑新伙伴&#xff01;大家好&#xff0c;今天来给你们安利一个超级棒的视频编辑软件——会声会影2024最新版本&#xff01;作为一位热爱创作的小伙伴&#xff0c;找到一款既强大又易用的视频编辑工具真的太重要了。而会声会影…

什么是嵌入式,单片机又是什么,两者有什么关联又有什么区别?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;从科普的角度&#xff0c;…

【减法网络】Minusformer:通过逐步学习残差来改进时间序列预测

摘要 本文发现泛在时间序列(TS)预测模型容易出现严重的过拟合。为了解决这个问题&#xff0c;我们采用了一种去冗余的方法来逐步恢复TS的真实值。具体来说&#xff0c;我们引入了一种双流和减法机制&#xff0c;这是一种深度Boosting集成学习方法。通过将信息聚合机制从加法转…

Java线程池七个参数详解

ThreadPoolExecutor 是JDK中的线程池实现&#xff0c;这个类实现了一个线程池需要的各个方法&#xff0c;它提供了任务提交、线程管理、监控等方法 下面是 ThreadPoolExecutor 类的构造方法源码&#xff0c;其他创建线程池的方法最终都会导向这个构造方法&#xff0c;共有7个参…

Spring Boot -- 图书管理系统(登录、展示+翻页、添加/修改图书)

文章目录 一、应用分层二、数据库的设计三、登录功能四、展示列表&#xff08;使用虚构的数据&#xff09;五、翻页 展示功能六、添加图书七、修改图书 一、应用分层 为什么我们需要应用分层&#xff1a;当代码量很多时&#xff0c;将其全部放在一起查找起来就会很麻烦&#…

通过MindSpore API实现深度学习模型

快速入门 将相应的包逐一导入到项目中&#xff0c;这是制作项目的第一步。 import mindspore from mindspore import nn from mindspore.dataset import vision, transforms from mindspore.dataset import MnistDataset 处理数据集 先从网上下载对应的数据集文件,MindSpor…

【LeedCode】二分查找算法(一)

二分查找算法的时间复杂度是O(logN) &#xff0c;更优于传统的遍历数组算法值得我们学习。 注意二分查找一般使用的前提是&#xff1a;待操作的数组的元素有某种规律也就是要有二阶性&#xff0c;二阶性就是在数组中选取一点根据该数组元素某种规律可以把数组分为两部分&#x…