Toolkits 简介

IDE Integrated Development Environment(集成开发环境) 常用的开发与调试工具 VS Code:轻量级通用编辑器 IntelliJ IDEA:Java 项目开发 PyCharm:Python 项目开发 版本控制 用于代码协作、历史管理与自动化流程 Git / GitHub:分布式版本控制与协作 GitHub Actions:自动化 CI/CD 工作流 GitKraken:可视化 Git 操作客户端 容器部署 Docker:应用容器化与环境一致性 Docker Compose:多容器开发环境 Kubernetes(可选):应用编排与大规模部署 前端开发 Node.js / npm / pnpm:前端构建环境 Vue / React:常用前端框架 Vite:快速构建工具 TailwindCSS:实用化 CSS 框架 后端开发 Spring Boot:现代化 Java 后端开发框架 MyBatis / JPA:数据库 ORM Redis:缓存中间件 OpenAPI / Swagger:接口文档生成 运维开发 日志管理 Loki:分布式日志系统 Vector:日志采集与处理 👉 相关笔记:Vector 日志采集与处理 LogstashEncoder:结构化 JSON 日志 系统监控 Prometheus:时序监控与报警 Grafana:可视化监控面板 应用测试 Postman:接口测试 JMeter:压测工具 数据存储 ClickHouse: 高性能列式数据库 👉 相关笔记:ClickHouse 高性能数据库 学习与效率工具 帮助知识管理、项目整理与写作 ...

August 16, 2024 · 1 min · 94 words · Guangyang Zhong

Vector 日志采集与处理

简介 Vector 是一个高性能日志与指标采集代理,它从各种 source 收集数据,经过 transform 处理后发送到 sink(如 Loki、ClickHouse、Kafka、Elasticsearch 等) 它的特点是高吞吐、低延迟、无需依赖 JVM、轻量好部署,非常适合边缘节点和容器环境 本文主要讲述 Events 和 Compnents 1. 配置结构概览 Vector 有两种数据模型 (Data Model), 又称事件(Events): Logs: 用于表示结构化或非结构化日志数据 metrics: 用于表示指标数据 Vector 的配置由三个核心部分 (Compnets) 组成: sources:数据采集源 transforms:数据处理与解析 sinks:输出目标 2. Data model(events) Log events Here’s an example representation of a log event (as JSON): { "log": { "custom": "field", "host": "my.host.com", "message": "Hello world", "timestamp": "2020-11-01T21:15:47+00:00" } } Metric event 此处留给以后撰写 3. Compnents 3.1 source 详细配置请见 👉 Sources reference ...

August 20, 2024 · 2 min · 232 words · Guangyang Zhong

ClickHouse 高性能数据库

ClickHouse 高性能数据库 ClickHouse 是一款 开源、高性能的列式数据库,主要用于 大规模数据分析 (OLAP) 和 实时查询。它的特点是: 列式存储,读取指定列非常快 支持高并发写入和查询 强大的聚合功能,适合报表和日志分析 支持 SQL 查询,易上手 1️. 安装与快速开始 可以参考官方文档或社区教程 👉ClickHouse 官方文档 1.1 安装 curl https://clickhouse.com/ | sh sudo ./clickhouse install 1.2 运行 $ clickhouse-client --host server ClickHouse client version 24.12.2.29 (official build). Connecting to server:9000 as user default. Connected to ClickHouse server version 24.12.2. :) Specify additional connection details as necessary: Option Description --port <port> The port ClickHouse server is accepting connections on. The default ports are 9440 (TLS) and 9000 (no TLS). Note that ClickHouse Client uses the native protocol and not HTTP(S). -s [--secure] Whether to use TLS (usually autodetected). -u [--user] <username> The database user to connect as. Connects as the default user by default. --password <password> The password of the database user. You can also specify the password for a connection in the configuration file. If you do not specify the password, the client will ask for it. -c [--config] <path-to-file> The location of the configuration file for ClickHouse Client, if it is not at one of the default locations. See Configuration Files. 1.3 退出 To exit the client, press Ctrl+D, or enter one of the following instead of a query: ...

August 18, 2024 · 2 min · 270 words · Guangyang Zhong

QR Scanner 使用指南

