<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[wwb44444的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/wwb44444</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; wwb44444]]></copyright><item><title><![CDATA[Go本地缓存设计与实现]]></title><link>https://blog.youkuaiyun.com/wwb44444/article/details/146148905</link><guid>https://blog.youkuaiyun.com/wwb44444/article/details/146148905</guid><author>wwb44444</author><pubDate>Mon, 10 Mar 2025 11:31:45 +0800</pubDate><description><![CDATA[本地缓存是一个项目中很常见的组件。在很多人的眼中就是一个简单的key-value的map存储即可实现，但实际上，，比如说，本地缓存是将数据存储在内存，若数据量激增突破了内存限制怎么办？如何高效地管理本地缓存，以最低的时间复杂度添加和删除缓存都是值得思考的问题本文以第一视角带你走进go-zero框架，从源码的角度解析本地缓存的设计与实现。]]></description><category></category></item><item><title><![CDATA[重构技战术（一）——通用型重构技巧]]></title><link>https://blog.youkuaiyun.com/wwb44444/article/details/132919946</link><guid>https://blog.youkuaiyun.com/wwb44444/article/details/132919946</guid><author>wwb44444</author><pubDate>Sun, 17 Sep 2023 15:21:27 +0800</pubDate><description><![CDATA[书接上回，一文中我们讨论了重构的含义、意义以及时机，并说明了测试的重要性。从本文开始将介绍重构具体的技巧，首先登场的是一些通用型技巧。]]></description><category></category></item><item><title><![CDATA[重构从现在开始]]></title><link>https://blog.youkuaiyun.com/wwb44444/article/details/132918709</link><guid>https://blog.youkuaiyun.com/wwb44444/article/details/132918709</guid><author>wwb44444</author><pubDate>Sat, 16 Sep 2023 15:20:46 +0800</pubDate><description><![CDATA[重构，是一名程序员必备的职业技能。然而，大多数人对于重构的认知仍然停留在项目中期为了提升代码质量而做的并非不可不做的操作。对于重构的重要性和含义并没有充分的认知。本文，笔者将结合自身经验和阅读《重构，改善既有代码的设计》一书（下面简称《重构》）的心得，以系列文章的方式讲述重构的内功心法以及武功招式。]]></description><category></category></item><item><title><![CDATA[Redis之大key问题]]></title><link>https://blog.youkuaiyun.com/wwb44444/article/details/128307964</link><guid>https://blog.youkuaiyun.com/wwb44444/article/details/128307964</guid><author>wwb44444</author><pubDate>Tue, 13 Dec 2022 21:07:54 +0800</pubDate><description><![CDATA[Redis 中的大 key 是一种常见的问题，本文将就这一问题进行系统的分析及解决方案。]]></description><category></category></item><item><title><![CDATA[Vue+SpringBoot实现评论功能]]></title><link>https://blog.youkuaiyun.com/wwb44444/article/details/127728314</link><guid>https://blog.youkuaiyun.com/wwb44444/article/details/127728314</guid><author>wwb44444</author><pubDate>Mon, 07 Nov 2022 14:53:30 +0800</pubDate><description><![CDATA[评论系统相信大家并不陌生，在社交网络相关的软件中是一种常见的功能。然而对于初学者来说，实现一个完整的评论系统并不容易。本文笔者以 Vue+SpringBoot 前后端分离的架构细说博客评论功能的实现思路。]]></description><category></category></item><item><title><![CDATA[【Flink源码】JobGraph构建过程]]></title><link>https://blog.youkuaiyun.com/wwb44444/article/details/127722876</link><guid>https://blog.youkuaiyun.com/wwb44444/article/details/127722876</guid><author>wwb44444</author><pubDate>Mon, 07 Nov 2022 11:24:32 +0800</pubDate><description><![CDATA[这里不能用 StreamNode.id 来代替，因为这是一个从 1 开始的静态计数变量，同样的 Job 可能会得到不一样的 id，如下示例的两个 job 是完全一样的，但是 source 的 id 却不一样了。书接上回，execute 方法中通过 getJobGraph 将 Pipeline 转换为 JobGraph，下面来看一下 getJobGraph 源码。为所有节点生成一个唯一的 hash id，如果节点在多次提交中没有改变（包括并发度、上下游等），那么这个 id 就不会改变，这主要用于故障恢复。]]></description><category></category></item><item><title><![CDATA[【Flink源码】JobManager源码之启动WebMonitorEndpoint]]></title><link>https://blog.youkuaiyun.com/wwb44444/article/details/127722827</link><guid>https://blog.youkuaiyun.com/wwb44444/article/details/127722827</guid><author>wwb44444</author><pubDate>Sun, 06 Nov 2022 22:44:40 +0800</pubDate><description><![CDATA[在【Flink源码】JobManager 启动流程 一文中，笔者分析了 JobManager 的启动流程，并讲到 JobManager 启动了 ResourceManager、Dispatcher 和 WebMonitorEndpoint 三大核心组件。
本文将就其中 WebMonitorEndpoint 启动过程的源码进行探究首先，我们先要讲述一下 WebMonitorEndpoint 的主要功能：
WebMonitorEndpoint 里面维护了很多 Handler，如果客户端通过 flink run ]]></description><category></category></item><item><title><![CDATA[【Flink源码】JobManager启动流程]]></title><link>https://blog.youkuaiyun.com/wwb44444/article/details/127722819</link><guid>https://blog.youkuaiyun.com/wwb44444/article/details/127722819</guid><author>wwb44444</author><pubDate>Sun, 06 Nov 2022 22:43:54 +0800</pubDate><description><![CDATA[在一文中，笔者后来发现谬误颇多，且随着 Flink 版本的更迭，部分方法实现方式已发生较大改变。因此，思虑再三决定针对 JobManager 相关源码根据最新的 Flink 版本（1.17）单独成文。]]></description><category></category></item><item><title><![CDATA[【Flink源码】Flink心跳机制]]></title><link>https://blog.youkuaiyun.com/wwb44444/article/details/127722803</link><guid>https://blog.youkuaiyun.com/wwb44444/article/details/127722803</guid><author>wwb44444</author><pubDate>Sun, 06 Nov 2022 22:43:08 +0800</pubDate><description><![CDATA[在一文中，我们在讲述 TaskExecutor 启动流程时，在 TaskExecutor 构造方法中讲到 TaskExecutor 维护了与 ResourceManager 和 JobMaster 的心跳服务同样在 ResourceManager 启动时也维护了与 JobMaster 和 TaskManager 的心跳接下来我们针对 ResourceManager 与 TaskManager 的心跳交互流程来深入探究 flink 的心跳机制。]]></description><category></category></item><item><title><![CDATA[【Flink源码】StreamGraph构建过程]]></title><link>https://blog.youkuaiyun.com/wwb44444/article/details/127722795</link><guid>https://blog.youkuaiyun.com/wwb44444/article/details/127722795</guid><author>wwb44444</author><pubDate>Sun, 06 Nov 2022 22:42:17 +0800</pubDate><description><![CDATA[前面我们说到 StreamGraph 最终由 StreamGraphGenerator 类生成其构造函数只是实例化了一些属性，之后调用了一些 setter 方法，设置了如状态后端、保存点路径等的配置，真正生成 StreamGraph 的是之后的 generate 方法（getStreamGraphGenerator(transformations).generate()）]]></description><category></category></item><item><title><![CDATA[【Flink源码】再谈Flink程序提交流程（下）]]></title><link>https://blog.youkuaiyun.com/wwb44444/article/details/127722781</link><guid>https://blog.youkuaiyun.com/wwb44444/article/details/127722781</guid><author>wwb44444</author><pubDate>Sun, 06 Nov 2022 22:41:30 +0800</pubDate><description><![CDATA[书接上回，在一文的结尾我们完成了 JobManager 申请 slot 的探究按照 Flink 程序提交流程，接下来 TaskManager 即将启动我们来继续往下看。]]></description><category></category></item><item><title><![CDATA[【Flink源码】再谈Flink程序提交流程（中）]]></title><link>https://blog.youkuaiyun.com/wwb44444/article/details/127722769</link><guid>https://blog.youkuaiyun.com/wwb44444/article/details/127722769</guid><author>wwb44444</author><pubDate>Sun, 06 Nov 2022 22:40:39 +0800</pubDate><description><![CDATA[书接上回，一文中我们已经将程序从客户端提交给了 ResourceManager接下来我们就去 ResourceManager 中一探究竟。]]></description><category></category></item><item><title><![CDATA[【Flink源码】再谈Flink程序提交流程（上）]]></title><link>https://blog.youkuaiyun.com/wwb44444/article/details/127722741</link><guid>https://blog.youkuaiyun.com/wwb44444/article/details/127722741</guid><author>wwb44444</author><pubDate>Sun, 06 Nov 2022 22:38:33 +0800</pubDate><description><![CDATA[前面在一文中，我们着重探讨了 StreamExecutionEnvironment 的 execute 方法是如何提交一个任务的，当时为了省事，我们是以本地运行环境为例但是在实际的运行环境中，Flink 往往是架设在 Yarn 架构下以 per-job 模式运行的因此，为了还原真实场景下 Flink 程序的提交流程，我们有必要探讨 yarn-per-job 提交流程首先，让我们回顾一下 Flink 任务提交流程。]]></description><category></category></item><item><title><![CDATA[【Flink源码】Flink程序启动的那些事儿]]></title><link>https://blog.youkuaiyun.com/wwb44444/article/details/127722725</link><guid>https://blog.youkuaiyun.com/wwb44444/article/details/127722725</guid><author>wwb44444</author><pubDate>Sun, 06 Nov 2022 22:37:20 +0800</pubDate><description><![CDATA[我想您一定曾经很好奇几个问题那就是 Flink 程序启动的时候究竟发生了什么？我们将用户程序提交上去之后它又是如何调用它的？本文就是为了解决您的这些疑惑在 Yarn 下 per-job 模式提交流程如下图。]]></description><category></category></item><item><title><![CDATA[【Flink源码】从StreamExecutionEnvironment.execute看Flink提交过程]]></title><link>https://blog.youkuaiyun.com/wwb44444/article/details/127722714</link><guid>https://blog.youkuaiyun.com/wwb44444/article/details/127722714</guid><author>wwb44444</author><pubDate>Sun, 06 Nov 2022 22:36:35 +0800</pubDate><description><![CDATA[相信大家对这一行代码都不陌生，其作用是执行 Flink 程序，相当于是一个总开关。很难想象，那么复杂的 Flink 架构，那么复杂的 Flink 程序仅仅需要这简单的一个函数就能启动，其背后究竟是怎样的过程？]]></description><category></category></item><item><title><![CDATA[【Flink源码】从StreamExecutionEnvironment说起]]></title><link>https://blog.youkuaiyun.com/wwb44444/article/details/127722659</link><guid>https://blog.youkuaiyun.com/wwb44444/article/details/127722659</guid><author>wwb44444</author><pubDate>Sun, 06 Nov 2022 22:35:27 +0800</pubDate><description><![CDATA[本系列是针对 Flink 源码进行的一系列探究过程，旨在通过 Flink 源码全面地、详细地了解 Flink 原理根据 getExecutionEnvironment 可以自动获取可执行环境，那么具体过程究竟是怎样的呢？接下来我们从 StreamExecutionEnvironment 说起。]]></description><category></category></item><item><title><![CDATA[Java实现图的遍历]]></title><link>https://blog.youkuaiyun.com/wwb44444/article/details/112986138</link><guid>https://blog.youkuaiyun.com/wwb44444/article/details/112986138</guid><author>wwb44444</author><pubDate>Fri, 22 Jan 2021 19:20:42 +0800</pubDate><description><![CDATA[最近又在手撕数据结构的代码，温习一遍得到了一些新的感悟。在这里全面地总结一下关于图的遍历算法逻辑，并手写Java代码实现，力图将全部实现逻辑呈现在读者面前。本文主要讲解的图的遍历算法为深度优先遍历与广度优先遍历。

