当前位置: 首页 > news >正文

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

相关文章:

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

前言: 延续上一篇向爬虫而生---Redis 基石篇 <拓展str>-CSDN博客 这个章节拓展一下hash的玩法,主要是要挖一挖 ,啥时候用它最合适;让他并不是一无是处.. 正文: 哈希(Hash)数据结构是Redis中的一种常用的数据类型。它是一个键值…...

【论文精读】A Survey on Large Language Model based Autonomous Agents

A Survey on Large Language Model based Autonomous Agents 前言Abstract1 Introduction2 LLM-based Autonomous Agent Construction2.1 Agent Architecture Design2.1.1 Profiling Module2.1.2 Memory ModuleMemory StructuresMemory FormatsMemory Operations 2.1.3 Plannin…...

23款奔驰GLC260L升级原厂540全景影像 高清环绕的视野

嗨 今天给大家介绍一台奔驰GLC260L升级原厂360全景影像 新款GLC升级原厂360全景影像 也只需要安装前面 左右三个摄像头 后面的那个还是正常用的,不过不一样的是 升级完成之后会有多了个功能 那就是新款透明底盘,星骏汇小许Xjh15863 左右两边只需要更换后…...

SQL 在已有表中修改列名的方法

文章目录 1. MySQL2. SQL Server3. Oracle / PostgreSQL Question: 假设有一张表 StudentInfo,表中有一个列名是 Student_Name ,想要把这个列名改成 StudentName 应该如何操作? 建表语句如下: --建表 if object_id(S…...

QT----Visual stdio翻金币案例,附源码

历经一个月,各种事情磕磕绊绊,终于结束了,自己还是太菜了 案例的文档写的教程已经很详细,这边主要是记录一些问题 github代码 gitee代码 1、图片无法加载 一开始加载首页图片和标题出不来,结果是paintEvent重写的字打…...

总结:浏览器解析html与执行JS之生命周期详解

总结:浏览器解析html与执行JS之生命周期详解 一浏览器解析html的生命周期:1.请求HTML文档:2接收响应:3构建DOM树:4加载外部资源:5DOMContentLoaded事件:6样式计算与布局:7绘制与渲染…...

aspose通过开始和结束位置关键词截取word另存为新文件

关键词匹配实体类: Data EqualsAndHashCode(callSuper false) public class TextConfig implements Serializable {private static final long serialVersionUID 1L;/*** 开始关键词,多个逗号分隔*/private String textStart ;/*** 结束关键词&#x…...

深入解析美颜SDK:绿幕抠图功能的算法原理

当下,美颜SDK绿幕抠图功能成为许多应用中不可或缺的一环。本文将深入解析美颜SDK中绿幕抠图功能的算法原理,揭示其背后的技术奥秘。 一、什么是美颜SDK绿幕抠图? 美颜SDK的绿幕抠图功能是一种通过计算机视觉技术,将视频或图像中…...

从有向带权图判断最短路径里各目标顶点顺序

对如下有向带权图,若采用迪杰斯特拉(Dijkstra)算法求从源点a到其他各顶点的最短路径,则得到的第一路径的目标顶点是b,第二条最短路径的目标顶点是c,后续得到的其余各最短路径的目标顶点依次是() A.d,e,f B.e,d,f C.f,d,e D.f,…...

鼠标驱动框架:模拟键盘按键

/* 参考: drivers\hid\usbhid\usbmouse.c */ #include <linux/kernel.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/init.h> #include <linux/usb.h> #include <linux/input.h> #include <linux/hid.h>st…...

ES6之Promise的链式调用

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…...

HTML----JavaScript操作对象BOM对象

文章目录 目录 文章目录 本章要求 一.BOM模型概述 二.BOM核心&#xff1a;window对象 常用属性 常用方法&#xff1a; confirm() 案例 open ()close()案例 setTimeout( ) 案例 setInterval( ) 案例 document对象 练习 本章要求 了解BOM模型掌握BOM模型实际应用 一.BOM模型…...

隆道数智大会回顾|第13期《如何构建绿色产业供应链新生态》(完)

本期演讲嘉宾&#xff1a; 史文月 采购与供应链专家 邢庆峰 品类管理和质量管理专家 刘婷婷 中兴通讯供应链规划总监 张燕华 正大生物CIO 吴树贵 隆道公司总裁 本期演讲主题&#xff1a; 如何构建绿色产业供应链新生态 本期内容要点&#xff1a; 1.供应链管理的核心问…...

粒子群优化pso结合bp神经网络优化对csv文件预测matlab(3)

1.csv数据为密西西比数据集&#xff0c;获取数据集可以管我要&#xff0c;数据集内容形式如下图&#xff1a; 2.代码 这里参考的是b站的一位博主。 数据集导入教程在我的另一篇文章bp写过&#xff0c;需要的话可以去看一下 psobp.m close all clc%读取数据 inputX; outputY;…...

软性演员-评论家算法 SAC

软性演员-评论家算法 SAC 软性演员-评论家算法 SAC优势原理软性选择模型结构目标函数重参数化熵正则化代码实现 软性演员-评论家算法 SAC 优势原理 DDPG 的问题在于&#xff0c;训练不稳定、收敛差、依赖超参数、不适应复杂环境。 软性演员-评论家算法 SAC&#xff0c;更稳定…...

Nginx多域名部署多站点

目录 1.修改配置文件nginx.conf 2. 修改hosts文件 1.修改配置文件nginx.conf 在配置文件的 server_name 处修改成自己需要的域名&#xff0c;然后保存退出 j 查看语法是否错误&#xff0c;然后重启nginx nginx -t # 查看语法是否正确 systemctl restart nginx # 重启nginx …...

Java的常规面试题

Java的面试题主要涉及Java基础知识、并发编程、集合原理、JVM原理、I/O与网络编程、设计模式、互联网常用框架等多个领域[6]。一些常见的面试问题包括&#xff1a; 1. 面向对象的特征&#xff1a;继承、封装和多态性。 2. 访问修饰符public、private、protected以及默认时的区别…...

大数据技术发展史

文章目录 Google论文HadoopHive大数据生态 Google论文 今天我们常说的大数据技术&#xff0c;其实起源于Google在2004年前后发表的三篇论文&#xff0c;也就是我们经常听到的“三驾马车”&#xff0c;分别是分布式文件系统GFS、大数据分布式计算框架MapReduce和NoSQL数据库系统…...

linux常见基础指令

入门常见基础指令 ls、stat、 pwd 、cd、tree、 whoami、 touch、 mkdir、 rm 、 man、 cp、mv、cat、tac、echo、>、 >>、 < 、more、 less、 head、 tail、date、 cal、 find、 which、alias、whereis、grep、zip与unzip、 tar、bc、uname、xargs... 热键Tab、…...

“人家赚那么多”系列01:如何练习?练什么?

01 如何练习&#xff1f;练习什么&#xff1f; 今年计划重点围绕「在不骗自己的前提下&#xff0c;如何才能把事儿彻底做好&#xff0c;并做得有声有色&#xff1f;」为主题来写点儿东西&#xff0c;聊聊我是怎么做的&#xff0c;如何通过一些有效的方法来不断优化自己的。 想把…...

如何让鼠标和触控板和平共处:Scroll Reverser实现设备独立控制的效率革命

如何让鼠标和触控板和平共处&#xff1a;Scroll Reverser实现设备独立控制的效率革命 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 在多设备协同办公成为常态的今天&#xff0…...

避开这些坑!医疗内窥镜Zemax优化时的高温灭菌与弯曲成像难题解决指南

医疗内窥镜光学系统设计实战&#xff1a;高温灭菌与弯曲成像的Zemax解决方案 在微创手术和工业检测领域&#xff0c;直径仅2.8mm的医疗内窥镜需要同时满足140广角视场、F2.0大光圈和10μm高分辨率的要求。更严峻的挑战来自使用环境——必须耐受135℃高温蒸汽灭菌&#xff0c;并…...

OpenClaw技能扩展实战:基于Qwen3-32B开发自定义文件处理器

OpenClaw技能扩展实战&#xff1a;基于Qwen3-32B开发自定义文件处理器 1. 为什么需要自定义文件处理器 上周处理季度数据时&#xff0c;我又遇到了那个老问题&#xff1a;手头有37个CSV文件需要清洗格式、去重合并&#xff0c;还要按日期归档。这种重复性工作既耗时又容易出错…...

麒麟V10系统下国产海量数据库安装全攻略(含内核参数优化与避坑指南)

麒麟V10系统下国产海量数据库安装全攻略&#xff08;含内核参数优化与避坑指南&#xff09; 在国产化技术快速发展的今天&#xff0c;越来越多的企业和机构开始采用国产操作系统和数据库产品。麒麟V10作为国产操作系统的代表之一&#xff0c;其稳定性和安全性得到了广泛认可。而…...

OpenClaw+Qwen3-32B科研助手:文献综述自动生成与参考文献整理

OpenClawQwen3-32B科研助手&#xff1a;文献综述自动生成与参考文献整理 1. 为什么需要AI科研助手&#xff1f; 作为一名计算机专业的研究生&#xff0c;我每天要处理大量文献。最痛苦的时刻莫过于导师突然说"下周组会做个文献综述"&#xff0c;而我手头只有几十篇…...

ArduPilot电机控制逻辑与PWM输出机制剖析

1. ArduPilot电机控制基础概念 当你第一次接触无人机飞控时&#xff0c;最让人困惑的莫过于电机控制逻辑了。想象一下&#xff0c;你手里拿着遥控器&#xff0c;轻轻推动摇杆&#xff0c;无人机就能平稳地上升、下降或者转向。这背后到底发生了什么&#xff1f;让我用最直白的…...

AutoGen多智能体框架实战指南:从环境搭建到业务落地

AutoGen多智能体框架实战指南&#xff1a;从环境搭建到业务落地 【免费下载链接】autogen 启用下一代大型语言模型应用 项目地址: https://gitcode.com/GitHub_Trending/au/autogen 在人工智能快速发展的今天&#xff0c;构建能够模拟人类协作模式的智能系统已成为技术突…...

2026 年直播电商如何进化?内容创作与管理的新模式是什么?

核心要点 问题&#xff1a; 为什么很多直播电商团队在 2025 年后明显感到"内容越来越多&#xff0c;但效果越来越不稳定"&#xff1f; 答案&#xff1a; 进入 2026 年&#xff0c;直播电商从"单场爆发"转向"内容体系竞争"。真正拉开差距的&#…...

算法基础篇(11)Floyd算法

Floyd算法本质是动态规划&#xff0c;用来求任意两点之间的最短路&#xff0c;也称为插点法。通过不断在两点之间加入新的点来更新最短路。1、状态表示&#xff1a;f[k][i][j]表示&#xff1a;仅仅经过1~k这些点&#xff0c;结点i走到结点j的最短路径的长度。2、状态转移方程&a…...

网络安全学习攻略宝典,从菜鸟到高手的必由之路

想成为一名真正的黑客到底该怎么学&#xff1f; 从0开始又该从何学起呢&#xff1f; 很多人想学习网络安全&#xff0c;却不知道从何下手。别迷茫&#xff0c;这篇文章为你指明方向&#xff0c;无论你是零基础小白&#xff0c;还是有一定基础想提升的人&#xff0c;都能从中找…...