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

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

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

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

相关文章

Python武器库开发-武器库篇之SMB服务暴力破解(五十五)

Python武器库开发-武器库篇之SMB服务暴力破解(五十五) SMB服务(Server Message Block)是一种用于文件共享、打印机共享和其他资源共享的网络协议。它最初由IBM开发,后来被微软广泛采用。 SMB服务允许多台计算机在网络上共享文件和资源&…

Web前端项目-页面动态背景【附完整源码】

页面动态背景 一&#xff1a;花瓣背景 页面效果&#xff1a; HTML代码 <!DOCTYPE HTML> <HTML> <TITLE>花瓣漫舞</TITLE> <META NAME"Generator" CONTENT"EditPlus"> <META NAME"Author" CONTENT"&quo…

基于Sringboot+Vue的校园招聘系统【原创】【开源】

浏览器&#xff1a;Chrome或360浏览器 系统环境配置 前置条件&#xff1a;系统已经安装了Mysql5.7、Mysql工具&#xff08;Navicat&#xff09;、JDK1.8、Maven3.6.1、vue3.0以下开发环境、 Intellij Idea、 Chrome或360浏览器 1、导入数据库 2、编译前端代码vue 编译&…

编译xlnt开源库源码, 使用c++读写excel文件

编译xlnt开源库源码,在linux平台使用c读写excel文件 下载xnlt源码 官方网站https://tfussell.gitbooks.io/xlnt/content/ 下载地址https://github.com/tfussell/xlnt 下载libstudxml开源库源码 下载地址https://github.com/kamxgal/libstudxml 下载xnlt源码 官方网站https://…

CVE-2023-51048(sql注入)

简介 S-CMS v5.0 被发现存在SQLI。 过程 打开靶场&#xff0c;扫描目录&#xff0c;发现/admin后台登陆界面 弱口令admin/admin123登录 经过查看&#xff0c;发现账号管理功能&#xff0c;添加管理员账号存在sql注入&#xff0c;添加管理员&#xff0c;进行抓包 抓取数据如下…

2024华为OD机试真题- 计算三叉搜索树的高度-(C++/Python)-C卷D卷-100分

2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 题目描述 定义构造三叉搜索树规则如下: 每个节点都存有一个数,当插入一个新的数时,从根节点向下寻找,直到找到一个合适的空节点插入。查找的规则是: 1.如果数小于节点的数减去500,则将数插入节点的左子树 2.如果数大于…

带NTC温度保护的5V升压至8.4V两节锂电池充电芯片

内容详情&#xff1a; 1&#xff0c; 两节锂电池充电芯片简单描述 2, 参考 PCB 设计和过 EMI 认证注意事项 3&#xff0c; 外围参考推荐芯片 4&#xff0c; 参考应用电路&#xff1a; 两节锂电池的充电/保护/放电的完整电路 5&#xff0c; 两节锂电池充电芯片 IC 目录 描述…

IT入门知识第六部分《后端开发》(6/10)

目录 后端开发&#xff1a;构建强大的服务端逻辑 1.引言 2.后端技术概述 2.1 数据库 2.2 服务器 2.3 API 2.4 安全性 3.服务器和API 3.1 服务器的作用 3.2 API的作用 4.后端框架 4.1 Node.js 4.1.1 特点 4.1.2 用途 4.1.3 代码案例分析 4.2 Django 4.2.1 特点 …

论文辅导 | 基于K-means聚类和ELM神经网络的养殖水质溶解氧预测

辅导文章 模型描述 1&#xff09;相似度统计量构造。数据归一化后&#xff0c;利用皮尔森相关系数确定环境因子权重&#xff0c;构造相似日的统计量&#xff0d;相似度。 2&#xff09;K-means 聚类。根据相似度应用 K-means 聚类法对历史日数据样本聚类&#xff0c;找出合适样…

Nginx负载均衡之Memcached缓存模块

Nginx 的 ngx_http_memcached_module 模块本身并没有提供缓存功能&#xff0c;它只是一个将用户请求转发到 Memcached 服务器的代理模块。 在以 Memcached 服务器为缓存应用的方案中&#xff0c;Memcached 作为内容缓存的存储服务器&#xff0c;用户通过 URL 为 Memcac…