一、图的实现

图的实现主要有两种方式，一种是邻接矩阵，一种是邻接表。

所谓邻接矩阵就是构建一个节点到节点的矩阵，每一行每一列都代表一个节点，矩阵的输入数据即为该位置所在的行和列对应的节点之间是否可达。一般而言，若该数值为表示不可达，为一个正数表示该条边的权值。矩阵对角线上的数值一般为0，表示]]></description><category></category></item><item><title><![CDATA[张量（五）：张量学习——BGCP]]></title><link>https://blog.youkuaiyun.com/wwb44444/article/details/108966577</link><guid>https://blog.youkuaiyun.com/wwb44444/article/details/108966577</guid><author>wwb44444</author><pubDate>Mon, 02 Nov 2020 15:38:05 +0800</pubDate><description><![CDATA[接下来的文章将主要介绍张量在交通领域的实际应用，包括预测、补全等问题。与其他模型相结合，针对具体问题，构建的一系列模型，我这里统称为“张量学习模型”。本文主要介绍Bayesian Gaussian CANDECOMP/PARAFAC tensor decomposition model（BGCP）。

1 背景

随着智能交通系统的发展和应用，大量城市交通数据通过各种来源如环路检测器、摄像机等被捕获，这些数据可用于交通运营和管理应用，包括路由、信号控制、出行时间预测等。通常，我们可以将时空交通数据组织成一个]]></description><category></category></item><item><title><![CDATA[张量（四）：张量补全（tensor completion）]]></title><link>https://blog.youkuaiyun.com/wwb44444/article/details/108956789</link><guid>https://blog.youkuaiyun.com/wwb44444/article/details/108956789</guid><author>wwb44444</author><pubDate>Thu, 08 Oct 2020 16:29:49 +0800</pubDate><description><![CDATA[现实情况下，往往由于采集数据工具（如采集交通数据的传感器）的故障以及其他异常情况导致数据中往往存在部分缺失值，对这些缺失值的修补称之为“补全”，张量领域的缺失值修复即张量补全。张量补全是根据已有数据对缺失值的影响和低秩假设实现缺失值补全，主要分为两类方法：

