<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[vectorX的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/vectorX</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; vectorX]]></copyright><item><title><![CDATA[实践篇 11 | 万金油的string，为什么不好用了]]></title><link>https://blog.csdn.net/vectorX/article/details/119841776</link><guid>https://blog.csdn.net/vectorX/article/details/119841776</guid><author>vectorX</author><pubDate>Sat, 21 Aug 2021 19:06:14 +0800</pubDate><description><![CDATA[string类型的内存空间消耗问题。



一个图片存储系统，需要

快速记录图片ID和图片在存储系统中保存的ID（存储对象id）
	根据图片ID查找图片存储id
图片数量巨大，用10位数表示图片ID和存储对象ID，如图片ID：1101000051，存储系统中对象ID：3301000051


photo_id: 1101000051
photo_obj_id: 3301000051



键-单值模式，单值指的是键值对的值不是集合。和string类型提供的“一键一值”的保存形式刚好。

且String..]]></description><category></category></item><item><title><![CDATA[实践篇 12 | 有一亿个 keys 要统计，应该用哪种集合]]></title><link>https://blog.csdn.net/vectorX/article/details/119834454</link><guid>https://blog.csdn.net/vectorX/article/details/119834454</guid><author>vectorX</author><pubDate>Sat, 21 Aug 2021 04:29:12 +0800</pubDate><description><![CDATA[在 web 和 移动应用的业务场景中，我们经常要保存这样的信息：单key对应的数据集合。

手机APP的用户日登录信息：一天对应一系列的用户ID或移动设备ID
	电商网站上商品用户评论列表：一个商品对应一系列的评论
	用户在手机APP上的签到打卡信息：一天对应一系列的用户签到记录
	应用网站上的网页访问信息：一个网页对应一系列用户的访问点击。


我们知道，redis集合类型的特点是一个键对应一系列的数据，所以非常适合用来存取这些数据。



但是在这些场景中，除了记录信息，我们往往还需要对集合中数据进..]]></description><category></category></item><item><title><![CDATA[10 | 如何实现高性能的异步网络传输]]></title><link>https://blog.csdn.net/vectorX/article/details/119814216</link><guid>https://blog.csdn.net/vectorX/article/details/119814216</guid><author>vectorX</author><pubDate>Fri, 20 Aug 2021 02:06:34 +0800</pubDate><description><![CDATA[异步的线程模型，与同步模型的最大区别是，同步模型会阻塞线程等待资源，而异步模型不会阻塞线程，它是等资源准备好后，再通知业务代码来完成后续的资源处理逻辑。这种异步设计的方法，可以很好解决IO等待问题。



我们开发的绝大多数业务系统都是IO密集型系统。跟IO密集型系统相对的另一种系统是计算密集型系统。



IO密集型系统大部分时间都在执行IO操作，这个IO操作主要包括网络IO和磁盘IO，以及与计算机连接的一些外围设备的访问。与之相对的计算密集型系统，大部分时间都是在使用CPU执行计算操作。我们开发的业..]]></description><category></category></item><item><title><![CDATA[10 | 如何使用异步设计提升系统性能]]></title><link>https://blog.csdn.net/vectorX/article/details/119582532</link><guid>https://blog.csdn.net/vectorX/article/details/119582532</guid><author>vectorX</author><pubDate>Wed, 11 Aug 2021 00:58:47 +0800</pubDate><description><![CDATA[对开发者来说，异步是一种程序设计的思想，使用异步模式设计的程序可显著减少线程等待，从而在高吞吐的场景中，极大提升系统的整体性能，显著降低延时。



因此，像消息队列这种需要超高吞吐量和超低时延的中间件系统，在其核心流程中，一定会大量采用异步的设计思想。



接下来，我们一起来通过一个非常简单的例子学习，如何使用异步设计，提升系统性能。



异步设计如何提升系统性能？



假设我们要实现一个转账的微服务，Transfer(accountFrom, accountTo, amount)，这个服务有三..]]></description><category></category></item><item><title><![CDATA[09 | 学习开源代码该如何入手？]]></title><link>https://blog.csdn.net/vectorX/article/details/119549482</link><guid>https://blog.csdn.net/vectorX/article/details/119549482</guid><author>vectorX</author><pubDate>Tue, 10 Aug 2021 00:24:44 +0800</pubDate><description><![CDATA[对于开源软件，在使用其作为系统重要组成部分，真正用于生产时，仅知道如何使用不行

