<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[昆仑山上一棵草]]></title><description><![CDATA[软件系统设计]]></description><link>https://blog.youkuaiyun.com/DQWKLC</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; DQWKLC]]></copyright><item><title><![CDATA[【数据库设计】向量搜索HNSW算法优化]]></title><link>https://blog.youkuaiyun.com/DQWKLC/article/details/132777498</link><guid>https://blog.youkuaiyun.com/DQWKLC/article/details/132777498</guid><author>DQWKLC</author><pubDate>Sat, 09 Sep 2023 14:58:11 +0800</pubDate><description><![CDATA[数据库向量存储，向量搜索HNSW算法优化]]></description><category></category></item><item><title><![CDATA[开源的正反面]]></title><link>https://blog.youkuaiyun.com/DQWKLC/article/details/126085055</link><guid>https://blog.youkuaiyun.com/DQWKLC/article/details/126085055</guid><author>DQWKLC</author><pubDate>Sun, 31 Jul 2022 14:05:22 +0800</pubDate><description><![CDATA[一些商业公司或组织被迫做开源，一开始可以白嫖，谁不心动，又可以满足业务，有可以少花钱，多美的事情，只是其也知道自己也要开源，你不开源别人会告你，大公司树大招风，不开源不行；一类是官媒，开源是为国家建立基础，防止被掐脖子，提高技术能力，政治正确是唯一的支持，有什么实际的经济支持，对软件开发人员的好处，对企业使用开源提供产品倒是有政策倾斜，如政府采购有优先权等等。从开源的时间上看，特别是软件，大量的是已经在实践中获得验证后，提高了效率后，推广到整个业务领域的方式比较常见，这个是主流的开源实施的方式。...]]></description><category></category></item><item><title><![CDATA[EPOLL 非阻塞SOCKET READ 函数写法总结]]></title><link>https://blog.youkuaiyun.com/DQWKLC/article/details/124925130</link><guid>https://blog.youkuaiyun.com/DQWKLC/article/details/124925130</guid><author>DQWKLC</author><pubDate>Mon, 23 May 2022 13:02:19 +0800</pubDate><description><![CDATA[【EPOLL 非阻塞SOCKET READ 函数写法】

使用EPOLL进行SOCKET通讯的代码，网上资料写的不明确，专门写了测试代码进行测试，对READ中注意事项进行了总结。

一、LT模式下的READ

READ()返回值：

大于0，正常接收的数据

等于0， SOCKET关闭

等于-1 ，ERRNO == EINTR 重新调用READ( 可以立即调用，也可以退出等下一个LT的触发)；ERRNO == EAGAIN 稍后调用（退出等下一个LT的触发，立即调用有可能空转）；ERRNO == EWO.]]></description><category></category></item><item><title><![CDATA[RAFT系统设计（LOG传递）]]></title><link>https://blog.youkuaiyun.com/DQWKLC/article/details/124431336</link><guid>https://blog.youkuaiyun.com/DQWKLC/article/details/124431336</guid><author>DQWKLC</author><pubDate>Tue, 26 Apr 2022 16:37:39 +0800</pubDate><description><![CDATA[在进行发送到其他节点的过程中，RAFT协议中CURINDEX就转换为FILEID + PAGEID, 从一个变量变成两个变量；同理 LAST INDEX 也是一样的。比较关系要发生变化，从单值比较变化为多值比较，比较的规则也有变化。

其他NODE的进行同步的过程，需要特定的NODEID +FILEID+PAGEID, 也是通过 LOGSVR SERVICE 发消息给 KV TASK, 然后获得FIFO对应的BUFFER数据。此时RAFT TASK需要记录需要节点的路径信息，也是对应关系，有两种处理方式，一]]></description><category></category></item><item><title><![CDATA[RAFT系统设计（LOG传递）]]></title><link>https://blog.youkuaiyun.com/DQWKLC/article/details/124431229</link><guid>https://blog.youkuaiyun.com/DQWKLC/article/details/124431229</guid><author>DQWKLC</author><pubDate>Tue, 26 Apr 2022 16:34:20 +0800</pubDate><description><![CDATA[设计中存在两个PAGE空间，一个是RAFTID 本身对应的空间，一个是进程间通讯的共享空间，目前没有找到统一的办法来处理，感觉还是需要两个，在KV进程执行慢的情况下，有两级的缓存设计。对应关系是RAFTID – LOGID – FD + SHAREMEM,如果操作进程间的FIFO, 必须任何时刻都是同一任务，不能多个，目前的FIFO设计是一对一无锁设计模式。通过对应关系来保证是同一个任务。也就是说RAFTSVR任务可以操作FIFO， 设计中LOGSVR的任务主要是SOCKET通讯和消息转发（...]]></description><category></category></item><item><title><![CDATA[RAFT系统设计（发送数据）]]></title><link>https://blog.youkuaiyun.com/DQWKLC/article/details/124311284</link><guid>https://blog.youkuaiyun.com/DQWKLC/article/details/124311284</guid><author>DQWKLC</author><pubDate>Thu, 21 Apr 2022 00:48:30 +0800</pubDate><description><![CDATA[RAFT系统设计]]></description><category></category></item><item><title><![CDATA[RAFT 设计实现（日志文件同步）]]></title><link>https://blog.youkuaiyun.com/DQWKLC/article/details/123556692</link><guid>https://blog.youkuaiyun.com/DQWKLC/article/details/123556692</guid><author>DQWKLC</author><pubDate>Thu, 17 Mar 2022 17:58:01 +0800</pubDate><description><![CDATA[数据库LOG进程中设计RAFTSVR模块，专门进行LOG的复制。RAFTSVR中设置一个任务，用于进行与RAFT进程的通讯，包含连接，传递共享内存句柄，传递消息。同时提供进行共享内存写入接口，读取接口。

