向爬虫而生---Redis 基石篇2 <拓展Hash>

前言:

延续上一篇向爬虫而生---Redis 基石篇 <拓展str>-CSDN博客

这个章节拓展一下hash的玩法,主要是要挖一挖 ,啥时候用它最合适;让他并不是一无是处..

正文:

哈希(Hash)数据结构是Redis中的一种常用的数据类型。它是一个键值对的集合,其中键与值之间存在多对一的关系。在Redis中,哈希使用key来区分不同的集合,每个集合中可以存储多个field-value对。

大概长得这样:

key   field   value    就像是一个表~

基础用法:

案例1:用户信息存储

假设我们要存储用户的信息,包括姓名、年龄和所在城市。可以使用哈希数据结构来实现:

127.0.0.1:6379> hset user:1 name "Alice"
(integer) 1
127.0.0.1:6379> hset user:1 age 25
(integer) 1
127.0.0.1:6379> hset user:1 city "New York"
(integer) 1

在上述示例中,我们使用hset命令将用户ID为1的用户信息存储到哈希中。通过将字段名作为key和对应的字段值作为value,可以方便地存储和访问用户的各个属性。

要获取用户信息,可以使用hget命令:

127.0.0.1:6379> hget user:1 name
"Alice"
127.0.0.1:6379> hget user:1 age
"25"

通过hget命令,我们可以获取用户ID为1的姓名和年龄信息。

案例2:商品信息存储

假设我们要存储商品的信息,包括商品名称、价格和库存。同样可以使用哈希数据结构来实现:

127.0.0.1:6379> hset product:1 name "iPhone"
(integer) 1
127.0.0.1:6379> hset product:1 price 999
(integer) 1
127.0.0.1:6379> hset product:1 stock 100
(integer) 1

在上述示例中,我们使用hset命令将商品ID为1的商品信息存储到哈希中。通过设置字段名和对应的字段值,可以轻松地存储和访问商品的各个属性。

要获取商品信息,可以使用hmget命令:

127.0.0.1:6379> hmget product:1 name price stock
1) "iPhone"
2) "999"
3) "100"

通过hmget命令,我们可以同时获取商品ID为1的名称、价格和库存信息。

哈希数据结构不仅可以存储简单的键值对,还可以嵌套存储更复杂的结构。例如,我们可以使用哈希数据结构存储订单信息,其中每个订单又包含多个商品信息。


拓展:

add a new value:

假设我们有一个商品信息的哈希,包含商品名称、价格和库存。我们可以使用hset命令来设置商品的初始信息:

127.0.0.1:6379> HSET product:1 name "iPhone"
(integer) 1
127.0.0.1:6379> HSET product:1 price 999
(integer) 1

使用hset命令分别将商品的名称和价格设置为哈希product:1的字段。

现在,如果我们想要添加商品的库存信息,可以使用同样的hset命令:

127.0.0.1:6379> HSET product:1 stock 100
(integer) 1

以上命令将商品的库存设置为100,添加了一个新的字段stock。

要验证新值是否已成功添加到哈希中,可以使用hgetall命令查看所有字段和值:

127.0.0.1:6379> HGETALL product:1
1) "name"
2) "iPhone"
3) "price"
4) "999"
5) "stock"
6) "100"

在上述示例中,我们使用hgetall命令检查product:1哈希中的所有字段和值,确保新添加的stock字段和对应的值100已成功存储。

hdel命令:

用于删除哈希中的指定字段及其对应的值。

127.0.0.1:6379> HDEL user:1 name
(integer) 1

使用hdel命令删除哈希user:1中的name字段及其对应的值。

hexists命令:

用于判断哈希中是否存在指定的字段。

127.0.0.1:6379> HEXISTS user:1 name
(integer) 0

使用hexists命令检查哈希user:1中是否存在name字段。

hlen命令:

用于获取哈希中字段的数量。

127.0.0.1:6379> HLEN user:1
(integer) 2

使用hlen命令获取哈希user:1中字段的数量,结果为2。

hmget命令:

