向爬虫而生---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语句等场景。
- incr命令用于将键对应的值自增1,如果键不存在,则会先将键的值设置为0再进行自增;
- decr命令类似地将键对应的值自减1;
- 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命令
可以设置键的值,不管键是否已存在;
- setnx命令只在键不存在时进行设置,并返回0或1来表示是否设置成功;
- 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
- mget命令可以一次性获取多个键的值
- 而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
- getset命令可以获取键的旧值,并设置新的值;
- append命令可以在键的值末尾追加新的值,并返回新的长度;
- 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中的浮点数实际上都以字符串形式存储。
接下来,我们来了解getrange和setrange命令。
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命令可以指定字符串值中的位置,并将指定范围的字符替换为新的字符串。这对于实现特定格式的文本处理非常有用。
相关文章:
向爬虫而生---Redis 基石篇1 <拓展str>
前言: 本来是基于scrapy-redis进行讲解的,需要拓展一下redis; 包含用法,设计,高并发,阻塞等; 要应用到爬虫开发中,这些基础理论我觉得还是有必要了解一下; 所以,新开一栏! 把redis这个环节系统补上,再转回去scrapy-redis才好深入; 正文: Redis是一种内存数据库,…...

【野火i.MX6ULL开发板】利用microUSB线烧入Debian镜像
0、前言 烧入Debian镜像有两种方式:SD卡、USB SD卡:需要SD卡(不是所有型号都可以,建议去了解了解)、SD卡读卡器 USB:需要microUSB线 由于SD卡的网上资料很多了,又因为所需硬件(SD卡…...
“我在大A炒自己”
嘻嘻嘻,大伙儿好像还挺喜欢我闲聊,今天太忙,没得空精进技术,那咱还是接着闲聊吧😂😂 看到标题点进来的各位大A真爱粉,请先收下我的崇高敬意!!别误会,标题说的…...
js 颜色转换,RGB颜色转换为16进制,16进制颜色转为RGB格式
颜色转换,RGB颜色转换为16进制,16进制颜色转为RGB格式,可以自己设置透明度。 //十六进制颜色值的正则表达式 var reg /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/; /*RGB颜色转换为16进制*/ String.prototype.colorHex function () {var that this;if (/^…...

uniapp中用户登录数据的存储方法探究
Hello大家好!我是咕噜铁蛋!作为一个博主,我们经常需要在应用程序中实现用户登录功能,并且需要将用户的登录数据进行存储,以便在多次使用应用程序时能够方便地获取用户信息。铁蛋通过科技手段帮大家收集整理了些知识&am…...

引导过程与服务控制
文章目录 一、Linux操作系统引导过程1、开机启动的完整过程1.1 开机自检(BIOS)1.2 MBR引导1.3 GRUB菜单1.4 加载内核(kernel)1.5 init进程初始化 2、系统初始化进程2.1 init进程2.2 systemdinit与systemd区别 3、Systemd单元类型4…...

《矩阵分析》笔记
来源:【《矩阵分析》期末速成 主讲人:苑长(5小时冲上90)】https://www.bilibili.com/video/BV1A24y1p76q?vd_sourcec4e1c57e5b6ca4824f87e74170ffa64d 这学期考矩阵论,使用教材是《矩阵论简明教程》,因为没…...
『App自动化测试之Appium应用篇』| Appium常用API及操作
『App自动化测试之Appium应用篇』| Appium常用API及操作 1 press_keycode1.1 键盘操作1.2 关于KeyCode1.3 press_keycode源码1.4 电话键相关1.5 控制键相关1.6 基本按键相关1.7 组合键相关1.8 符号键相关1.9 使用举例 2 swip方法2.1 swip说明2.2 swip使用方法2.3 使用示例 3 sc…...

VSCode搭建 .netcore 开发环境
一、MacOS 笔者笔记本电脑上安装的是macOS High Sierra(10.13),想要尝试一下新版本的.netcore,之前系统是10.12时,.netcore 3.1刚出来时安装过3.1版本,很久没更新了,最近.net8出来了,想试一下,…...

python 写自动点击爬取数据
今天来点不一样的!哥们 提示: 这里只是用于自己学习的 ,请勿用违法地方 效果图 会进行点击下一页 进行抓取 需要其他操作也可以自己写 文章目录 今天来点不一样的!哥们前言一、上代码?总结 前言 爬虫是指通过编程自动…...

CSDN博客重新更新
说来惭愧,好久没更新博客文章,导致个人博客网站:https://lenky.info/ 所在的网络空间和域名都过期了都没发觉,直到有个同事在Dim上问我我的个人博客为啥打不开了。。。幸好之前有做整站备份,后续慢慢把内容都迁回CSDN上…...
《剑指 Offer》专项突破版 - 面试题 5 : 单词长度的最大乘积(C++ 实现)
目录 前言 方法一 方法二 前言 题目链接:318. 最大单词长度乘积 - 力扣(LeetCode) 题目: 输入一个字符串数组 words,请计算不包含相同字符的两个字符串 words[i] 和 words[j] 的长度乘积的最大值。如果所有字符串…...

【Java集合篇】HashMap的get方法是如何实现的?
HashMap的get方法是如何实现的 ✔️典型解析✔️拓展知识仓✔️如何避免HashMap get方法的哈希重✔️HashMap get方法的优缺点有哪些✔️HashMap get方法的是线程安全的吗✔️什么是ConcurrentHashMap✔️ConcurrentHashMap有哪些应用场景✔️ConcurrentHashMap的优缺点 ✔️源…...

Java学习苦旅(二十二)——MapSet
本篇博客将详细讲解Map和Set。 文章目录 搜索概念模型 MapMap.Entry<K, V>Map的常用方法说明TreeMap和HashMap的区别 Set常用方法说明TreeSet和HashSet的区别 结尾 搜索 概念 Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例…...

【Linux Shell】12. 文件包含
和其他语言一样,Shell 也可以包含外部脚本,这样可以很方便的封装一些公用的代码作为一个独立的文件。可以理解为在第2个文件中包含第1个文件,执行第1个文件的代码。 被包含的文件 不需要可执行权限 。Shell 文件包含的语法格式如下࿱…...

前端-基础 常用标签-超链接标签( 锚点链接 )
锚点链接 : 点击链接,可以快速定位到 页面中的某个位置 如果不好理解,讲一个例子,您就马上明白了 >>> 这个是 刘德华的百度百科 ,可以看到,页面里面有很多内容,那就得有个目录了 …...

2024--Django平台开发-基础信息(一)
一、前置知识点 - Python环境搭建 (Python解释器、Pycharm、环境变量等) - 基础语法(条件、循环、输入输出、编码等) - 数据类型(整型、布尔型、字符串、列表、字典、元组、集合等) - 函数(文件操作、返回值、参数、作用域等) - 面向对象 (类、对象、封装、继承、多态等)包和模…...
C++力扣题目--94,144,145二叉树递归遍历
思路 这次我们要好好谈一谈递归,为什么很多同学看递归算法都是“一看就会,一写就废”。 主要是对递归不成体系,没有方法论,每次写递归算法 ,都是靠玄学来写代码,代码能不能编过都靠运气。 本篇将介绍前后…...

开源游戏引擎:创造无限可能 | 开源专题 No.56
godotengine/godot Stars: 62.6k License: MIT Godot Engine 是一个功能强大的跨平台游戏引擎,可用于创建 2D 和 3D 游戏。它提供了一套全面的常见工具,让用户可以专注于制作游戏而不必重复造轮子。该引擎支持将游戏一键导出到多个平台上,包…...

MyBatisPlus学习一:快速入门
前言 前面快速学习了Mybatis,现在开始快速学习MyBatisPlus 学习教程: 黑马mybatis教程全套视频教程,2天Mybatis框架从入门到精通 黑马程序员最新MybatisPlus全套视频教程,4小时快速精通mybatis-plus框架 简介 MyBatisPlus 是…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...

负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...