简介 qr-scanner 是一款纯前端、零依赖的 JavaScript 二维码扫描库,完全在浏览器端运行,无需后端配合。它同时支持: 摄像头实时扫码 静态图片/文件离线扫码(支持 <img>、<canvas>、<video>、File、Blob 等多种来源) 底层使用 WebAssembly 加速解码,识别速度快、准确率高,在手机端表现尤为优秀,是目前最推荐的前端二维码扫描方案 本文以 React + Next.js 框架为例 1. 安装 npm install qr-scanner 或使用 yarn: yarn add qr-scanner 注意:已不再推荐直接用 <script> 标签引入,现代项目请通过包管理器安装 2. 基本引入方式 import QrScanner from 'qr-scanner'; 3. 核心类:QrScanner 3.1 摄像头实时扫码 const videoElement = document.getElementById('video') as HTMLVideoElement; const scanner = new QrScanner( videoElement, (result) => { console.log('扫码成功:', result.data); // result.cornerPoints 可用来做边框动画 }, { returnDetailedScanResult: true, // 返回完整对象而非仅字符串 highlightScanRegion: true, // 显示扫描区域遮罩 highlightCodeOutline: true, // 高亮二维码轮廓 } ); // 启动摄像头 await scanner.start(); // 停止扫描 scanner.stop(); 常用配置项 参数 说明 returnDetailedScanResult true 时返回 { data, cornerPoints } 对象 highlightScanRegion 显示半透明扫描区域框 highlightCodeOutline 实时绘制二维码四角轮廓 3.2 离线扫描图片文件 const file: File = 文件输入框.files[0]; const result = await QrScanner.scanImage(file, { returnDetailedScanResult: true }); console.log('二维码内容:', result.data); 支持所有图片源:File、Blob、HTMLImageElement、HTMLCanvasElement、URL 等 ...

August 16, 2024 · 2 min · 263 words · Guangyang Zhong

Redis 迭代历程

图片来源: https://bytebytego.com 2010 - 独立版 Redis(Standalone Redis) Redis 1.0 发布,架构简单,通常用作业务应用的缓存 特点:数据完全存储在内存中 问题:重启 Redis 会丢失所有数据,所有流量直接打到数据库 2013 - 持久化(Persistence) Redis 2.8 发布,引入持久化机制 RDB:内存数据快照,定期保存数据状态到磁盘 AOF(Append-Only File):记录每条写命令,保证数据在重启后恢复 2013 - 主从复制(Replication) Redis 2.8 增加复制功能,提高可用性 主节点:处理实时读写请求 从节点:同步主节点数据,实现高可用 2013 - Sentinel Redis 2.8 引入 Sentinel,用于监控 Redis 实例 功能: 监控实例状态 事件通知 自动故障转移(failover) 配置提供者(配置管理) 2015 - 集群(Cluster) Redis 3.0 发布,增加 Redis 集群功能 Redis Cluster:分布式数据库解决方案,通过分片管理数据 数据分片机制:将数据分为 16384 个槽位,每个节点负责部分槽位 后续发展 2017 - Redis 5.0:增加 Stream 数据类型 2020 - Redis 6.0:引入网络模块多线程 I/O ...

July 20, 2024 · 1 min · 78 words · Guangyang Zhong

Redis 如何持久化数据

图片来源: https://bytebytego.com 一、AOF(Append-Only File) 特点:写后日志(Write-after log),记录执行过的命令而不是数据本身 工作原理: Redis 先在内存中执行命令修改数据 然后将命令写入 AOF 文件 优势: 基于事件的设计,数据恢复简单 不阻塞当前写操作,性能高 注意:AOF 是命令日志,恢复时需要重放日志,日志大时恢复较慢 二、RDB(Redis Database) 特点:数据快照,在特定时间点记录整个数据集 工作原理: 主线程 fork 出 bgsave 子进程,共享内存数据 bgsave 读取数据并写入 RDB 文件 主线程修改数据时,创建数据副本(Copy-on-write) 主线程对副本操作,bgsave 继续写入 RDB 文件 优势: 数据恢复快速,只需加载快照即可 限制: 快照频率低时可能丢失最近修改的数据 三、混合策略(Mixed Approach) 生产环境常用策略: 使用 RDB 定时生成数据快照 使用 AOF 记录快照之后的命令 优势: 结合 RDB 快速恢复和 AOF 高可靠性,兼顾性能与安全

July 19, 2024 · 1 min · 54 words · Guangyang Zhong

Redis 为什么这么快

图片来源: https://bytebytego.com 一、基于内存(RAM-based) 1. Redis 使用内存而非磁盘 Redis 的数据主要存储在 RAM(内存) 中 避免了磁盘 IO 带来的巨大延迟 2. 不同存储介质的延迟对比(近似值) 存储层级 延迟 CPU Register ~0.3 ns L1 Cache ~0.9 ns L2 Cache ~2.8 ns L3 Cache ~12.9 ns RAM ~120 ns SSD 50–150 μs HDD 1–10 ms 内存访问速度比 SSD 快 数百倍,比 HDD 快 数万倍,这是 Redis 高性能的根本原因 二、IO 多路复用 + 单线程模型 1. IO 多路复用(IO Multiplexing) Redis 使用 IO 多路复用机制(如 epoll / kqueue / select) 一个线程即可同时监听 大量 Socket 连接 示意: ...

July 18, 2024 · 1 min · 213 words · Guangyang Zhong

Redis 应用场景

图片来源: https://bytebytego.com 1. 会话管理(Session) 用途:在分布式系统中共享用户会话数据 实现方式:Redis STRING 或 HASH 存储 session 信息 2. 缓存(Cache) 用途:缓存对象、页面或热点数据,减少数据库压力 实现方式:Redis STRING / HASH / ZSET 3. 分布式锁(Distributed Lock) 用途:保证多个分布式服务间的资源互斥访问 实现方式:Redis STRING + 设置过期时间 + 原子操作(SETNX / Lua 脚本) 4. 计数器(Counter) 用途:统计文章点赞数、阅读量等 实现方式:Redis INCR / INCRBY 5. 限流器(Rate Limiter) 用途:限制特定用户或 IP 的请求频率 实现方式:Redis STRING / HASH + TTL 或令牌桶算法 6. 全局 ID 生成器(Global ID Generator) 用途:生成分布式系统全局唯一 ID 实现方式:Redis INCR / INCRBY 7. 购物车(Shopping Cart) 用途:存储用户购物车中的商品及数量 实现方式:Redis HASH(key=用户ID,field=商品ID,value=数量) 8. 用户留存计算(User Retention) 用途:统计用户每日登录情况,计算留存率 实现方式:Redis BITMAP 或 HyperLogLog 9. 消息队列(Message Queue) 用途:实现简单的队列消息传递机制 实现方式:Redis LIST(LPUSH / RPOP) 10. 排行榜(Ranking) 用途:对文章、用户或商品进行排名展示 实现方式:Redis ZSET(有序集合,按分数排序)

July 18, 2024 · 1 min · 93 words · Guangyang Zhong

全方位理解 Cache

图片来源: https://bytebytego.com 1. 什么是缓存(What is a Cache) 内存存储(In-Memory Storage) 缓存是一种将数据存储在 更快的介质(通常是内存) 中的技术 本质是 用空间换时间 缓存中的数据通常不是权威数据源,权威数据仍在数据库或磁盘中 缓存命中 / 未命中(Cache Hit & Miss) 缓存命中(Hit):请求的数据存在于缓存中 缓存未命中(Miss):缓存中没有数据,需要访问下层存储 命中率(Hit Ratio)是衡量缓存效果的核心指标 2. 缓存的应用场景(Where Is Caching Used) CPU 缓存(L1 / L2 / L3) 位于 CPU 内部或附近的硬件缓存 利用: 时间局部性 空间局部性 页面缓存(Page Cache) 操作系统级缓存 文件读写会优先命中内存中的 Page Cache CDN 缓存静态或半静态资源(HTML / CSS / JS / 图片) 减少源站压力,降低网络延迟 缓冲区缓存(Buffer Cache) 对磁盘 IO 进行缓冲 减少频繁的小 IO 操作 Memcached 轻量级内存 KV 缓存 不支持复杂数据结构和持久化 Redis 功能丰富的内存数据存储系统 支持多种数据结构、持久化、复制和集群 3. 缓存部署方式(Cache Deployment) 进程内缓存(In-Process Cache) 缓存存在于应用进程内部 优点:访问速度最快 缺点:无法共享、数据不一致 进程间缓存(Inter-Process Cache) 多进程共享同一缓存实例(同一台机器) 需要 IPC 或共享内存机制 远程缓存(Remote Cache) 通过网络访问缓存(如 Redis) 支持多服务共享和水平扩展 4. 为什么需要缓存(Why Do We Need to Cache) 提升性能(Improve Performance) 减少数据库和后端服务压力 避免重复计算 降低延迟(Reduce Latency) 内存访问速度远快于磁盘和网络 IO 阿姆达尔定律(Amdahl’s Law) 系统整体性能提升受限于不可优化部分 缓存应优先优化系统中的关键耗时路径 帕累托分布(Pareto Distribution) 20% 的数据产生 80% 的访问量 缓存非常适合热点数据场景 5. 分布式缓存(Distributed Cache) 取模分片(Modulus Sharding) 根据 hash(key) % N 分片 节点变化会导致大量缓存失效 范围分片(Range-Based Sharding) 按 Key 范围进行分片 容易产生数据倾斜和热点 一致性哈希(Consistent Hashing) 节点变化只影响少量 Key 常用于 Redis Cluster 6. 缓存替换与失效(Cache Replacement & Invalidation) 缓存替换策略 LRU(最近最少使用):淘汰最近最少被访问的数据 LFU(最不经常使用):淘汰访问频率最低的数据 缓存失效策略 白名单策略(Allowlist Policy) 仅允许指定 Key 进入缓存 写时主动失效 数据更新时先写数据库,再删除或更新缓存 读时主动失效 读数据时发现不一致,主动使缓存失效 TTL(过期时间) 为缓存设置存活时间,自动过期 7. 缓存策略(Cache Strategies) Cache-Aside(旁路缓存) 应用程序显式控制缓存 读:缓存 → 数据库 → 写缓存 写:写数据库 → 删除缓存 Read-Through 缓存层负责从数据库加载数据 Write-Around 写操作绕过缓存,直接写数据库 Write-Through 同时写缓存和数据库,保证一致性 Write-Back 先写缓存,异步写数据库 性能高,但有数据丢失风险 8. 缓存面临的挑战(Caching Challenges) 惊群效应(Thundering Herd) 大量请求同时发生缓存未命中 解决方式:加锁、请求合并 缓存穿透(Cache Penetration) 请求不存在的数据,绕过缓存直达数据库 解决方式:布隆过滤器、缓存空值 大 Key(Big Key) 单个 Key 占用大量内存 可能导致阻塞和延迟抖动 热 Key(Hot Key) 某些 Key 被高频访问 解决方式:本地缓存、Key 拆分、多副本 数据一致性(Data Consistency) 缓存通常只能保证最终一致性 需要合理的失效和过期策略 9. 其他(Others) 监控与告警(Monitoring & Alerts) 缓存命中率 QPS 与延迟 内存使用率 热 Key 监控 异常告警机制

July 18, 2024 · 2 min · 227 words · Guangyang Zhong

全方位理解 Redis

图片来源: https://bytebytego.com 一、什么是 Redis Redis = Remote Dictionary Server(远程字典服务) 特点:多模型数据库,延迟低至毫秒以下 角色: 二、Redis 的应用 被众多知名公司采用:X, Pinterest, Airbnb, Uber, Slack, Instagram 等 三、Redis 如何改变数据库格局 支持 内存读写 + 全量持久化(AOF / Snapshot) 高可用性:当实例失败时,可以通过 AOF 或 Snapshot 恢复数据 → 无数据丢失 四、Redis 数据结构 Redis 是 KV 数据模型,但支持多种数据类型: STRING:“Bytebytego” BITMAP:0100001 01101101 0110100 LIST:A → B → C → E SET:{A, B, C} HASH:{ “e”: “bytebyte”, “b”: “go” } 五、基本命令 类型 命令 示例 设置 SET SET username “adam smith” 获取 GET GET username 删除 DEL DEL username 自增 INCR INCR visitor_count Hash 设置 HSET HSET user:1000 name “Alice” age 30 六、Redis 模块 Redis 扩展模块: ...

July 18, 2024 · 1 min · 125 words · Guangyang Zhong