用于批量获取哈希中多个字段的值。

127.0.0.1:6379> HMGET user:1 name age city
1) "Alice"
2) "25"
3) "New York"

使用hmget命令一次性获取哈希user:1中多个字段的值。

hmset命令:

用于一次性设置哈希中多个字段的值。

127.0.0.1:6379> HMSET user:1 name "Alice" age 25 city "New York"
OK

使用hmset命令一次性设置哈希user:1中多个字段的值。
 

hgetall命令:

该命令用于获取哈希中所有的属性和对应的值,返回一个包含所有字段和值的列表。

127.0.0.1:6379> HMSET user:1 name "Alice" age 25 city "New York"
OK
127.0.0.1:6379> HGETALL user:1
1) "name"
2) "Alice"
3) "age"
4) "25"
5) "city"
6) "New York"

使用HMSET命令一次设置了用户1的姓名、年龄和所在城市信息,然后使用HGETALL命令获取用户1的所有属性和值。

      --因为他会返回所有的属性和值,所有慎用!!!因为redis是单线程的,如果数据过大,容易造成长时间阻塞;

hvals命令:

该命令用于获取哈希中所有属性的值,返回一个包含所有值的列表。

127.0.0.1:6379> HVALS user:1
1) "Alice"
2) "25"
3) "New York"

使用HVALS命令获取用户1的所有属性的值。

hkeys命令:

该命令用于获取哈希中所有的属性(字段)名,返回一个包含所有字段的列表。

127.0.0.1:6379> HKEYS user:1
1) "name"
2) "age"
3) "city"

使用HKEYS命令获取用户1的所有属性名。

hsetnx命令:

该命令用于设置哈希中的属性值,但仅在该属性不存在时才进行设置。

127.0.0.1:6379> HSETNX user:1 name "Bob"
(integer) 0
127.0.0.1:6379> HGET user:1 name
"Alice"

使用HSETNX命令尝试将用户1的姓名设置为"Bob",但由于该属性已经存在,所以设置不成功。

hincrby命令:

该命令用于将哈希中指定属性的值按指定增量进行自增。

127.0.0.1:6379> HSET user:1 views 10
(integer) 1
127.0.0.1:6379> HINCRBY user:1 views 5
(integer) 15

将用户1的浏览量属性views设置为10,然后使用HINCRBY命令将其自增5。

hincrbyfloat命令:

该命令类似于hincrby,但用于处理浮点数类型的属性值。

127.0.0.1:6379> HSET user:1 rating 4.5
(integer) 1
127.0.0.1:6379> HINCRBYFLOAT user:1 rating 0.5
"5"

将用户1的评分属性rating设置为4.5,然后使用HINCRBYFLOAT命令将其增加0.5。

案例汇总:

案例1:网站访问量的展示

假设我们想要记录和展示网站上个人主页的访问量。我们可以使用Redis的哈希数据结构来实现。

首先,我们可以使用hincrby命令自增个人主页的访问量:

visitor_id = "user:123"
page_id = "page:home"
redisClient.hincrby(visitor_id, page_id, 1)

通过将visitor_id作为哈希的key,将page_id作为字段(field),每次访问主页时,通过hincrby命令将访问量增加1。

接下来,使用hgetall命令获取每个个人主页的访问量:

visitor_id = "user:123"
page_visits = redisClient.hgetall(visitor_id)
print(page_visits)

输出结果将为一个包含所有页面和对应访问量的字典。

通过使用哈希数据结构,我们可以方便地记录和展示网站上个人主页的访问量。每个个人主页会作为哈希数据结构的一个字段,而访问量则对应字段的值。

哈希与字符串的区别