运行过程如下：LOG的RAFTSVR模块初始化后，通过SOCKET通讯连接 RAFT进程，成功连接后，传输共享内存句柄。传递当前FILEID + PAGEID给RAFT进程。如此时RAFT进程为LEADER的情况下，LOG进程就是主LOG，有LOGSVR模块输出PAGE内容到共享区，并记录最新发出的FI.]]></description><category></category></item><item><title><![CDATA[网络报文粘包处理实用方法]]></title><link>https://blog.youkuaiyun.com/DQWKLC/article/details/123439284</link><guid>https://blog.youkuaiyun.com/DQWKLC/article/details/123439284</guid><author>DQWKLC</author><pubDate>Sat, 12 Mar 2022 10:18:28 +0800</pubDate><description><![CDATA[对应网络数据报文粘包的处理，一个PACKET处理到后面，发现数据报文不完整，需要和后面的数据报文进行合并处理，如果没有数据报文的缓存的话，简单的做法就是将此PACKET的剩余数据拷贝到要接收新报文的缓存中，接收的指针向后调，相当于新接收的报文追加到新开始的完整报文中，此种办法处理比较简单。如果数据报文有多个缓存的情况下，更是简单，判断结尾是否需要跨数据包，直接进行跳到对应的下一个数据包操作。
...]]></description><category></category></item><item><title><![CDATA[大数据量传递PIPELINE设计]]></title><link>https://blog.youkuaiyun.com/DQWKLC/article/details/123163043</link><guid>https://blog.youkuaiyun.com/DQWKLC/article/details/123163043</guid><author>DQWKLC</author><pubDate>Sun, 27 Feb 2022 13:24:11 +0800</pubDate><description><![CDATA[多路处理程序中，数据处理需要分到不同的任务中进行，有四种模式，一对一的情况，一对多的情况，多对多的情况，多对一的情况。比如网络通讯模块设计有多个任务，业务模块也设计多个任务，从网络过来的数据从任何SOCKET都可以进入的不同的SOCKET TASK中，数据要发给不同的业务模块，一个SOCKET的数据要发给不同的业务模块，一个SOCKET TASK有多个SOCKET处理，这就是典型的多对多的情况。

大数据处理的过程中，这是常有的使用场景。通过设计PIPELINE，将数据的对应关系单独处理。可以进行分解和合并]]></description><category></category></item><item><title><![CDATA[大量数据流传递的流控方式]]></title><link>https://blog.youkuaiyun.com/DQWKLC/article/details/123151165</link><guid>https://blog.youkuaiyun.com/DQWKLC/article/details/123151165</guid><author>DQWKLC</author><pubDate>Sat, 26 Feb 2022 15:55:14 +0800</pubDate><description><![CDATA[对应中间的数据链路如没有办法知道有多少空间可以发送的情况，需要建立发送缓存区和接收缓存区，发送方都有可能PUSH不进数据到其中，所以要进行发送缓存区的设置，同时进行水线控制，过水线通过其他可靠链路发消息给对方，要求加快处理。发送方缓存满，停止操作。

