向爬虫而生---Redis 基石篇6 <拓展HyperLogLog>
前言:
继续之前的
向爬虫而生---Redis 基石篇5 <拓展Zset>-CSDN博客
一些比较基础的redis类型在初中级阶段用着没有毛病,但是到了大数据时代,慢慢一些更高级的场景,就需要把这几个类型搬出来了!
正文:
概念:
当我们需要对一个大型数据集进行去重计数时,传统的集合或者基数计数方法可能会面临内存消耗较大的问题。这时,Redis的HyperLogLog(HLL)数据结构就可以派上用场了。
HyperLogLog是一种基数估计算法,它可以通过占用固定的内存空间来估计一个集合中不重复元素的数量,而无需存储实际的元素。它的特点是具有较小的内存占用和高度的近似精度。
下面是一些关键概念和特性:
基础原理:
HyperLogLog使用随机哈希函数将输入元素映射到一个固定长度的二进制字符串。这些二进制字符串被组织为一个位图,其中每个位被用于存储零或一。通过统计位图中置为一的位的数量,就可以估计不重复元素的数量。
精度和误差:
HyperLogLog可以提供高度的近似精度,一般误差在0.81%以内(官方给的数据,其实可以忽略)。在正常情况下,随着不重复元素数量增加,误差会保持在相对稳定的范围内。
容量和内存占用:
HyperLogLog的固定内存占用仅取决于预先设定的精度和要统计的元素数量。这意味着,无论原始集合大小如何,都能以相对较小的内存占用进行近似计数---大约12KB。
数据合并:
HyperLogLog提供了数据合并的功能,即多个HLL数据结构可以合并为一个,而不会对计数结果产生明显的影响。
Redis命令:
在Redis中,可以使用以下命令进行HyperLogLog操作:PFADD、PFCOUNT、PFMERGE等。通过这些命令,可以添加元素、获取近似计数以及合并HLL数据结构。
Redis中提供了以下命令用于操作HyperLogLog数据结构:
1.PFADD key element [element ...]
:
将一个或多个元素添加到给定的HyperLogLog数据结构中。
2.PFCOUNT key [key ...]
:
估计给定HyperLogLog数据结构中的不重复元素数量。
3.PFMERGE destkey sourcekey [sourcekey ...]
:
将多个HyperLogLog数据结构合并到一个目标HyperLogLog中。
4.PFDEBUG subcommand [arguments ...]
:
调试命令,用于在Redis服务器端打开或关闭HyperLogLog的内部低级别调试。
(这些命令可以通过执行REDIS-cli
命令行工具或者在编程语言中使用Redis客户端库来进行操作。)
PS:HyperLogLog命令的返回值通常是一个近似的基数计数结果,而不是实际元素的列表或详细信息。这是因为HyperLogLog是一种基数估计算法,它通过占用固定的内存空间来估计不重复元素的数量,而不存储实际的元素。
例子说明:
当我们需要统计网站的独立访客数量时,HyperLogLog可以提供一种高效的方法。
假设有一个在线论坛,我们想要统计每天访问论坛的独立用户数量(就是他独立的识别地址)。
首先,我们可以使用HyperLogLog数据结构来进行统计。我们可以在Redis中创建一个新的HyperLogLog结构,并使用PFADD命令将每个访问者的唯一标识添加到HyperLogLog中。
例如,当一个用户访问论坛时,我们会执行以下命令:
PFADD daily_visitors 1001
这将把用户的唯一标识(这里使用1001作为示例---实际一般会是ip地址或者别的例如个人识别信息之类)添加到名为daily_visitors
的HyperLogLog中。
在每次用户访问时,我们都可以执行相同的命令来将唯一标识添加到HyperLogLog中。
接下来,我们可以使用PFCOUNT命令来获取近似的独立访客数量:
PFCOUNT daily_visitors
这将返回一个大致的独立访客数量,而无需存储每个访问者的唯一标识。
另外,如果我们需要合并不同时间段的独立访客数量,可以使用PFMERGE命令。例如,假设我们想要合并今天和昨天的独立访客数量:
PFMERGE combined_visitors daily_visitors_today daily_visitors_yesterday
这会将今天和昨天的独立访客数量合并到名为combined_visitors
的HyperLogLog中。
应用到scrapy:
当使用HyperLogLog进行URL去重时,可以使用URL的哈希值作为唯一标识。
import hashlib
import redis
import scrapy
from scrapy.exceptions import CloseSpider# 创建Redis连接
redis_client = redis.Redis()class MySpider(scrapy.Spider):name = 'my_spider'def start_requests(self):urls = ['http://www.example.com/page1','http://www.example.com/page2','http://www.example.com/page1', # 重复的URL]for url in urls:url_hash = self.get_url_hash(url)if redis_client.sadd('url_hashes', url_hash) == 1:yield scrapy.Request(url, callback=self.parse)else:self.logger.info('URL already crawled: %s', url)def parse(self, response):# 处理返回的网页数据# ...def get_url_hash(self, url):# 计算URL的哈希值作为唯一标识url_hash = hashlib.sha1(url.encode()).hexdigest()return url_hash
在这个示例中,我们创建了一个名为MySpider
的Spider类。在start_requests
方法中,我们定义了一些示例URL,并使用get_url_hash
方法计算URL的哈希值作为唯一标识。然后,我们使用Redis的sadd
命令将唯一标识添加到名为url_hashes
的HyperLogLog中。如果sadd
命令返回1(表示添加成功),则说明这是一个新的URL,我们使用Scrapy的Request
对象加入爬取队列;否则,我们将其标记为已经爬取过的重复URL。
在parse
方法中,我们处理返回的网页数据。
需要确保已经正确安装和配置了Redis,并确保Redis服务器正在运行。你可以根据实际情况修改Redis的连接参数,例如设置密码、指定IP地址等。
---------->案例,请勿当真,只是演示!!!
总结:
通过HyperLogLog,我们可以高效地估计一个大型数据集中不重复元素的数量,比如统计每天访问论坛的独立用户数量。它通过占用固定的内存空间,提供高度的近似精度,使得计数操作更加高效和可扩展。
相关文章:
向爬虫而生---Redis 基石篇6 <拓展HyperLogLog>
前言: 继续之前的 向爬虫而生---Redis 基石篇5 <拓展Zset>-CSDN博客 一些比较基础的redis类型在初中级阶段用着没有毛病,但是到了大数据时代,慢慢一些更高级的场景,就需要把这几个类型搬出来了! 正文: 概念: 当我们需要对一个大型数据集进行去重计…...
JavaScript中的this
在实际应用中,了解 this 的行为是非常重要的,特别是在编写库或框架时,或者当你需要在回调函数中访问特定的上下文时,通常推荐使用箭头函数或者其他方法来确保 this 的正确指向。 在ES6中,this 的值取决于它是如何被调用…...
宝塔php站点设置伪静态规则 访问 a.com 时候跳转到 a.com/b.html
要在宝塔 PHP 站点中设置伪静态规则,实现访问a.com时跳转到a.com/b.html,可以按照以下步骤进行操作: 打开宝塔面板并登录到你的服务器管理界面。进入网站设置页面,找到你要设置伪静态规则的 PHP 站点。在站点设置中,找…...

git介绍4.2
git(版本控制工具) 一、git 介绍 1、git是目前世界上最先进的分布式版本控制系统,可以有效,高速的处理从小到大的项目版本管理。 2、git是linux torvalds 为了帮助管理linux内核开发二开发的一个开放源码的版本控制软件。 3、git作用:更好…...

【深入了解设计模式】组合设计模式
组合设计模式 组合模式是一种结构型设计模式,它允许你将对象组合成树状结构来表现“整体-部分”关系。组合模式使得客户端可以统一对待单个对象和组合对象,从而使得代码更加灵活和易于扩展。 概述 对于这个图片肯定会非常熟悉,上图我们可…...

4.Java---方法+重载
方法 方法的调用是需要开辟内存的,方法调用结束内存就被销毁了. 下面将介绍一个经典的错误标准的0分的示意! 我们日常中写交换两个数字的代码的时候都会用如下的方法进行描述: 你是不是觉得自己写的特别对!终于可以独立写一个小小的函数了? 下面运行一下看看结果 哦莫!怎么…...

蓝桥杯Java B组历年真题(2013年-2021年)
一、2013年真题 1、世纪末的星期 使用日期类判断就行,这里使用LocalDate,也可以使用Calendar类 答案 2099 使用LocalDate import java.time.LocalDate; import java.time.format.DateTimeFormatter; // 1:无需package // 2: 类名必须Main, 不可修改p…...

C++笔记(五)--- 虚函数(virtual)
目录 虚函数介绍 虚函数、覆盖和重载区别 虚函数介绍 C的虚函数是多态性的表现 1.构造函数不能为虚函数2.子类继承时虚函数仍为虚函数3.虚函数类外实现时,不需要加virtual4.有虚函数的类,析构函数一定要写成虚函数(否则可能会造成内存泄漏&…...

编写加密程序,加密规则为:将所有字母转化为该字母后的第三个字母,即A->D、B->E
编写加密程序,加密规则为:将所有字母转化为该字母后的第三个字母,即A->D、B->E、C->F、…、Y->B、Z->C。小写字母同上,其他字符不做转化。输入任意字符串,输出加密后的结果。 例如:输入&qu…...

【笔记】:更方便的将一个List中的数据传入另一个List中,避免多重循环
这里是 simpleInfoList 集合,记为集合A(传值对象) List<CourseSimpleInfoDTO> simpleInfoList courseClient.getSimpleInfoList(courseIds);if(simpleInfoListnull){throw new BizIllegalException("当前课程不存在!");}这…...

Cisco Secure ACS 5.8.0.32 安装 + Crack 教程
Cisco Secure ACS 5.8.0.32 安装 Crack 教程 前言系统环境开始安装 开始破解导入授权文件 前言 在ESXi 6.7 上经历过无数次的安装尝试 测试了各种兼容版本都没有安装成功,记最后一次安装成功的过程. 系统环境 服务器 : Dell R720xd CPU : E5-2620 v2 系统 : ESXi 6.7…...
项目准备March
Nginx主要用来作为Http服务器,要实现Tomcat的负载均衡,就可以通过Nginx来实现。 正向代理代理的是客户端,反向代理代理的是服务端。SpringBoot采用约定优于配置的思想,简化Spring项目的配置开发。 前端请求其实并未直接发送到后…...

集智书童 | YOLO+混合注意力机制 | YOLOv5再加4.3%才可以做对手,Transformer混合设计依旧可以卷
本文来源公众号“集智书童”,侵权删,干货满满。YOLOv5重出江湖! 原文链接:https://mp.weixin.qq.com/s/vb7HsA0fKDgRc3uC8Z-2yw 在工业生产过程中,由于低效率、不统一的评估、高成本以及缺乏实时数据,传统…...
Codeforces Round 894 (Div. 3)----->C. Flower City Fence
题目总思路: 要判断是否对称,只需要判断两个放法得到的图形是否相同(竖着放,横着放),这两个放法有个很重要的特性:就是数组中大于1的个数,就是横着放时,第一竖排的高度。…...

CryoEM - CryoAI: Amortized Inference of Poses 工程源码复现
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/136384544 Paper: CryoAI: Amortized Inference of Poses for Ab Initio Reconstruction of 3D Molecular Volumes from Real Cryo-EM Images CryoAI: 基于摊…...
项目预备知识
导入两个头文件 #include <graphics.h> // 引入 EasyX 的图形库头文件 #include <conio.h> // 引入 conio.h 以使用 getch() 窗口创建函数:小黑屏 initgraph(640, 480, SHOWCONSOLE); closegraph(); //关闭一个窗口 设置背景颜色:这…...

redis实战笔记汇总
文章目录 1 NoSQL入门概述1.1 能干嘛?1.2 传统RDBMS VS NOSQL1.3 NoSQL数据库的四大分类1.4 分布式数据库CAP原理 BASE原则1.5 分布式集群简介1.6 淘宝商品信息的存储方案 2 Redis入门概述2.1 是什么?2.2 能干嘛?2.3 怎么玩?核心…...

elment-ui table表格排序后 清除排序箭头/恢复默认排序 的高亮样式
问题描述: 1.默认排序是按照名称升序排列(图一) 2.在选择了筛选项以及其他排序方式之后,箭头高亮是这样的(图二) 3.当我点击清空按钮后,类型清空了,并且传给后端的排序方式是名称/升…...
MySQL数据库基本操作(二)
查询语句 1. 排序查询* 语法:order by 子句* order by 排序字段1 排序方式1 , 排序字段2 排序方式2... * 排序方式:* ASC:升序,默认的。* DESC:降序。 * 注意:* 如果有多个排序条件&#…...

Unity(第十部)时间函数和文件函数
时间函数 using System.Collections; using System.Collections.Generic; using UnityEngine;public class game : MonoBehaviour {// Start is called before the first frame updatefloat timer 0;void Start(){//游戏开始到现在所花的时间Debug.Log(Time.time);//时间缩放值…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...