python API自动化(Pytest+Excel+Allure完整框架集成+yaml入门+大量响应报文处理及加解密、签名处理)

1.pytest数据参数化 假设你需要测试一个登录功能&#xff0c;输入用户名和密码后验证登录结果。可以使用参数化实现多组输入数据的测试: 测试正确的用户名和密码登录成功 测试正确的用户名和错误的密码登录失败 测试错误的用户名和正确的密码登录失败 测试错误的用户名和密码登…

OceanBase 并行执行参数 parallel_servers_target 理解

为了最大程度降低 PX 使用难度&#xff0c;OceanBase 3.1 版起&#xff0c;parallel_max_servers 参数废弃。 用户只需用好 parallel_servers_target 即可。 target 的用途 用一个酒吧的例子来粗略理解下 parallel_servers_target 的意思&#xff1a; target 先生开了一个酒…

git 上拉下来的新项目web文件夹没有被idea管理,导致启动不了

让idea识别web项目&#xff0c;操作步骤&#xff1a; 1. 打开idea -- 文件 -- 项目结构&#xff1b; 2. 选择 模块 --- 添加 --- web -- 应用 --- 确定&#xff0c;就好了。 3. 文件夹中间出现个圆圈就是被识别到了。

刷代码随想录有感(110):动态规划——完全背包问题

题干&#xff1a; 代码&#xff1a; #include<bits/stdc.h> using namespace std; int n, bagweight; void solve(){vector<int>dp(bagweight 1, 0);vector<int>weight(n, 0);vector<int>value(n, 0);for(int i 0; i < n; i){cin>>weight[…

计算机网络(9) TCP超时重传以及滑动窗口流量控制

一.确认机制与流量控制 引用&#xff1a;滑动窗口&#xff0c;TCP的流量控制机制 | 小菜学网络 确认机制 由于 IP 协议缺乏反馈机制&#xff0c;为保证可靠性&#xff0c;TCP 协议规定&#xff1a;当接收方收到一个数据后&#xff0c;必须回复 ACK 给发送方。这样发送方就能得…

如何使用ChatGPT辅助设计工作

文章目录 设计师如何使用ChatGPT提升工作效率&#xff1f;25个案例告诉你&#xff01;什么是 prompt&#xff1f;咨询信息型 prompt vs 执行任务 prompt编写出色 prompt 的基本思路撰写 prompt 的案例和技巧1、将 ChatGPT 视作专业人士2、使用 ChatGPT 创建表单3、使用 ChatGPT…

数字化和信息化的区别是什么?

市面上有些企业专门区分出了数字化和信息化的区别&#xff0c;认为数字化基于信息化的基础之上。但也有一些专家认为两者不是独立或前后的概念&#xff0c;属于近似概念&#xff0c;它到底应当怎样被定义&#xff1f; 其实之前已经写过好几篇这个类型的文章了&#xff0c;但是总…

Python开发日记--手撸加解密小工具(2)

目录 1. UI设计和代码生成 2.运行代码查看效果 3.小结 1. UI设计和代码生成 昨天讨论到每一类算法设计为一个Tab&#xff0c;利用的是TabWidget&#xff0c;那么接下来就要在每个Tab里设计算法必要的参数了&#xff0c;这里我们会用到组件有Label、PushButton、TextEdit、Ra…

this指针如何使C++成员指针可调用

在C中&#xff0c;this指针是一个隐藏的指针&#xff0c;指向当前对象实例。它在成员函数中自动可用&#xff0c;用于访问该对象的成员变量和成员函数。理解this指针的工作原理有助于理解为什么指向成员的指针是可调用的。在本文中&#xff0c;我们将详细探讨this指针的概念&am…

保护模式下的内存访问(笔记)

;代码清单12-1;文件名&#xff1a;c12_mbr.asm;文件说明&#xff1a;硬盘主引导扇区代码;创建日期&#xff1a;2011-5-16 19:54&#xff1b;修改于2022-02-16 11:15;设置堆栈段和栈指针mov ax, csmov ss, axmov sp, 0x7c00;计算GDT所在的逻辑段地址mov ax, [cs: gdt_base 0x7c…