必须掌握原理和细节，以找到最佳使用姿势；在出问题时，基于其原理和一些现象去排查问题原因。



掌握开源软件最佳方式是学习源码，但面对上千个源码文件，几十万行代码，无从下手。



因此这里来聊一聊，如何下手学习开源软件代码。



通过文档来了解开源项目



学习源码最佳的方式是先看它的文档。



通过文档可以迅速了解整体结构，功能特性，关键技术，实现原理，生态系统等。

掌握这些整体的只是，再看源码，可以避免盲人摸..]]></description><category></category></item><item><title><![CDATA[07 | 消息积压了该如何处理？]]></title><link>https://blog.csdn.net/vectorX/article/details/119495645</link><guid>https://blog.csdn.net/vectorX/article/details/119495645</guid><author>vectorX</author><pubDate>Sun, 08 Aug 2021 20:50:15 +0800</pubDate><description><![CDATA[消息积压的直接原因是系统中，某个部分存在性能问题，来不及处理上游消息。



优化性能来避免消息积压



消息队列本身的处理能力要远大于业务系统的处理能力。主流产品的单节点，消息收发性能在每秒几万到几十万条，还可以通过水平拓展broker实例数量成倍提升。



由于业务代码逻辑远比消息队列复杂，单节点可以达到 百/千 QPS 已经算性能很好了。



因此对于优化性能，关注点在消息收发两端，业务代码如何与消息队列配合去达到最优性能。



1. 发送端性能优化



优先检查发送消息前，业务...]]></description><category></category></item><item><title><![CDATA[06 | 如何处理消费过程中的重复消息]]></title><link>https://blog.csdn.net/vectorX/article/details/119465489</link><guid>https://blog.csdn.net/vectorX/article/details/119465489</guid><author>vectorX</author><pubDate>Sat, 07 Aug 2021 02:11:46 +0800</pubDate><description><![CDATA[在消息传递过程中，出现传递失败情况，发送方会重试，重试会导致产生重复消息。

因此使用消息队列的业务系统若没对重复消息处理，就可能会导致系统数据出错。



比如消费订单消息，统计下单金额的服务，就会出现重复统计，导致统计结果出错。



可能有人会问，如果消息队列本身能保证消息不重复，应用程序实现不就简单了。那有消息队列能保证这点么？



消息重复的情况必然存在

在MQTT协议中，给出了三种传递消息时能够提供的服务质量标准。质量从低到高，

At most once：最多一次，无消息可靠性，允许丢..]]></description><category></category></item><item><title><![CDATA[05 | 如何保证消息不丢失]]></title><link>https://blog.csdn.net/vectorX/article/details/119432073</link><guid>https://blog.csdn.net/vectorX/article/details/119432073</guid><author>vectorX</author><pubDate>Fri, 06 Aug 2021 03:06:25 +0800</pubDate><description><![CDATA[对大部分业务系统来说，丢消息意味着数据丢失，是不可接受的。丢消息也成为大部分用消息队列的同学最头痛的问题。



目前主流消息队列产品都提供了完善的消息可靠性机制，保证消息的不丢。



检测消息丢失的方法



丢消息还不知道，是用消息队列的最尴尬情况。一般而言，新系统刚上线，各方面不稳定，需要磨合期，这个时候特别要监控系统中是否有消息丢失的情况。



IT基础设施较完善的公司，都有分布式的链路追踪系统，使用类似追踪系统可以很方便地追踪每条消息。而没有，则可以利用消息的有序性进行验证。



在Pr..]]></description><category></category></item><item><title><![CDATA[04 | 利用事务消息实现分布式事务]]></title><link>https://blog.csdn.net/vectorX/article/details/119394525</link><guid>https://blog.csdn.net/vectorX/article/details/119394525</guid><author>vectorX</author><pubDate>Wed, 04 Aug 2021 23:38:25 +0800</pubDate><description><![CDATA[消息队列中的事务，主要解决生产者和消费者的数据一致性问题。



以电商为例，用户在电商APP上购物，加商品到购物车，再几件商品一起下单，支付。



这个过程中，订单系统会通过消息队列发订单消息给购物车模块，其消费订单消息从购物车中移除下单商品。



因为购物车删商品不是下单必须流程的缘故，因此会有上述的异步删购物车数据的操作。



