向爬虫而生---Redis 基石篇1 <拓展str>

前言:

本来是基于scrapy-redis进行讲解的,需要拓展一下redis; 包含用法,设计,高并发,阻塞等; 要应用到爬虫开发中,这些基础理论我觉得还是有必要了解一下;  

所以,新开一栏! 把redis这个环节系统补上,再转回去scrapy-redis才好深入;

正文:

Redis是一种内存数据库,以其快速的性能、丰富的功能和对多种编程语言的支持而闻名。它提供了多种数据结构、持久化、简单易用、可靠性高和分布式能力。

首先,Redis的速度非常快。它可以处理高达10万次每秒的读写操作,这使得它具有出色的性能。这主要得益于Redis将数据存储在内存中,而内存操作速度非常快。此外,Redis是用C语言实现的,这也有助于提供出色的性能。它采用单线程的线程模型,这保证了操作的原子性,避免了并发问题。

除了速度快之外,Redis还具有持久化功能。它将所有的数据保存在内存中,并异步地将数据更新到磁盘中,以保证数据的持久性。这意味着即使在发生系统故障或重启时,数据也不会丢失。

Redis提供了多种数据结构,它基于键值对进行存储。其中,值可以是字符串、二进制对象、位图、哈希表、链表、集合和有序集合等。这些不同的数据结构可以适应不同的应用场景,例如缓存、计数器、分布式锁等。

另一个值得注意的特点是Redis支持多种编程语言。它提供了丰富的API,可以与多种编程语言进行交互,如Java、Python、PHP等。这使得开发者可以方便地使用Redis来构建各种应用系统。

Redis还具备丰富的功能。它支持发布订阅模式,可以实现消息的广播和订阅机制。通过使用Lua脚本,开发者可以在Redis中执行复杂的操作和业务逻辑。另外,Redis还支持事务和管道操作,可以批量执行多个命令,提高操作效率。

Redis的简单易用也是其优点之一。它提供了一套简洁而直观的命令集,如get、set、del等。通过这些基本命令,可以轻松地对Redis中的数据进行读取、写入和删除操作。

另外,Redis提供了主从复制功能,可以实现数据的备份和故障恢复。它还支持高可用性和分布式部署,可以构建具有弹性和扩展性的系统。

在使用Redis时,了解其API的使用和理解非常重要。Redis提供了通用的命令集,如keys、dbsize、exists、del、expire、type等。通过这些命令,可以操作和管理Redis中的键和值,例如查看键的数量、判断键是否存在、设置键的过期时间、删除键等。

需要注意的是,Redis采用单线程架构,虽然单线程模型非常快速,但也意味着在处理长时间的命令(如keys、flushall、mutil等)时会阻塞其他命令的执行,因此在实际使用中要避免使用这些长时间的命令,以提高整体性能。

此外,了解Redis的内部数据结构和编码方式也很重要。对外,Redis使用一种数据结构表示数据类型,如字符串、哈希表、列表、集合、有序集合和无类型。而在内部,Redis使用了不同的编码方式,如原始编码、整型编码、压缩列表、链接列表、哈希映射和整数集合等。了解这些内部实现细节可以更好地理解Redis的工作原理和优化使用。


字符串(str):

字符串类型是Redis中常用的数据类型之一。它可以用于存储字符串、JSON等数据,但要注意value的最大大小不超过512M。字符串类型在缓存、计数器和分布式锁等场景中非常有用。下面介绍字符串类型的基本命令以及一些拓展命令,并结合案例进行讲解。

字符串类型的基本命令

其中,get命令用于获取指定键的值,set命令用于设置键的值,del命令用于删除指定键。例如,我们可以使用以下命令来设置和获取键"haha"的值:

127.0.0.1:6379> set haha 1
OK
127.0.0.1:6379> get haha
"1"
应用:
缓存:字符串类型是缓存系统中最常见的数据类型。使用get和set命令可以轻松地从缓存中获取和设置键值对,实现快速数据访问和存储。

incr、decr、incrby和decrby

这些命令常用于统计数据和缓存sql语句等场景。

  1. incr命令用于将键对应的值自增1,如果键不存在,则会先将键的值设置为0再进行自增;
  2. decr命令类似地将键对应的值自减1;
  3. incrby和decrby命令可以指定自增或自减的步长。
127.0.0.1:6379> incr haha
(integer) 2
127.0.0.1:6379> get haha
"2"
应用:
计数器:通过使用incr、decr、incrby和decrby命令,可以实现计数器的功能。例如,可以将键的值设置为初始值,然后使用incr命令对其进行自增操作,从而实现对某个数据进行计数。

set命令

可以设置键的值,不管键是否已存在;

  1. setnx命令只在键不存在时进行设置,并返回0或1来表示是否设置成功;
  2. set命令还有一个额外的参数xx,表示只有键存在时才进行设置,用于更新值。

让我们看一个示例:

127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> setnx foo baz
(integer) 0
127.0.0.1:6379> set foo baz xx
OK