接收方接收数据采用定时+消息触发的方式，这里为何不说轮询+中断的方式，应为描述更接近实现方式，轮询方式在多任务情况下，需要让渡处理时间给其他任务，不能一直循环POLL的数据，即使没有数据可POLL的情况下，任务可以让渡处理时间。这有一个极限的情况，如果发送方高]]></description><category></category></item><item><title><![CDATA[RAFT实现（RAFTID对应关系）]]></title><link>https://blog.youkuaiyun.com/DQWKLC/article/details/122750601</link><guid>https://blog.youkuaiyun.com/DQWKLC/article/details/122750601</guid><author>DQWKLC</author><pubDate>Sun, 30 Jan 2022 10:24:37 +0800</pubDate><description><![CDATA[Raft group 包含多个RAFT ID, 在协议中应该定义GROUP ID 和RAFT ID，以便进行区别。每一个RAFT ID 包含多个NODE ID， NODE ID对应一个IP +PORT。数据结构是一对多的关系。

每一个NODE都需要一个唯一的ID号，如何在开机时确定这个ID号？节点ID号，可以通过将IP ADDRESS转换为整数，此整数作为节点ID号，IP地址相同的情况下，可以通过增加PORT号，IPADDRESS +PORT 64位代表一个节点ID号。

RAFT GROUP的数据进行组]]></description><category></category></item><item><title><![CDATA[高并发场景下，SOCKET 应用缓存模型]]></title><link>https://blog.youkuaiyun.com/DQWKLC/article/details/122003003</link><guid>https://blog.youkuaiyun.com/DQWKLC/article/details/122003003</guid><author>DQWKLC</author><pubDate>Fri, 17 Dec 2021 18:47:11 +0800</pubDate><description><![CDATA[高并发，大数据量的SOCKET架构模型，对应数据空间锁的问题，可以使用拉的方式来处理，如发送数据，发送方提供数据的缓存空间，SOCKET 任务来取，发送完释放标记，这样就是一写多读的模型。

SOCKET 发送缓存的模型，应用任务将数据写入BUFFER中，设置标记，SOCKET任务进行发送，发送完成后，释放标记，不需要进行加锁，写任务和BUFFER 是一一对应，操作写BUFFER没有任务竞争。SOCKET任务读取，不存在锁的情况。写BUFFER时需要进行判断标记是否释放。