哈希和字符串在Redis中都是常用的数据类型,但它们有以下区别:

  • 存储结构:哈希是一个键值对的集合,每个键(key)都有多个字段(field),每个字段都对应一个值(value)。而字符串则是简单的键值对结构。

  • 空间占用:相对于字符串,哈希可以节省内存空间。当数据量较大时,哈希数据结构相对于字符串更为节省空间,特别是当有大量重复的键名时。

  • 部分更新:哈希数据结构可实现部分更新。当我们需要更新哈希中的某个字段时,只需更新对应字段的值,而无需替换整个数据结构。这对于优化性能和减少网络传输很有帮助。

  • 过期时间控制:字符串可以设置过期时间(ttl),而哈希数据结构并不能直接设置过期时间。如果需要给哈希数据结构设置过期时间,可以通过设置字段的过期时间来实现,或者使用相关的数据结构和过期策略。

总结:

     Hash它适用于存储和管理具有复杂属性的对象,如用户信息、产品属性等。 相比之下,字符串适用于简单的键值对存储。 哈希可以节省空间,具有直观的结构和部分更新的能力,但编程复杂度相对较高。需要根据具体的业务需求和使用场景来选择使用哈希还是字符串数据类型。

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

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

相关文章

图神经网络与分子表征:番外——等变术语

本文重点参考了这篇博客:https://nb.bohrium.dp.tech/detail/1342 看论文时经常会遇到 SE3, SO3, O3 等字样,云里雾里,难以理解。本文对这些术语进行集中解释。 文章目录 数学术语GNN 设计要求平移不变性排列、置换不变性镜面等变性旋转等变…

【热点】程序员会不会被人工智能取代?

前两周,ZA技术社区举办了一场主题为“未来,程序员职业会消失吗?”的Geek圆桌派,我作为业务研发的代表参加了此次直播。由于直播时间有限,未能充分表达我的观点,故写此篇博客进行详述。另一方面,…

bootstrap5开发房地产代理公司Hamilton前端页面

一、需求分析 房地产代理网站是指专门为房地产行业提供服务的在线平台。这些网站的主要功能是连接房地产中介机构、房产开发商和潜在的买家或租户,以促成买卖或租赁房产的交易。以下是一些常见的房地产代理网站的功能: 房源发布:房地产代理网…

双语!性能优越|融合黏菌和差分变异的量子哈里斯鹰算法SDMQHHO

前面的文章里卡卡介绍了哈里斯鹰优化算法(Harris Hawks Optimization, HHO).HHO是 Heidari等[1]于2019年提出的一种新型元启发式算法,设计灵感来源于哈里斯鹰在捕食猎物过程中的合作行为以及突然袭击的狩猎风格,具有需调参数少、原理简单易实现、局部搜索…

C语言朴素算法

#include <stdio.h> #include <string.h>// 朴素算法&#xff0c;用于字符串匹配 void naiveMatch(char* text, char* pattern) {int textLength strlen(text); // 计算文本串长度int patternLength strlen(pattern); // 计算模式串长度for …

XAMPP for Windows 8.0.30, 8.1.25 8.2.12

8.0.30 / PHP 8.0.30Whats Included? md5sha1Download (64 bit)144 Mb8.1.25 / PHP 8.1.25Whats Included? md5sha1Download (64 bit)148 Mb8.2.12 / PHP 8.2.12Whats Included? md5sha1Download (64 bit)149 Mb

单挑力扣(LeetCode)SQL题:180. 连续出现的数字(难度:中等)

题目&#xff1a;180. 连续出现的数字 &#xff08;通过次数124,862 | 提交次数258,838&#xff0c;通过率48.24%&#xff09; 表&#xff1a;Logs ---------------------- | Column Name | Type | ---------------------- | id | int | | num | var…

linux 的直接direct io

目录 什么是 Direct IO java 支持 使用场景 数据库 反思 在之前的文章零拷贝基础上&#xff0c;有一个针对那些不需要在操作系统的 page cache 里保存的情况&#xff0c;即绕过 page cache&#xff0c;对于 linux 提供了 direct io 的功能。 https://blog.csdn.net/zlpzl…

面试高频算法专题:数组的双指针思想及应用(算法村第三关白银挑战)

所谓的双指针其实就是两个变量&#xff0c;不一定真的是指针。 快慢指针&#xff1a;一起向前走对撞指针、相向指针&#xff1a;从两头向中间走背向指针&#xff1a;从中间向两头走 移除值为val的元素 题目描述 27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 给你…