在上面的示例中,首先使用set命令将键"foo"的值设置为"bar",然后使用setnx命令在键"foo"不存在时将其值设置为"baz",但因为键已存在,所以返回结果为0;最后使用set命令将键"foo"的值由"bar"更新为"baz"。

应用:
分布式锁:字符串类型在实现分布式锁时非常有用。通过setnx命令可以尝试在分布式环境中获取锁。如果返回值为1,则表示获取锁成功;如果返回值为0,则表示锁已被其他客户端占用。

批量操作的命令:mget  / mset 

  1. mget命令可以一次性获取多个键的值
  2. 而mset命令则可以一次性设置多个键值对。

这些批量操作可以节省时间开销,提高效率。

127.0.0.1:6379> mset foo1 bar1 foo2 bar2 foo3 bar3
OK
127.0.0.1:6379> mget foo1 foo2 foo3
1) "bar1"
2) "bar2"
3) "bar3"

在上面的示例中,我们使用mset命令一次性设置了三个键值对,然后使用mget命令一次性获取了这三个键的值。

应用:
JSON存储:字符串类型可用于存储和传输JSON格式的数据。使用get、set和mget等命令可以轻松地获取和设置JSON字符串,而无需进行复杂的序列化和反序列化操作。

操作字符串类型:  getset / append /strlen

  1. getset命令可以获取键的旧值,并设置新的值;
  2. append命令可以在键的值末尾追加新的值,并返回新的长度;
  3. strlen命令可以获取键的值的长度。
127.0.0.1:6379> getset foo baz
"bar"
127.0.0.1:6379> append foo "123"
(integer) 6
127.0.0.1:6379> strlen foo
(integer) 6

在上面的示例中,首先使用getset命令获取键"foo"的旧值"bar"并设置新值"baz",然后使用append命令将"123"追加到键"foo"的值之后,最后使用strlen命令获取键"foo"的值的长度为6。

应用:
串联操作:使用append命令可以将字符串值进行追加。这在处理日志记录、事件追踪等场景中非常有用。

字符串数据类型: incrbyfloat、getrange和setrange。

这些命令可以帮助我们更灵活地操作字符串值。

首先,incrbyfloat命令可用于将存储为浮点数的键的值与给定的浮点数相加。如果键的值不是浮点数,Redis会将其转换为0并执行加法操作。下面是一个示例:

127.0.0.1:6379> incr fudian
(integer) 1
127.0.0.1:6379> incrbyfloat fudian 1.85
"2.85000000000000009"

在上面的示例中,我们首先使用incr命令将键"fudian"的值自增1,然后使用incrbyfloat命令将键"fudian"的值与给定的1.85相加,得到新的值"2.85000000000000009"。注意,Redis中的浮点数实际上都以字符串形式存储。

接下来,我们来了解getrangesetrange命令。

getrange命令可以返回键的值中指定位置范围内的子字符串。它需要指定起始位置和结束位置的索引。

127.0.0.1:6379> getrange ba 0 3
",daw"

在上面的示例中,我们使用getrange命令获取键"ba"的值中从索引0到3的子字符串,结果是",daw"。

setrange命令用于替换键的值中指定索引范围内的字符或子字符串。它需要指定起始位置索引和替换的新字符串。

127.0.0.1:6379> setrange ba 3 a
(integer) 9
127.0.0.1:6379> get ba
",daaoerzi"

在上面的示例中,我们使用setrange命令将键"ba"的值中索引为3的字符替换为"a",最终值变为",daaoerzi"。需要注意的是,setrange会自动扩展字符串长度以容纳替换的内容。

应用:
  • 获取子字符串:通过getrange命令,可以轻松地获取字符串值中指定范围的子字符串。这在需要处理文本数据的场景中非常有用。
  • 字符串替换:setrange命令可以指定字符串值中的位置,并将指定范围的字符替换为新的字符串。这对于实现特定格式的文本处理非常有用。

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

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

相关文章

Spark导入报错:object security is not a member of package org.apache.kafka.common

引言 build spark里自带的示例项目时报了这样一个错:object kafka is not a member of package org.apache,排查后发现是因为添加的jar依赖里没有kafka这一项,去Maven下载了对应版本的Kafka jar包后放置在examples\jars底下却仍然报错object …

Java经典框架之SpringSecurity

SpringSecurity Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. SpringSecurity基本应用…

wps将姓名处理格式为:姓**

1.打开wps,在要处理数据右侧一个单元格 输入公式:LEFT(A1,1)&"**",然后回车 2.按住ctrl和处理好的数据的右下角小方框,往下拖动即可生成格式为:姓** 格式的数据 3.复制生成的数据,右键选择 “…

springboot日志

1、日志用途 故障排查和调试:当项目出现异常或者故障时,日志记录可以快速帮助我们定位到异常的部分以及知道异常的原因。性能监测和优化:通过在关键代码路径中添加日志记录,可以了解应用程序的性能表现,并根据性能表…