订单系统 ===== 创建 ====&gt; 订单库

        ====发送订单创建消息 ==&gt; 消息队列 ====&gt; 购物车系统...]]></description><category></category></item><item><title><![CDATA[消息模型: 主题和队列有什么区别]]></title><link>https://blog.csdn.net/vectorX/article/details/119362462</link><guid>https://blog.csdn.net/vectorX/article/details/119362462</guid><author>vectorX</author><pubDate>Wed, 04 Aug 2021 02:01:50 +0800</pubDate><description><![CDATA[消息模型的演进



1. 消息队列，最初架构上，就是一个严格FIFO的结构。

消费者 &lt;——接收—— 队列 &lt;——发送—— 生产者

消费者出队操作，删除数据，生产者入队操作。服务端存储消息的地方叫队列。



若有多个生产者，则多生产者自然顺序投递消息到队列。若有多消费者，他们之间则是竞争关系。



若希望消息给每个消费者，即每个消费者都要获取全量消息，比如订单给风控，客服等。

不能采用生产者根据消费者数量复制消息到多队列的做法，浪费存储资源且生产和消费就耦合了。





2...]]></description><category></category></item><item><title><![CDATA[01 | 为什么要消息队列]]></title><link>https://blog.csdn.net/vectorX/article/details/119337448</link><guid>https://blog.csdn.net/vectorX/article/details/119337448</guid><author>vectorX</author><pubDate>Tue, 03 Aug 2021 01:56:36 +0800</pubDate><description><![CDATA[以巧克力工厂类比，工厂三个操作环节磨粉，做酱，凝固；

使用传送带可提高(通信)效率；

使用仓储存储半成品可解决(通信缓存)传送带物品无人接收；



一、异步处理



&gt; 对于一个电商秒杀请求，如下5步操作

1. 风险控制

2. 锁库存

3. 出订单

4. 短信通知

5. 更新统计数据



APP =&gt; 网关 =&gt; 后端服务（5步[风控 =&gt; 库存 =&gt; 订单 =&gt; 短信 =&gt; 统计]）

APP =&gt; 网关 =&gt; 后端服务（2步[风控]]></description><category></category></item><item><title><![CDATA[Leetcode-650 只有两个键的键盘]]></title><link>https://blog.csdn.net/vectorX/article/details/108934616</link><guid>https://blog.csdn.net/vectorX/article/details/108934616</guid><author>vectorX</author><pubDate>Tue, 06 Oct 2020 00:12:58 +0800</pubDate><description><![CDATA[步骤性问题
分治类
大问题分类化为子问题
分类关键是特定状态下的下一步操作

可化为数学问题]]></description><category></category></item><item><title><![CDATA[Leetcode-1420 生成数组]]></title><link>https://blog.csdn.net/vectorX/article/details/108934488</link><guid>https://blog.csdn.net/vectorX/article/details/108934488</guid><author>vectorX</author><pubDate>Mon, 05 Oct 2020 23:54:18 +0800</pubDate><description><![CDATA[动态规划
分治类
大问题分类化为子问题
分类的关键是最大值所在位置]]></description><category></category></item><item><title><![CDATA[Leetcode-19 秋叶收藏集]]></title><link>https://blog.csdn.net/vectorX/article/details/108917391</link><guid>https://blog.csdn.net/vectorX/article/details/108917391</guid><author>vectorX</author><pubDate>Sun, 04 Oct 2020 11:24:24 +0800</pubDate><description><![CDATA[动态规划
位置状态（前缀）
当前位置前缀状态仅仅与前一位置的前缀状态相关
]]></description><category></category></item><item><title><![CDATA[【设计模式】访问者模式{更新中}]]></title><link>https://blog.csdn.net/vectorX/article/details/104303870</link><guid>https://blog.csdn.net/vectorX/article/details/104303870</guid><author>vectorX</author><pubDate>Thu, 13 Feb 2020 22:56:21 +0800</pubDate><description><![CDATA[访问者


访问者模式的产生：类结构相对稳定，但是基于类的行为变化较大。

访问者模式的例子：这一部分参考 简书作者：JamFF 的文章访问者模式一篇就够了。

这里员工是稳定的类结构，公司一年一度生成所有员工的报表。不同的高层会以变化的方式来访问员工，比如CEO看Engineer的代码行和Manager的产品数量，但是CTO只看两者的KPI。