常见负载均衡方案分析

负载均衡是分布式系统设计中的一个核心概念&#xff0c;它能够帮助系统合理分配负载&#xff0c;提高资源利用率&#xff0c;提升系统的伸缩性和可用性。以下是一些常见的负载均衡策略及其应用场景、优缺点&#xff1a; 1. 轮询&#xff08;Round Robin&#xff09; 应用场景…

RobotFrameWork自动化测试框架如何搭建环境?

前言 Robot Framework是一款python编写的功能自动化测试框架。具备良好的可扩展性&#xff0c;支持关键字驱动&#xff0c;可以同时测试多种类型的客户端或者接口&#xff0c;可以进行分布式测试执行。主要用于轮次很多的验收测试和验收测试驱动开发&#xff08;ATDD&#xff…

一篇文章掌握系统架构的演变和常见微服务框架

目录 前言 一、系统架构的演变 1、单体应用架构 优点&#xff1a; 缺点&#xff1a; 2、垂直应用架构 优点&#xff1a; 缺点&#xff1a; 3、分布式SOA架构 3.1 什么是SOA 3.2 SOA架构 优点&#xff1a; 缺点&#xff1a; 4、微服务架构 优点&#xff1a; 缺点…

2024年01月数据库流行度最新排名

点击查看最新数据库流行度最新排名&#xff08;每月更新&#xff09; 2024年01月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多&#xff0c;这个数据库就被认为越受欢迎。这是一个领先指标。原始数…

《Linux系列》Linux磁盘MBR分区扩容

文章目录 Linux磁盘MBR分区扩容1.前言2.控制台磁盘扩容3.分区扩容3.1 fdisk3.2 lsblk3.3 扩容分区 4.扩容文件系统4.1 df4.2 扩容文件系统 Linux磁盘MBR分区扩容 1&#xff09;参考阿里云扩容分区文档&#xff0c;整理MBR分区扩容 2&#xff09;本文档适用于MBR分区(fdisk -lu查…

springboot 双数据源配置

1:pom <!--SpringBoot启动依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</group…

CISSP 第1章:实现安全治理的原则和策略

作者&#xff1a;nothinghappend 链接&#xff1a;https://zhuanlan.zhihu.com/p/669881930 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 CIA CIA 三性&#xff1a; 机密性&#xff1a;和数据泄露有关。完整性…

freeCodeCamp:编程学习之旅的起点

一、产品介绍 freeCodeCamp是一个提供免费编程课程的学习平台。它包含了数百个编程挑战&#xff0c;覆盖了从基础的HTML、CSS和JavaScript到高级的算法和数据结构等各个方面的知识。freeCodeCamp不仅提供了丰富的学习资源&#xff0c;还帮助我通过实践提高编程技能。 二、应用…

中科2023

1、检材一硬盘的MD5值为多少?(1分) 80518BC0DBF3315F806E9EDF7EE13C12 2、检材一bitlocker的恢复密钥是多少?(5分) 看了一下不解密寸步难行,必须解密。18中科一样的,老题目一样出 感觉这个有点慢,下面看到潘姐的1小时。 然后我自己的 我自己的,1小时18分钟终于是恢…

韩版传奇 2 源码分析与 Unity 重制(三)客户端渲染管线

专题介绍 该专题将会分析 LOMCN 基于韩版传奇 2,使用 .NET 重写的传奇源码(服务端 + 客户端),分析数据交互、状态管理和客户端渲染等技术,此外笔者还会分享将客户端部分移植到 Unity 和服务端用现代编程语言重写的全过程。 概览 在这一篇文章中,我们将开始分析传奇客户…

go语言``反引号用法归纳——多行输出和Tag标签(指定json名称、MySQL名称))

一、多行输出 示例 func main() {str1 : 反引号多行字符串str2 : "双引号" " 多行" " 字符串"//str3 : 单引号" //" 多行" //" 字符串str4 : "双引号\n" " 多行\n" &quo…