MT8766安卓核心板规格参数_MTK8766核心板模块方案定制

MT8766安卓核心板:高性能、稳定可靠、集成度高的一体化解决方案 MT8766安卓核心板采用联发科MTK8766四核4G模块方案,是一款高度集成的安卓一体板。四核芯片架构,主频可达到2.0GHz,支持国内4G全网通。12nm制程工艺,支持…

引导过程与服务控制

一、开机启动的完整过程 bios加电自检测-------mbr------grub----------加载内核文件------------启动第一个进程 简述:加电后bios程序会自检硬件,硬件无故障,会根据第一启动项去找内核,一般来说,第一启动项是硬盘&a…

网络端口(包括TCP端口和UDP端口)的作用、定义、分类,以及在视频监控和流媒体通信中的定义

目 录 一、什么地方会用到网络端口? 二、端口的定义和作用 (一)TCP协议和UDP协议 (二)端口的定义 (三)在TCP/IP体系中,端口(TCP和UDP)的作用 (…

使用GPTs+Actions自动获取第三方数据

目录 安装插件与GPT对话联网插件首先,创建GPTs。 Voxscript 官网:https://voxscript.awt.icu/index.htmlOpenAI Schema:https://voxscript.awt.icu/swagger/v1/swagger.yamlServer URL: servers: url: https://voxscript.awt.icu安装插件 要使用这个插件&

HarmonyOS开发环境配置

设备要求 CPU内存:12GB以上电脑需要支持虚拟化并开启虚拟化功能硬盘可用空间30GB以上 安装编辑器的时候需要下载SDK、ohpm依赖确保网络畅通。 HarmonyOS开发环境安装步骤如下 下载并安装DevEco Studio:DevEco Studio是华为官方提供的集成开发环境&am…

干洗店洗鞋店小程序核心功能有哪些?

在繁忙的生活中,我们的鞋子常常承载着风尘仆仆的故事。而洗鞋小程序,就是那个让您的鞋子焕然一新的魔法师。通过这个小程序,您可以在线预约、支付,查询洗鞋订单,并与洗鞋店铺进行互动,轻松享受专业的洗鞋服…

HarmonyOS4.0系统性深入开发12 卡片数据交互说明

卡片数据交互说明 ArkTS卡片框架提供了updateForm()接口和requestForm()接口主动触发卡片的页面刷新。 接口是否系统能力约束updateForm否1. 提供方调用。2. 提供方仅允许刷新自己的卡片,其他提供方的卡片无法刷新。requestForm是1. 使用方调用。2. 仅允许刷新添加…

数字图像处理(3)——频域图像增强

🔥博客主页:是dream 🚀系列专栏:深度学习环境搭建、环境配置问题解决、自然语言处理、语音信号处理、项目开发 💘每日语录:贤才,难进易出;庸才,易进易初出;…

Character Controller Smooth

流畅的角色控制器 Unity的FPS解决方案! 它是一种具有非常平滑运动和多种设置的解决方案: - 移动和跳跃 - 坐的能力 - 侧翻角度 - 不平整表面的处理 - 惯性守恒 - 重力 - 与物理物体的碰撞。 - 支持没有家长控制的平台 此解决方案适用于那些需要角色控制器…

【python】如何将一个dict词典转换为dataframe

【背景】 flask项目中远程API返回一个Json结构,用.json方法转化后得到一个dict,想把这个dict进一步转换为dataframe做后续处理。 【方法】 不看不知道,一看简单得吓一跳。 import pandas as pd# 示例字典 data = {Name: [Alice, Bob, Charlie],Age:

Jmeter的安装与快速使用(做并发测试)

1、了解 JMeter是一款开源的性能测试工具,它主要用于模拟多种负载条件下的应用程序或服务器的性能和功能。JMeter可以发送不同类型的请求,如HTTP、HTTPS、FTP、SOAP、REST等,并且可以模拟多种负载类型,例如并发用户、线程组、定时…

vue3+ts通过ref访问组件里面的方法及属性

vue3ts通过ref访问组件里面的方法及属性 之前访问不到主要是子组件没有往外暴露要访问的接口子组件使用了 script setup的组件是默认私有的:一个父组件无法访问到一个使用了 script setup的子组件中的任何东西,: 除非子组件在其中通过 defin…

正则表达式 详解,10分钟学会

大家好,欢迎来到停止重构的频道。 本期我们讨论正则表达式。 正则表达式是一种用于匹配和操作文本的工具,常用于文本查找、文本替换、校验文本格式等场景。 正则表达式不仅是写代码时才会使用,在平常使用的很多文本编辑软件,都…

关于Python里xlwings库对Excel表格的操作(二十五)

这篇小笔记主要记录如何【如何使用xlwings库的“Chart”类创建一个新图表】。 前面的小笔记已整理成目录,可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 (1)如何安装导入xlwings库; (2…

案例分享:Qt多国语言输入法软键盘

若该文为原创文章,转载请注明出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/135346374 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

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

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