高层的Visitor需要提供多个访问不同...]]></description><category></category></item><item><title><![CDATA[【模式】AOP{更新中}]]></title><link>https://blog.csdn.net/vectorX/article/details/104299205</link><guid>https://blog.csdn.net/vectorX/article/details/104299205</guid><author>vectorX</author><pubDate>Thu, 13 Feb 2020 19:40:04 +0800</pubDate><description><![CDATA[代理模式


代理模式的产生：明星A会唱歌，很多人都想找A商演，A自己不会。经纪人B，作为明星A的代理，负责接收邀请，筛选邀请，安排演唱前后接送，粉丝公关等事宜。明星A只负责唱歌就可以了。

代理模式：抽象一下，经纪人B 这群人就是ProxyClass-代理类，而明星A 这群人就是Class。ProxyClass类向外提供 Class 所有的方法（功能）。外部只需调用ProxyClass的...]]></description><category></category></item><item><title><![CDATA[【图】最小生成树{更新中}]]></title><link>https://blog.csdn.net/vectorX/article/details/104243015</link><guid>https://blog.csdn.net/vectorX/article/details/104243015</guid><author>vectorX</author><pubDate>Mon, 10 Feb 2020 02:42:41 +0800</pubDate><description><![CDATA[最小生成树


最小生成树的产生：希望在城市间建设基础设施，连通所有城市，不考虑容错性，如果花费最低成本实现？

最小生成子树：原图选出这样的边，让所有顶点连通，边权重和最低。（生成子图不需要后两个条件）




Kruskal算法


Kruskal算法的产生：从定义出发，选择边，让其涵盖所有顶点。边的选择使用贪心思想，限制是辐射生长的树。假设图包含个顶点。

第边，先选择最小权...]]></description><category></category></item><item><title><![CDATA[【数据结构】红黑树{更新中}]]></title><link>https://blog.csdn.net/vectorX/article/details/104135816</link><guid>https://blog.csdn.net/vectorX/article/details/104135816</guid><author>vectorX</author><pubDate>Sat, 08 Feb 2020 01:52:55 +0800</pubDate><description><![CDATA[二叉树


二叉树的产生：方便在一堆数中快速找到目标数。

二叉树的查找规律：以1号树为例，查100。从树根50起，比50大就到以75为根的右子树中找；比75大，同理；与右子树根100比对相等，结束。总计遍历3 个节点。注意观察1号树有3层节点，因此在1号树中查找任意数字最多只需遍历3个节点；同理 2号树 最多遍历4个节点。与1号树相比遍历数堆查找则最多 7 个，平均3.5 个节点。...]]></description><category></category></item><item><title><![CDATA[【数据结构】堆{更新中}]]></title><link>https://blog.csdn.net/vectorX/article/details/104218009</link><guid>https://blog.csdn.net/vectorX/article/details/104218009</guid><author>vectorX</author><pubDate>Sat, 08 Feb 2020 01:50:08 +0800</pubDate><description><![CDATA[堆的产生


堆的产生问题背景：如何在一堆动态变化的数中，以O(1)的复杂度获取最值。

堆的目标：一个数组，支持删除元素和添加元素，保证首元素永远是数堆中的最值。

数组树形化：比如给出数组， 一层一层依次从左到右加入节点，构造出如下图所示的一颗树，该种树形称为完全二叉树。


完全二叉树

对于数组，其所有元素的父子关系满足。

完全二叉树：每一层节点都是满的，最底下一层叶子节...]]></description><category></category></item><item><title><![CDATA[【算法】有意思的算法题(附pyhon3代码){更新中}]]></title><link>https://blog.csdn.net/vectorX/article/details/104214092</link><guid>https://blog.csdn.net/vectorX/article/details/104214092</guid><author>vectorX</author><pubDate>Fri, 07 Feb 2020 19:36:18 +0800</pubDate><description><![CDATA[有趣的算法题合集




子序列最大和


描述：给出一个数字序列 [1，-2，3，5，-1，4，-7]，找出其中的子序列，使得其和最大，返回该最大值。

解决方案：从左到右遍历数列，求和sum，当和sum为负的时候；重新开始新的序列计算；使用一个max变量记录当前求得的最大值。

遍历到 1：sum = 1，max=1
	遍历到 -2：sum = -1，max=1 =&gt; sum = 0，...]]></description><category></category></item></channel></rss>