SOCKET接收的缓存模型要复杂]]></description><category></category></item><item><title><![CDATA[程序员帮小区办实事]]></title><link>https://blog.youkuaiyun.com/DQWKLC/article/details/121488643</link><guid>https://blog.youkuaiyun.com/DQWKLC/article/details/121488643</guid><author>DQWKLC</author><pubDate>Tue, 23 Nov 2021 11:28:35 +0800</pubDate><description><![CDATA[深圳市区是高楼林立的地方，所在小区高空抛物现象比较严重，小区志愿者主动承担项目，免费为业主进行服务，甘当小区业主，住建局，施工单位工作的协调员，借用业界项目管理模式，成功运用到小区公益项目中，实现小区防高空抛物监控项目落地，获得小区住户业主的一致好评。]]></description><category></category></item><item><title><![CDATA[使用EPOLL 进行CONNECT实现]]></title><link>https://blog.youkuaiyun.com/DQWKLC/article/details/120198940</link><guid>https://blog.youkuaiyun.com/DQWKLC/article/details/120198940</guid><author>DQWKLC</author><pubDate>Thu, 09 Sep 2021 12:42:22 +0800</pubDate><description><![CDATA[while(1)
    {
     connect_fd = accept(listen_fd, (struct sockaddr *)&amp;clt_addr, (socklen_t *)&amp;len);
     

     if ( connect_fd &gt;0)
     {

      printf("...]]></description><category></category></item><item><title><![CDATA[数据库系统实现（关机过程）]]></title><link>https://blog.youkuaiyun.com/DQWKLC/article/details/120198863</link><guid>https://blog.youkuaiyun.com/DQWKLC/article/details/120198863</guid><author>DQWKLC</author><pubDate>Thu, 09 Sep 2021 12:31:41 +0800</pubDate><description><![CDATA[从整个数据流的处理过程看，在关机的过程中，需要处理以下几个步骤，首先是网络传输过程中的数据需要处理，将已接收到网络缓存中的数据，向后级的数据处理和索引处理模块进行传递，该发回网络的数据发回到网络，此时就可以对网络模块进行关闭。

数据处理模块中的缓存数据需要建立索引和形成PAGE，形成PAGE后就可以进行写盘操作。形成索引后，也需要进行写盘操作。缓存的数据只保存相对热点数据，进行写盘操作，可以丢弃部分缓存数据。缓存数据的主要作用是为了读操作使用的，写操作的数据缓存都是尽量按系...]]></description><category></category></item><item><title><![CDATA[数据库系统实现（开机过程）]]></title><link>https://blog.youkuaiyun.com/DQWKLC/article/details/120198847</link><guid>https://blog.youkuaiyun.com/DQWKLC/article/details/120198847</guid><author>DQWKLC</author><pubDate>Thu, 09 Sep 2021 12:29:00 +0800</pubDate><description><![CDATA[数据库开机流程，有三个大的流程，一个是模块的加载，一个是数据的加载，一个是业务的加载，三个加载过程依次进行，直到对外提供数据库服务。

模块的加载过程相当处理简单，就是对所有使用的基础部件进行系统初始后，读取配置信息，空间分配，任务划分的工作。

数据加载的过程，索引组织数据的加载，一般是TREE的数据结构加载，节点数据的加载。第二个需要加载的是热点数据，包含热点数据的索引加载，以及部分热点数据的PAGE页进行加载，索引的数据量，也就是KEY的数量可以多进行加...]]></description><category></category></item><item><title><![CDATA[数据库系统实现（索引读场景）]]></title><link>https://blog.youkuaiyun.com/DQWKLC/article/details/119274480</link><guid>https://blog.youkuaiyun.com/DQWKLC/article/details/119274480</guid><author>DQWKLC</author><pubDate>Sat, 31 Jul 2021 13:26:15 +0800</pubDate><description><![CDATA[在进行读的过程中，没有写操作的情况下，进行TREE NODEID查找，检查是否KEY 超过MAX, TREENODEID 文件中没有满的情况下，需要MAX值不一定是最大的，所以要进行MSGBUFFERLIST的查找，其中有可能有大于MAX的情况；当TREENODEID文件中满的情况下，MAX是最大的，加入KEY大于MAX的一定放在下一级。

   有写操作的情况下，处理复杂，修改的数据有MSGBUFFERLIST, COUNTER, MAX， 上一级CALLBACKLIST， TREE...]]></description><category></category></item><item><title><![CDATA[数据库系统实现（数据文件完整性检查和恢复）]]></title><link>https://blog.youkuaiyun.com/DQWKLC/article/details/119145742</link><guid>https://blog.youkuaiyun.com/DQWKLC/article/details/119145742</guid><author>DQWKLC</author><pubDate>Tue, 27 Jul 2021 15:49:11 +0800</pubDate><description><![CDATA[LOG文件的完整性检查，通过在每次追加页的末尾增加写入检查点，通过检查文件最后的页是否是完整的，达到检查文件的完整性。

    另外一种思路是文件头充当，由于LOG文件时追加方式，可以将PAGE页头作为此页的结束，下一页要写的时，可以直接跳过。直接追加纯数据。此种方式比较简单，属于标记法检查文件大小。

    文件内容的检查，可以检查最后几页数据的校验值，再进行长度的检查后，分别取最后每一页进行CRC32校验, 或者是MD5 128校验 。通过检查，最后确定LOG文件的完整...]]></description><category></category></item><item><title><![CDATA[数据库系统实现（缓存失效）]]></title><link>https://blog.youkuaiyun.com/DQWKLC/article/details/119139859</link><guid>https://blog.youkuaiyun.com/DQWKLC/article/details/119139859</guid><author>DQWKLC</author><pubDate>Tue, 27 Jul 2021 11:37:05 +0800</pubDate><description><![CDATA[缓存失效的问题，数据直接请求到文件系统，对IO的影响巨大。

1、大量的不存在的KV进行查询，导致CACHE失效，请求直接到文件IO操作上。增加NULL的记录，需要开辟新的空间保存NULL的情况，同时又更新的策略和淘汰的策略。

2、CACHE不存在，文件中有，多个请求在IO数据没有进入到CACHE中，需要增加数据相同的判断，可以通过检查CACAE ID是否存在，PAGEID+FILEID+CACHEID+FLAG的唯一性进行判断是否需要读盘，同样有更新和淘汰的策略。对于INDEX的情况，在BUFFERLI]]></description><category></category></item><item><title><![CDATA[数据库系统实现（数据LOAD）]]></title><link>https://blog.youkuaiyun.com/DQWKLC/article/details/118890686</link><guid>https://blog.youkuaiyun.com/DQWKLC/article/details/118890686</guid><author>DQWKLC</author><pubDate>Mon, 19 Jul 2021 10:44:54 +0800</pubDate><description><![CDATA[配置的导入，文件路径，任务数量（特别是有多少HASH INDEX的任务，数据定位的变化，目前的设计不支持动态的变化，会导致数据的迁移，如果设计上增加这样的功能，如何去实现？），数据结构的配置，空间大小的分配（NET PAGEBUFFER, HOT HASHMAP BUFFER, HOT HASH INDEX BUFFER, HOT DATACACHE BUFFER， TREE BUFFER）； TREENODE的数量由LEVEL和BUFFERNODE的数据来定。

   HOTKEY数...]]></description><category></category></item></channel></rss>