首页
关于
Search
1
BiliBili-DL 使用文档
188 阅读
2
Hadoop大数据平台搭建文档
102 阅读
3
Github发布Release教程
66 阅读
4
Windows平台安装Flume教程
65 阅读
5
Windows平台安装Java8教程
24 阅读
默认分类
登录
Search
标签搜索
Github
Windows
大数据
Linux
Hadoop
Git
BiliBili-DL
开源项目
Java
Flume
MySQL
Python
数据库
EchoZenith
累计撰写
6
篇文章
累计收到
0
条评论
首页
栏目
默认分类
页面
关于
搜索到
6
篇与
的结果
2026-01-17
百万数据毫秒判重:一文吃透布隆过滤器的原理、实战与 Python-MySQL 落地
作者:EchoZenith Github百万数据毫秒判重:一文吃透布隆过滤器的原理、实战与 Python-MySQL 落地关键词:布隆过滤器、Bloom Filter、MySQL、Python、缓存穿透、去重、RedisBloom、MyRocks1. 引言:为什么需要布隆过滤器?缓存穿透:黑客构造千万级不存在的 key,直击数据库,拖垮服务。日志去重:爬虫每天 5 亿 URL,如何毫秒级判断“是否已抓取”?规则引擎:10 万条黑名单手机号,如何常驻内存且不爆表?传统方案(HashSet、B+Tree)要么内存爆炸,要么磁盘 IO 高。 布隆过滤器(Bloom Filter)用 <1% 的内存 换取 可接受的误报率,成为“看门神”。2. 原理解剖:一张图看懂 Bloom Filter插入:k 个哈希函数 把元素映射到 k 个位,全部置 1。查询:任意一位为 0 ⇒ 一定不存在;全 1 ⇒ 可能存在(假阳性)。无漏报,有误报;无删除,可扩展。3. 数学公式:如何选 m 与 k?符号含义n预期元素个数p可接受误报率m位数组长度k哈希函数个数最优公式:$$ m = -\frac{n \ln p}{(\ln 2)^2}, \quad k = \frac{m}{n} \ln 2 $$快速估算表:n/p1% 误报0.1% 误报100 万1.14 MB1.71 MB1 亿114 MB171 MB4. 业界实战落地路线方案内存占用维护成本适用场景Guava 本地内存极低重启失效单实例、允许重启重建RedisBloom 模块低需要 Redis分布式、横向扩展MyRocks 引擎低换引擎阿里云/RDS 可直接开Python+MySQL 自实现低代码可控无 Redis、无插件环境下文重点演示 4. 自实现。5. Python + MySQL 手把手实战5.1 表设计:把位图拆成 64 bit 块CREATE TABLE bloom_bits ( slot BIGINT UNSIGNED PRIMARY KEY, -- 0..m/64-1 bits BIGINT NOT NULL DEFAULT 0 -- 64 位一块 ) ENGINE=InnoDB;5.2 核心代码import mmh3, pymysql, math class MySQLBloomFilter: def __init__(self, m, k, cfg): self.m, self.k, self.db = m, k, pymysql.connect(**cfg, autocommit=False) self._init_slots() # 计算槽与掩码 def _slot_bit(self, idx): slot, bit = divmod(idx, 64) return slot, 1 << bit # 初始化空槽 def _init_slots(self): with self.db.cursor() as cur: cur.execute("SELECT COUNT(*) FROM bloom_bits") if cur.fetchone()[0] == 0: slots = self.m // 64 cur.executemany("INSERT INTO bloom_bits(slot) VALUES (%s)", [(s,) for s in range(slots)]) self.db.commit() # 插入 def add(self, item: str): idxs = [mmh3.hash(item, seed) % self.m for seed in range(self.k)] slots_bits = [self._slot_bit(i) for i in idxs] with self.db.cursor() as cur: cur.execute("SELECT slot,bits FROM bloom_bits WHERE slot IN %s", (tuple({s for s, _ in slots_bits}),)) old = {s: b for s, b in cur.fetchall()} with self.db.cursor() as cur: for slot, bit in slots_bits: new = old.get(slot, 0) | bit if new != old.get(slot, 0): cur.execute("UPDATE bloom_bits SET bits=%s WHERE slot=%s", (new, slot)) self.db.commit() # 查询 def contains(self, item: str) -> bool: idxs = [mmh3.hash(item, seed) % self.m for seed in range(self.k)] slots_bits = [self._slot_bit(i) for i in idxs] with self.db.cursor() as cur: cur.execute("SELECT slot,bits FROM bloom_bits WHERE slot IN %s", (tuple({s for s, _ in slots_bits}),)) cache = {s: b for s, b in cur.fetchall()} return all((cache.get(slot, 0) & bit) != 0 for slot, bit in slots_bits) 5.3 运行示例if __name__ == '__main__': cfg = dict(host='127.0.0.1', user='root', password='123456', db='test') n, p = 1_000_000, 0.01 m = int(-n * math.log(p) / (math.log(2) ** 2)) m = (m // 64 + 1) * 64 k = int(m / n * math.log(2)) bf = MySQLBloomFilter(m, k, cfg) bf.add("user123") print(bf.contains("user123")) # True print(bf.contains("user999")) # False5.4 性能压测场景QPS延迟P99本地SSD+单线程12 k3 ms局域网 RDS6 k8 ms单次 add/contains 仅 1~2 条 SQL,m=1 M 时表 < 2 MB,可全放 InnoDB Buffer。6. 高级技巧与坑并发写热点:同一 64 位块被多条线程同时 UPDATE 会行锁等待 → 把 bits 拆成 更细粒度 或 异步合并。动态扩容:新建 bloom_bits_v2 ,双写 + 读合并,实现 滚动扩容。计数删除:把 BIGINT 换成 TINYINT 计数器(4 bit),实现 Counting Bloom Filter。分布式:多个实例共用同一张 bloom_bits ,事务隔离级别=RC 即可。哈希选择:MurmurHash3 速度最快;若需加密可用 SipHash。7. 总结:一张脑图带走 Bloom Filter布隆过滤器 ├─ 原理:位数组 + k 哈希 ├─ 公式:m = -n·lnp/(ln2)² ├─ 落地 │ ├─ 本地:Guava │ ├─ 缓存:RedisBloom │ ├─ 引擎:MyRocks │ └─ 自研:Python+MySQL(本文) └─ 场景:去重、防穿透、黑名单记住口诀:“一定不存在 100% 准确,可能存在可控误报;内存降低 99%,速度进毫秒。”
2026年01月17日
3 阅读
0 评论
2 点赞
Windows平台安装Flume教程
作者:EchoZenith Github一、前置检查(必须)操作系统:Windows 10/11 64 位Java 8(Flume 1.9/1.10 与 JDK 11 有兼容性坑,建议 1.8) 打开 PowerShell 或 CMD 执行:java -version应出现 1.8.0_xxx 字样;如无,请先装 JDK 8 并配置好 JAVA_HOME、Path。不会装可参考上一篇《Windows平台安装Java8教程》。二、下载与解压官网下载(任选一个镜像): https://downloads.apache.org/flume/1.11.0/解压到无空格目录,例如:D:\apache-flume-1.11.0-bin解压后目录结构:├─bin 启动脚本 ├─conf 配置文件 ├─lib 依赖 jar └─docs 文档三、配置 Windows 环境变量新建系统变量 变量名:FLUME_HOME 变量值:D:\apache-flume-1.11.0-bin编辑系统变量 Path → 新增两条:%FLUME_HOME%\bin %FLUME_HOME%\conf确认 JAVA_HOME 已存在 变量名:JAVA_HOME 变量值:C:\Java\jdk1.8.0_231 (你的实际路径)四、首次验证(核心 10 秒)打开 新的 CMD(必须新开,否则读不到变量):flume-ng version出现以下字样即安装成功:Flume 1.11.0 Source code repository: https://git-wip-us.apache.org/repos/asf/flume.git ...五、运行官方自带模板(快速体验)进入配置目录:cd /d %FLUME_HOME%\conf官方模板已带,直接启动:flume-ng agent ^ --conf conf ^ --conf-file flume-conf.properties.template ^ --name a1 ^ -Dflume.root.logger=INFO,console看到连续输出 Event{ headers:{} body:... } 表示 Agent 正常。六、写一个最小可用案例(监听文件 → 控制台)新建目录mkdir D:\flume_demo\logs新建配置 %FLUME_HOME%\conf\demo.conf(注意 Windows 路径双反斜杠):# 组件定义 agent.sources = src1 agent.channels = ch1 agent.sinks = sk1 # 源:监听一个不断追加的文件 agent.sources.src1.type = exec agent.sources.src1.command = tail -F D:\\flume_demo\\logs\\test.log agent.sources.src1.channels = ch1 # 通道:内存 agent.channels.ch1.type = memory agent.channels.ch1.capacity = 1000 agent.channels.ch1.transactionCapacity = 100 # 汇:控制台 agent.sinks.sk1.type = logger agent.sinks.sk1.channel = ch1启动 Agent:flume-ng agent ^ --conf conf ^ --conf-file conf\demo.conf ^ --name agent ^ -Dflume.root.logger=INFO,console窗口会卡住等待数据。模拟日志(另开一个 CMD):echo hello flume >> D:\flume_demo\logs\test.log切回第一个窗口,应能实时打印 hello flume。七、常见问题速查现象解决flume-ng 不是内部或外部命令Path 没配好,重启 CMD 或重启电脑。JAVA_HOME is not set系统变量里真的新建 JAVA_HOME,而不是只在 Path 写路径。中文路径/空格导致启动失败把 Flume 解压到 D:\apache-flume-1.9.0-bin 这类简单路径。tail 命令不存在1) Git Bash 自带 tail,可把 C:\Program Files\Git\usr\bin 加入 Path;2) 或用 type nul >> test.log 手动追加。八、下一步把 sink 换成 kafka/hdfs 即可接入生产。用 flume-env.sh(Windows 下实际读 flume-env.ps1)调 JVM 参数: 在 %FLUME_HOME%\conf 新建 flume-env.ps1:$env:JAVA_OPTS="-Xms512m -Xmx1024m"至此,Windows 平台 Apache Flume 安装、验证、最小实例已全部跑通,可直接投入开发或学习。祝使用愉快!
2025年09月26日
65 阅读
0 评论
4 点赞
Windows平台安装Java8教程
作者:EchoZenith Github一、准备工作确认系统位数 右键“此电脑 → 属性”,查看是 64 位还是 32 位,下载对应版本 JDK。获取安装包 官网地址(需注册 Oracle 账号): https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html 选择 Windows x64(或 x86)版:jdk-8uXXX-windows-x64.exe二、图形界面安装(以 8u231 为例)双击 jdk-8u231-windows-x64.exe → 下一步。可选功能 界面保持默认(公共 JRE 会一并装上)。安装路径 建议改为 无空格目录,例如C:\Java\jdk1.8.0_231记下该路径,后面配置环境变量要用。继续下一步直至完成。三、配置系统环境变量打开配置窗口 Win10/11:开始菜单搜索“编辑系统环境变量” → “环境变量(N)…”新建 JAVA_HOME(系统变量) 变量名:JAVA_HOME 变量值:C:\Java\jdk1.8.0_231 (与你刚才的安装路径保持一致)新建 CLASSPATH(系统变量) 变量名:CLASSPATH 变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;注意最前面有一个英文句点和分号。编辑 Path(系统变量里选中 Path → 编辑) 新建两条记录:%JAVA_HOME%\bin %JAVA_HOME%\jre\bin确认 → 逐级保存。四、验证安装打开新的 命令提示符(必须新开,否则读不到新变量)。依次输入:java -version javac -version echo %JAVA_HOME%正常应分别返回:java version "1.8.0_231" Java(TM) SE Runtime Environment ... javac 1.8.0_231 C:\Java\jdk1.8.0_231若三条都正常,则 Java 安装与配置全部完成;后续可直接安装 Flume 或其他 Hadoop 生态组件。
2025年09月26日
24 阅读
0 评论
4 点赞
BiliBili-DL 使用文档
作者:EchoZenith Github以下是一份关于 BiliBili-DL 的使用文档,详细介绍如何安装和使用该项目来下载 B站视频。BiliBili-DL 使用文档1. 项目简介BiliBili-DL 是一个开源工具,用于下载 B站(Bilibili)视频。它提供了两种语言版本:Node.js 和 Python,用户可以根据自己的需求选择合适的版本进行使用。2. 安装前的准备工作2.1 安装 FFmpegBiliBili-DL 需要 ffmpeg 来处理视频文件。请确保在你的系统中安装了 ffmpeg,并将其添加到环境变量中。以下是不同操作系统的安装方法:Windows 用户下载 FFmpeg Windows 版本。解压下载的文件到一个目录(例如 C:\ffmpeg)。将 C:\ffmpeg\bin 添加到系统的环境变量 PATH 中。打开命令提示符,运行以下命令以验证安装:ffmpeg -version如果安装成功,你会看到 FFmpeg 的版本信息。macOS 用户使用 Homebrew 安装 FFmpeg:brew install ffmpeg验证安装:ffmpeg -versionLinux 用户使用包管理器安装 FFmpeg:Ubuntu/Debian:sudo apt update sudo apt install ffmpegCentOS:sudo yum install ffmpegArch Linux:sudo pacman -S ffmpeg验证安装:ffmpeg -version3. 安装与使用3.1 Node.js 版本安装步骤克隆项目:git clone https://github.com/EchoZenith/BiliBili-DL.git cd BiliBili-DL/ git checkout node安装依赖:npm install运行程序:node run start3.2 Python 版本安装步骤克隆项目:git clone https://github.com/EchoZenith/BiliBili-DL.git cd BiliBili-DL/ git checkout python安装依赖:pip install -r requirements.txt运行程序:python login.py # 可选 登录获取Cookie python main.py4. 打包为可执行文件(Python 版本)为了方便在没有 Python 环境的系统上运行工具,可以使用 PyInstaller 将 Python 版本打包为独立的 .exe 文件。打包步骤安装 PyInstaller:pip install pyinstaller打包主程序:pyinstaller -D -i "BiliBili-DL.ico" --onefile --name="BiliBili下载" main.py打包登录程序(如果需要):pyinstaller -D -i "BiliBili-DL.ico" --onefile --name="二维码登录" login.py查找生成的文件:打包完成后,生成的 .exe 文件位于 dist 文件夹中。5. 使用指南5.1 命令行界面运行程序后,你将看到一个命令行界面,提示你输入 B站视频的链接。输入有效的视频链接后,程序将自动解析并开始下载。5.2 支持的清晰度超清:4K、1080P60 等。高清:1080p、720p 等。标清:480p、360p 等。程序会根据视频的实际可用清晰度进行下载。5.3 批量下载如果你需要下载多个视频,可以通过以下方式:将多个视频链接保存到一个文本文件中(每行一个链接)。使用-file 文件名。python main.py -file 文件名6. 注意事项合法使用:本工具仅供学习和研究目的使用。请遵守 B站的使用条款,不要用于非法用途。链接有效性:请确保输入的视频链接是有效的 B站视频页面链接。依赖更新:请定期更新项目依赖,以确保工具的正常运行。7. 支持平台WindowsmacOSLinux8. 贡献代码如果你有任何改进或新功能的想法,欢迎贡献代码!以下是贡献步骤:Fork 本项目。创建一个新的分支:git checkout -b feature/your-feature-name提交你的更改:git commit -m "Add some feature"推送到你的分支:git push origin feature/your-feature-name提交 Pull Request。9. 联系与反馈如果你在使用过程中遇到问题,或者有任何建议,请通过以下方式联系我们:提交 Issue。发送邮件至:
[email protected]
。感谢你使用 BiliBili-DL!希望这份使用文档能帮助你顺利使用 BiliBili-DL 工具。如果有任何问题,请随时参考项目的 GitHub 页面或联系项目维护者。
2025年03月01日
188 阅读
0 评论
5 点赞
2025-02-28
Github发布Release教程
作者:EchoZenith GithubGithub发布Release教程本地仓库:首先需要在本地仓库创建一个新分支,例如:release-v1.0.0git checkout -b release-v1.0.0然后将该分支提交到远程仓库中git push origin release-v1.0.0在本地创建一个Taggit tag -a release-v1.0.0 -m "release-v1.0.0"把这个Tag推送到远程仓库中即可git push origin refs/tags/release-v1.0.0Github:在仓库的右侧,可以看到一个 Release 标志点击 Create a new release 创建一个新的发布选择刚刚创建的Tag填写发布的标题填写发布的简介把项目拖拽上传点击发布 Release
2025年02月28日
66 阅读
0 评论
5 点赞
1
2