一种是基于张量补全中给定的秩和更新因子
	一种是直接最小化张量秩并更新低秩张量

...]]></description><category></category></item><item><title><![CDATA[张量（三）：张量鲁棒主成分分析（TRPCA）]]></title><link>https://blog.youkuaiyun.com/wwb44444/article/details/108949143</link><guid>https://blog.youkuaiyun.com/wwb44444/article/details/108949143</guid><author>wwb44444</author><pubDate>Wed, 07 Oct 2020 22:12:20 +0800</pubDate><description><![CDATA[基于张量分解，张量鲁棒主成分分析法（TRPCA）是对鲁棒主成分分析（RPCA）的高阶扩展，在数据去噪等领域拥有广泛应用。本篇将对TRPCA以及其最新的改进模型做出介绍。

一、RPCA

在实际应用中，很多数据矩阵往往是低秩或近似低秩的。理想状态下，数据矩阵的行与行之间应当具有极强的相似性，整个矩阵应当是低秩的。但由于数据噪声的存在，破坏了这种低秩性。因此，为了恢复矩阵的低秩结构，可将矩阵D分解为两个矩阵之和，即低秩矩阵A和稀疏矩阵E，D=A+E。低秩矩阵为分离了噪声的真实矩阵，稀疏矩阵为分离出的噪声矩阵。]]></description><category></category></item></channel></rss>