<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Valkey on Quanye&#39;s Blog</title>
    <link>https://quanyeyang.github.io/zh-cn/valkey/</link>
    <description>Recent content in Valkey on Quanye&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <managingEditor>quanyemostima@gmail.com (杨全烨)</managingEditor>
    <webMaster>quanyemostima@gmail.com (杨全烨)</webMaster>
    <copyright>© 2026 杨全烨</copyright>
    <lastBuildDate>Sun, 26 Jul 2026 16:00:00 +0800</lastBuildDate><atom:link href="https://quanyeyang.github.io/zh-cn/valkey/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>RESP3 push frame torn apart when a pubsub message &gt;= 16384 bytes is delivered to the publishing connection (9.0 regression)</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/bugfix-resp3-push-frame-torn/</link>
      <pubDate>Wed, 22 Jul 2026 11:55:36 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/bugfix-resp3-push-frame-torn/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;binbin第一次直接assign给我的issue,我来尝试处理一下并且学习一下这里的代码。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;原issue界面:https://github.com/valkey-io/valkey/issues/4231&lt;/p&gt;
&lt;hr&gt;


&lt;h2 class=&#34;relative group&#34;&gt;1. 这个 bug 发生在什么业务场景 
    &lt;div id=&#34;1-%E8%BF%99%E4%B8%AA-bug-%E5%8F%91%E7%94%9F%E5%9C%A8%E4%BB%80%E4%B9%88%E4%B8%9A%E5%8A%A1%E5%9C%BA%E6%99%AF&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100&#34;&gt;
        &lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34;
            style=&#34;text-decoration-line: none !important;&#34; href=&#34;#1-%E8%BF%99%E4%B8%AA-bug-%E5%8F%91%E7%94%9F%E5%9C%A8%E4%BB%80%E4%B9%88%E4%B8%9A%E5%8A%A1%E5%9C%BA%E6%99%AF&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;        
    
&lt;/h2&gt;
&lt;p&gt;一条 TCP 连接同时干两件事：&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>防止同步重入解UAF类问题</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/bugfix-sync-reentry-uaf/</link>
      <pubDate>Tue, 21 Jul 2026 15:43:38 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/bugfix-sync-reentry-uaf/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;迄今为止我们看到好几个这样的段错误问题了。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;这个PR,为单线程释放造成的UAF &lt;a href=&#34;https://github.com/valkey-io/valkey/pull/4212&#34; target=&#34;_blank&#34;&gt;https://github.com/valkey-io/valkey/pull/4212&lt;/a&gt;
同时还有&lt;strong&gt;多线程下RDMA的崩溃问题&lt;/strong&gt; 以及 &lt;strong&gt;Valkey Over RDMA测试中server UAF崩溃的问题&lt;/strong&gt;
中我们都遇到类似的问题，&lt;strong&gt;于是尝试从架构上来解决一下这个问题&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;举一隅不以三隅反，则不复也。&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Broader direction (non-blocking):&lt;/strong&gt; Part of the root cause is that many flows free clients synchronously (&lt;code&gt;CLIENT KILL&lt;/code&gt;, &lt;code&gt;evictClients()&lt;/code&gt;, COB-limit handling, …), and we keep tripping over iterators/cached pointers that outlive those frees. This snapshot fix is a good local solution, but it may be worth a broader discussion on whether these paths should prefer &lt;code&gt;freeClientAsync()&lt;/code&gt; so client teardown always happens at a safe point (beforeSleep) rather than mid-iteration. Raising it here since it&amp;rsquo;s a recurring class of bug, not to block this PR.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>UAF类-多BLPOP场景</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/bugfix-uaf-multi-blpop/</link>
      <pubDate>Tue, 21 Jul 2026 11:15:35 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/bugfix-uaf-multi-blpop/</guid>
      <description>&lt;h2 class=&#34;relative group&#34;&gt;1. BLPOP 是干什么的？ 
    &lt;div id=&#34;1-blpop-%E6%98%AF%E5%B9%B2%E4%BB%80%E4%B9%88%E7%9A%84&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100&#34;&gt;
        &lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34;
            style=&#34;text-decoration-line: none !important;&#34; href=&#34;#1-blpop-%E6%98%AF%E5%B9%B2%E4%BB%80%E4%B9%88%E7%9A%84&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;        
    
&lt;/h2&gt;
&lt;p&gt;普通 &lt;code&gt;LPOP mylist&lt;/code&gt;：list 空就立刻回 &lt;code&gt;(nil)&lt;/code&gt;。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>RDB_OPCODE_SLOT_IMPORT short job_name causes server-side heap out-of-bounds read during startup RDB loading</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/security-rdb-slot-import-oob/</link>
      <pubDate>Sun, 19 Jul 2026 12:33:27 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/security-rdb-slot-import-oob/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/valkey-io/valkey/issues/4207&#34; target=&#34;_blank&#34;&gt;https://github.com/valkey-io/valkey/issues/4207&lt;/a&gt;
一类安全性问题，上面是issue界面，可以尝试解决一下。&lt;/p&gt;
&lt;p&gt;典型的 trust-boundary 长度契约不一致——命令路径强制 &lt;code&gt;job_name&lt;/code&gt; 必须是 40 字节，
RDB 加载路径却没校验，导致 &lt;code&gt;memcpy(..., 40)&lt;/code&gt; 从短 SDS 上越界读。&lt;/p&gt;


&lt;h2 class=&#34;relative group&#34;&gt;漏洞本质（从内存布局看） 
    &lt;div id=&#34;%E6%BC%8F%E6%B4%9E%E6%9C%AC%E8%B4%A8%E4%BB%8E%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80%E7%9C%8B&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100&#34;&gt;
        &lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34;
            style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%E6%BC%8F%E6%B4%9E%E6%9C%AC%E8%B4%A8%E4%BB%8E%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80%E7%9C%8B&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;        
    
&lt;/h2&gt;


&lt;h3 class=&#34;relative group&#34;&gt;子系统约定 
    &lt;div id=&#34;%E5%AD%90%E7%B3%BB%E7%BB%9F%E7%BA%A6%E5%AE%9A&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100&#34;&gt;
        &lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34;
            style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%E5%AD%90%E7%B3%BB%E7%BB%9F%E7%BA%A6%E5%AE%9A&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;        
    
&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;CLUSTER_NAMELEN == 40&lt;/code&gt;，job name 是&lt;strong&gt;固定长度 hex&lt;/strong&gt;（类似 node id）：&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Client Side Caching-服务端反向索引在客户端断开之后没有做及时清理导致无限膨胀的问题</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/bugfix-client-side-caching-index-leak/</link>
      <pubDate>Wed, 15 Jul 2026 22:08:11 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/bugfix-client-side-caching-index-leak/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Issue &lt;a href=&#34;https://github.com/valkey-io/valkey/issues/4143&#34; target=&#34;_blank&#34;&gt;#4143&lt;/a&gt; 的核心是：Client Side Caching（CSC）的服务端反向索引在客户端断开后&lt;strong&gt;故意不做即时清理&lt;/strong&gt;，&lt;strong&gt;导致内层表可无限膨胀&lt;/strong&gt;。
下面按&lt;strong&gt;机制 → 内存布局 → 生命周期 → 缺口&lt;/strong&gt; 来拆。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;这个非常像&lt;strong&gt;Thesis-ZooKeeper&lt;/strong&gt;中的客户端和server的watch机制。&lt;/p&gt;


&lt;h1 class=&#34;relative group&#34;&gt;问题背景 
    &lt;div id=&#34;%E9%97%AE%E9%A2%98%E8%83%8C%E6%99%AF&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100&#34;&gt;
        &lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34;
            style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%E9%97%AE%E9%A2%98%E8%83%8C%E6%99%AF&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;        
    
&lt;/h1&gt;


&lt;h2 class=&#34;relative group&#34;&gt;功能背景：Client Side Caching 
    &lt;div id=&#34;%E5%8A%9F%E8%83%BD%E8%83%8C%E6%99%AFclient-side-caching&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100&#34;&gt;
        &lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34;
            style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%E5%8A%9F%E8%83%BD%E8%83%8C%E6%99%AFclient-side-caching&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;        
    
&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;CLIENT TRACKING on&lt;/code&gt; 让&lt;strong&gt;客户端在本地缓存 key&lt;/strong&gt;。
服务端&lt;strong&gt;不维护&lt;/strong&gt;「客户端有哪些 key」的&lt;strong&gt;完整正向索引&lt;/strong&gt;，而是维护反向索引：&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Valkey Over RDMA测试中server UAF崩溃的问题</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/bugfix-rdma-server-uaf/</link>
      <pubDate>Tue, 14 Jul 2026 21:46:50 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/bugfix-rdma-server-uaf/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/valkey-io/valkey/issues/3345&#34; target=&#34;_blank&#34;&gt;https://github.com/valkey-io/valkey/issues/3345&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我们遇到的主要现象就是ctrl + C的时候会出现段错误，应该如何解决？&lt;/p&gt;
&lt;p&gt;这是我们的PR:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/valkey-io/valkey/pull/3448&#34; target=&#34;_blank&#34;&gt;https://github.com/valkey-io/valkey/pull/3448&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;为了面试的时候讲清楚这个UAF导致的Server Crash问题，我们需要仔细复盘一下，
这个还是valkey Over RDMA的系列问题之一:&lt;/p&gt;


&lt;h2 class=&#34;relative group&#34;&gt;背景:RDMA为什么需要pending list 
    &lt;div id=&#34;%E8%83%8C%E6%99%AFrdma%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81pending-list&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100&#34;&gt;
        &lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34;
            style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%E8%83%8C%E6%99%AFrdma%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81pending-list&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;        
    
&lt;/h2&gt;
&lt;p&gt;RDMA 连接没有 TCP 那种 POLLOUT 事件来驱动 write handler，
所以 server &lt;strong&gt;用一张待处理链表手动&amp;quot;叫醒&amp;quot;连接&lt;/strong&gt;,
因为在真正开始传输数据的时候，我们使用的是RDMA的单边建立连接的方法，
WRITE_WITH_IMM,来产生通知，就是我知道什么时候可读，但是不知道什么时候可以写：&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>多线程下的RDMA的崩溃问题(无锁队列IO模型)</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/bugfix-multithread-rdma-lockfree-io/</link>
      <pubDate>Tue, 14 Jul 2026 21:27:29 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/bugfix-multithread-rdma-lockfree-io/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;If it&amp;rsquo;s broken, I&amp;rsquo;ll fix it!&lt;/p&gt;&lt;/blockquote&gt;


&lt;h1 class=&#34;relative group&#34;&gt;现在重新引入了一个有意思的问题（背景阐述） 
    &lt;div id=&#34;%E7%8E%B0%E5%9C%A8%E9%87%8D%E6%96%B0%E5%BC%95%E5%85%A5%E4%BA%86%E4%B8%80%E4%B8%AA%E6%9C%89%E6%84%8F%E6%80%9D%E7%9A%84%E9%97%AE%E9%A2%98%E8%83%8C%E6%99%AF%E9%98%90%E8%BF%B0&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100&#34;&gt;
        &lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34;
            style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%E7%8E%B0%E5%9C%A8%E9%87%8D%E6%96%B0%E5%BC%95%E5%85%A5%E4%BA%86%E4%B8%80%E4%B8%AA%E6%9C%89%E6%84%8F%E6%80%9D%E7%9A%84%E9%97%AE%E9%A2%98%E8%83%8C%E6%99%AF%E9%98%90%E8%BF%B0&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;        
    
&lt;/h1&gt;
&lt;p&gt;描述:
本次问题解决的是&lt;strong&gt;RDMA的多线程导致的崩溃问题&lt;/strong&gt;.
在我们解决这个问题的同时,&lt;strong&gt;实际上主分支正在重构I/O的模型,我们不知道新的I/O模型是否还会出现这样的问题&lt;/strong&gt;.
(之后再进行验证)&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>valkey Over RDMA技术原理</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/rdma-valkey-over-rdma-internals/</link>
      <pubDate>Mon, 13 Jul 2026 15:03:13 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/rdma-valkey-over-rdma-internals/</guid>
      <description>&lt;p&gt;&lt;strong&gt;2.RDMA基本概念&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;究竟是&lt;strong&gt;如何进行通信&lt;/strong&gt;的?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;TCP是&lt;strong&gt;流式协议&lt;/strong&gt;(就是字节流),但是RDMA是&lt;strong&gt;面向消息&lt;/strong&gt;(就是element)通信的.&lt;/p&gt;
&lt;p&gt;放弃用双边操作（SEND/RECV）来传输业务数据，而是用双边操作来“交换信令”，用单边操作（WRITE）来“传输数据”。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Valkey Client&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;                                               &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Valkey Server &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Listen RDMA Port&lt;span class=&#34;o&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;                                                                       &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;========================&lt;/span&gt; 1. 建立 RDMA &lt;span class=&#34;nv&#34;&gt;连接&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=========================&lt;/span&gt;&amp;gt;  &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &amp;lt;&lt;span class=&#34;o&#34;&gt;=======================&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;RC QP 初始化&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;========================&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;                                                                       &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==================&lt;/span&gt; 2. 交换 Feature 支持 &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;@IBV_WR_SEND&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=============&lt;/span&gt;&amp;gt;  &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &amp;lt;&lt;span class=&#34;o&#34;&gt;=================&lt;/span&gt; 3. 交换 Feature 支持 &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;@IBV_WR_SEND&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==============&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;                                                                       &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;                     &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;阶段 A：初始化远端内存写入权限&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; 这里都是双边操作        &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &amp;lt;---- 4. Server 发送其 RX Buffer 的地址/长度/R_Key &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;@IBV_WR_SEND&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; ---   &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Server 执行 ibv_post_recv 准备接收命令&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; ---- 5. Client 发送其 RX Buffer 的地址/长度/R_Key &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;@IBV_WR_SEND&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; ---&amp;gt;   &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Client 执行 ibv_post_recv 准备接收响应&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; 两边都通过send来发送R_key和内存地址,两边收到之后都可以绕过CPU直接进行读写的操作.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;                                                                       &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;                     &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;阶段 B：使用 WRITE 进行命令与数据交互&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;           &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; --- 6. Valkey Command &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;如 PING&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;@IBV_WR_RDMA_WRITE_WITH_IMM&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; ------&amp;gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;直接写入 Server 内存，触发 IMM 通知 Server CPU&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &amp;lt;--- 7. Valkey Response &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;如 PONG&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;@IBV_WR_RDMA_WRITE_WITH_IMM&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; ----- &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;直接写入 Client 内存，触发 IMM 通知 Client CPU&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; --- 8. Valkey Command &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;如 SET&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;@IBV_WR_RDMA_WRITE_WITH_IMM&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; -------&amp;gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &amp;lt;--- 9. Valkey Response &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;如 OK&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;@IBV_WR_RDMA_WRITE_WITH_IMM&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; ------- &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;                                                                       &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;                     &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;阶段 C：处理缓冲区写满 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;RX is full&lt;span class=&#34;o&#34;&gt;)]&lt;/span&gt;             &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;假设 Client 发现 Server 之前给的 RX Buffer 空间不足了&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;               &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;                                                                       &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &amp;lt;--- 10. Server 重新注册内存并发送新 RX Buffer 信息 &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;@IBV_WR_SEND&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; -- &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Server 发现自己消费完了，主动发新 Buffer，并 ibv_post_recv&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; --- 11. Valkey Command &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;恢复发送&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;@IBV_WR_RDMA_WRITE_WITH_IMM&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; ----&amp;gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;                                                                       &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;假设 Server 发现 Client 的 RX Buffer 不足了&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;                         &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; ---- 12. Client 重新注册内存并发送新 RX Buffer 信息 &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;@IBV_WR_SEND&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;-&amp;gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Client 主动发新 Buffer，并 ibv_post_recv&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &amp;lt;--- 13. Valkey Response &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;恢复发送&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;@IBV_WR_RDMA_WRITE_WITH_IMM&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; --- &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;                                                                       &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;========================&lt;/span&gt; 14. 断开 RDMA &lt;span class=&#34;nv&#34;&gt;连接&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;========================&lt;/span&gt;&amp;gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;1.什么是IMM消息通知?&lt;/strong&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Raft Cluster valkey-cli Tooling Compatibility</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/feature-raft-cli-tooling/</link>
      <pubDate>Mon, 13 Jul 2026 14:53:53 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/feature-raft-cli-tooling/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;也是非常有趣的话题，最近valkey引入了Raft算法。&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;这个 PR 解决的是：Raft 集群里，&lt;strong&gt;服务端对拓扑变更命令的执行模型变了&lt;/strong&gt;，
但 &lt;code&gt;valkey-cli --cluster fix&lt;/code&gt; 还在用旧的 gossip 事务模型发命令，两者不兼容。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/valkey-io/valkey/issues/3856&#34; target=&#34;_blank&#34;&gt;https://github.com/valkey-io/valkey/issues/3856&lt;/a&gt; 可以来学习一下。&lt;/p&gt;


&lt;h2 class=&#34;relative group&#34;&gt;start 
    &lt;div id=&#34;start&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100&#34;&gt;
        &lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34;
            style=&#34;text-decoration-line: none !important;&#34; href=&#34;#start&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;        
    
&lt;/h2&gt;
&lt;p&gt;首先切换的最新的上游分支：&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Raft Cluster Support For Non-Voting Memebers</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/feature-raft-non-voting-members/</link>
      <pubDate>Sun, 12 Jul 2026 23:44:47 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/feature-raft-non-voting-members/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;也是Raft中一个很有意思的话题，我们来实现一个新的角色：Learner.
那这个实现的排期还挺紧迫的,这个毫无疑问也是&lt;strong&gt;比预选举协议更具有挑战性。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/valkey-io/valkey/issues/3866&#34; target=&#34;_blank&#34;&gt;原issue&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;关于Raft的架构可以在&lt;strong&gt;Raft Cluster Pre-Vote Protocol&lt;/strong&gt;中复习，这是我们做的第一个Raft相关的PR.&lt;/p&gt;
&lt;p&gt;刚好同时了解集群的原理:&lt;strong&gt;特性：Redis Cluster 集群&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;需求是这么写的：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Implement support for &amp;ldquo;Learner&amp;rdquo; or &amp;ldquo;Observer&amp;rdquo; non-voting roles in the Raft consensus group.&lt;/em&gt;
实现learner 或者 observer.（实际上就是learner）.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Raft Cluster Pre-Vote Protocol</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/feature-raft-cluster-pre-vote-protocol/</link>
      <pubDate>Sun, 12 Jul 2026 23:06:26 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/feature-raft-cluster-pre-vote-protocol/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;本文章写于cluster bus 可插拔raft协议改造的早期，此时还未成形，
只是笔者学习的一个记录而已,因为笔者在尝试在 redis 的 cluster V2中实现Raft的预选举协议。
已经merge,我们还可以进行一些复盘。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/valkey-io/valkey/issues/3860&#34; target=&#34;_blank&#34;&gt;原issue界面&lt;/a&gt;
这是valkey尝试实现可插拔的Raft协议中的&lt;a href=&#34;https://github.com/valkey-io/valkey/issues/3860&#34; target=&#34;_blank&#34;&gt;预选举问题&lt;/a&gt;，这也算是一个有趣的工程实现。
这里我们还是需要首先研究：&lt;a href=&#34;https://web.stanford.edu/~ouster/cgi-bin/papers/OngaroPhD.pdf&#34; target=&#34;_blank&#34;&gt;Diego Ongaro博士毕业论文原文&lt;/a&gt; 中的9.6节摘录：
&lt;em&gt;Preventing disruptions when a server rejoins the cluster One downside of Raft’s leader election algorithm is that a server that has been partitioned from the cluster is likely to cause a disruption when it regains connectivity. When a server is partitioned, it will not receive heartbeats. It will soon increment its term to start an election, although it won’t be able to collect enough votes to become leader. When the server regains connectivity sometime later, its larger term number will propagate to the rest of the cluster (either through the server’s RequestVote requests or through its AppendEntries response). This will force the cluster leader to step down, and a new election will have to take place to select a new leader. Fortunately, such events are likely to be rare, and each will only cause one leader to step down. If desired, Raft’s basic leader election algorithm can be extended with an additional phase to prevent such disruptions, forming the Pre-Vote algorithm. In the Pre-Vote algorithm, a candidate only increments its term if it first learns from a majority of the cluster that they would be willing to grant the candidate their votes (if the candidate’s log is sufficiently up-to-date, and the voters have not received heartbeats from a valid leader for at least a baseline election timeout). This was inspired by ZooKeeper’s algorithm, in which a server must receive a majority of votes before it calculates a new epoch and sends NewEpoch messages (however, in ZooKeeper servers do not solicit votes, other servers offer them). The Pre-Vote algorithm solves the issue of a partitioned server disrupting the cluster when it rejoins. While a server is partitioned, it won’t be able to increment its term, since it can’t receive permission from a majority of the cluster. Then, when it rejoins the cluster, it still won’t be able to increment its term, since the other servers will have been receiving regular heartbeats from the leader. Once the server receives a heartbeat from the leader itself, it will return to the follower state (in the same term). We recommend the Pre-Vote extension in deployments that would benefit from additional robustness. We also tested it in various leader election scenarios in AvailSim, and it does not appear to significantly harm election performance.&lt;/em&gt;
以下是&lt;strong&gt;翻译&lt;/strong&gt;：&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>事件通知是怎么产生的？</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/rdma-how-event-notifications-work/</link>
      <pubDate>Thu, 09 Jul 2026 15:50:02 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/rdma-how-event-notifications-work/</guid>
      <description>&lt;p&gt;看看一个RDMA的上下文：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-C&#34; data-lang=&#34;C&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;typedef&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;RdmaContext&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;connection&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;conn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// 上层连接结构体
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;long&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;long&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;keepalive_te&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;cm&#34;&gt;/* RDMA has no transport layer keepalive */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ibv_pd&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// 保护域
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rdma_event_channel&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cm_channel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ibv_comp_channel&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;comp_channel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// CQ的通知事件，用来触发POLLIN事件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ibv_cq&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cq&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;cm&#34;&gt;/* TX */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;RdmaXfer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tx_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;cm&#34;&gt;/* remote transfer buffer address */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;uint32_t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tx_key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;cm&#34;&gt;/* remote transfer buffer key */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;uint32_t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tx_length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;cm&#34;&gt;/* remote transfer buffer length */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;uint32_t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tx_offset&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;cm&#34;&gt;/* remote transfer buffer offset */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;uint32_t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tx_ops&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;cm&#34;&gt;/* operations on remote transfer */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;cm&#34;&gt;/* RX */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;RdmaXfer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;cm&#34;&gt;/* CMD 0 ~ VALKEY_RDMA_MAX_WQE for recv buffer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;     * VALKEY_RDMA_MAX_WQE ~ 2 * VALKEY_RDMA_MAX_WQE -1 for send buffer */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;ValkeyRdmaCmd&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cmd_buf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ibv_mr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cmd_mr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;RdmaContext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      
    </item>
    
    <item>
      <title>实现RDMA库的运行时动态加载(对于client和benchmark)</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/feature-rdma-runtime-dynamic-loading/</link>
      <pubDate>Mon, 06 Jul 2026 16:56:17 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/feature-rdma-runtime-dynamic-loading/</guid>
      <description>&lt;p&gt;两个PR：
&lt;a href=&#34;https://github.com/valkey-io/valkey/pull/3072&#34; target=&#34;_blank&#34;&gt;valkey主库修改&lt;/a&gt;
&lt;a href=&#34;https://github.com/valkey-io/libvalkey/pull/284&#34; target=&#34;_blank&#34;&gt;libvalkey上游&lt;/a&gt;
我们主要讲述这个在&lt;strong&gt;client&lt;/strong&gt;和benchmark上做RDMA的两个库的动态加载这两个问题,两个库&lt;code&gt;librdmacm&lt;/code&gt; &lt;code&gt;libibverbs&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;之后最好再阅读一下CSAPP关于动态链接的部分，之后还预计出一篇文章好好讲解一下程序的链接，也是一门大学问。
这个真的值得深挖。&lt;/p&gt;


&lt;h2 class=&#34;relative group&#34;&gt;背景 
    &lt;div id=&#34;%E8%83%8C%E6%99%AF&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100&#34;&gt;
        &lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34;
            style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%E8%83%8C%E6%99%AF&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;        
    
&lt;/h2&gt;
&lt;p&gt;最早是字节跳动在进行valkey Over RDMA的开发,
但是只做了对于server的解耦,
但是没有对于client和benchmark的解耦,
这就导致了Opensuse,linux的发行版引来了这样的问题:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>valkey32bit构建下头文件顺序问题</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/bugfix-valkey-32bit-header-order/</link>
      <pubDate>Sun, 05 Jul 2026 19:28:49 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/bugfix-valkey-32bit-header-order/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;这个PR非常有纪念意义，这是我们给Valkey提出的第一个PR。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;同时关于静态链接的内容，都可以在&lt;strong&gt;CSAPPLinkLab&lt;/strong&gt;中进行学习。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/valkey-io/valkey/pull/2943&#34; target=&#34;_blank&#34;&gt;PR页面&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码层面就是加了很多&lt;code&gt;../fmacros.h&lt;/code&gt;并且server之前加上了一个验证。&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-C&#34; data-lang=&#34;C&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Sanity check: we require large-file support. If include order caused
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * _FILE_OFFSET_BITS to be ignored, off_t may end up 32-bit on 32-bit builds,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * which will lead to ODR/LTO type mismatches. Fail fast at compile time.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;static_assert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;off_t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;off_t must be 64-bit; ensure _FILE_OFFSET_BITS=64 is in effect before system headers&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 到这里为止所有的off_t偏移的定义都应该是8
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 class=&#34;relative group&#34;&gt;&lt;strong&gt;第一部分：核心概念深度解析&lt;/strong&gt; 
    &lt;div id=&#34;%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100&#34;&gt;
        &lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34;
            style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;        
    
&lt;/h3&gt;


&lt;h3 class=&#34;relative group&#34;&gt;&lt;strong&gt;1. 什么是 ABI (Application Binary Interface)？&lt;/strong&gt; 
    &lt;div id=&#34;1-%E4%BB%80%E4%B9%88%E6%98%AF-abi-application-binary-interface&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100&#34;&gt;
        &lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34;
            style=&#34;text-decoration-line: none !important;&#34; href=&#34;#1-%E4%BB%80%E4%B9%88%E6%98%AF-abi-application-binary-interface&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;        
    
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;CSAPP 对应章节： 第 3 章（机器级代码），但概念贯穿全书。&lt;/strong&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>valkey-benchmark端RDMA协议的丢失唤醒问题</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/bugfix-benchmark-rdma-lost-wakeup/</link>
      <pubDate>Sun, 05 Jul 2026 19:24:12 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/bugfix-benchmark-rdma-lost-wakeup/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/valkey-io/valkey/issues/3345#issuecomment-4084382404&#34; target=&#34;_blank&#34;&gt;https://github.com/valkey-io/valkey/issues/3345#issuecomment-4084382404&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;用户使用benchmark客户端GET有问题?初步分析就是丢失唤醒的问题.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;删除代码比加上代码牛逼.&lt;/p&gt;&lt;/blockquote&gt;


&lt;h3 class=&#34;relative group&#34;&gt;&lt;strong&gt;git清理&lt;/strong&gt; 
    &lt;div id=&#34;git%E6%B8%85%E7%90%86&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100&#34;&gt;
        &lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34;
            style=&#34;text-decoration-line: none !important;&#34; href=&#34;#git%E6%B8%85%E7%90%86&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;        
    
&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; git clean &lt;span class=&#34;c1&#34;&gt;# 清理未跟踪的文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;git clean -nd src/unit&lt;/code&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Raft-based cluster bus (Cluster V2)</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/feature-raft-cluster-bus-v2/</link>
      <pubDate>Thu, 02 Jul 2026 23:24:33 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/feature-raft-cluster-bus-v2/</guid>
      <description>&lt;p&gt;最近，valkey社区在尝试新的feature,Cluster总线通信方式利用Raft协议，笔者刚学完Raft和主从相关的内容，同时认领了一个issue。
于是想尝试多解决几个这里的问题，就深度研究一下。&lt;/p&gt;
&lt;p&gt;以下是几个社区中讨论的链接：
&lt;a href=&#34;https://github.com/valkey-io/valkey/issues/3856&#34; target=&#34;_blank&#34;&gt;父issue&lt;/a&gt;
分为多个subissues：我们总结一下：&lt;/p&gt;


&lt;h3 class=&#34;relative group&#34;&gt;1.核心底座：Raft 共识与状态机持久化 
    &lt;div id=&#34;1%E6%A0%B8%E5%BF%83%E5%BA%95%E5%BA%A7raft-%E5%85%B1%E8%AF%86%E4%B8%8E%E7%8A%B6%E6%80%81%E6%9C%BA%E6%8C%81%E4%B9%85%E5%8C%96&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100&#34;&gt;
        &lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34;
            style=&#34;text-decoration-line: none !important;&#34; href=&#34;#1%E6%A0%B8%E5%BF%83%E5%BA%95%E5%BA%A7raft-%E5%85%B1%E8%AF%86%E4%B8%8E%E7%8A%B6%E6%80%81%E6%9C%BA%E6%8C%81%E4%B9%85%E5%8C%96&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;        
    
&lt;/h3&gt;
&lt;p&gt;这是 Raft 算法最&lt;strong&gt;原教旨主义&lt;/strong&gt;的部分，确保集群在断电或崩溃后不丢失状态。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Valkey Over RDMA-支持多线程测试(新测试框架)</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/feature-rdma-multithread-tests/</link>
      <pubDate>Mon, 29 Jun 2026 17:13:42 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/feature-rdma-multithread-tests/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;我就直接认为这是一个新的feature了，就是利用libvalkey的client客户端进行模拟的压测，同时是需要支持多线程的。&lt;/p&gt;&lt;/blockquote&gt;


&lt;h2 class=&#34;relative group&#34;&gt;本次修改的测试逻辑 
    &lt;div id=&#34;%E6%9C%AC%E6%AC%A1%E4%BF%AE%E6%94%B9%E7%9A%84%E6%B5%8B%E8%AF%95%E9%80%BB%E8%BE%91&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100&#34;&gt;
        &lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34;
            style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%E6%9C%AC%E6%AC%A1%E4%BF%AE%E6%94%B9%E7%9A%84%E6%B5%8B%E8%AF%95%E9%80%BB%E8%BE%91&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;        
    
&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;这算是一个新的feature,我们需要提一个新的PR来解决问题。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;在&lt;code&gt;tests/rdma&lt;/code&gt;的目录下方，增加&lt;code&gt;libvalkey-test.c&lt;/code&gt;，直接使用&lt;code&gt;libvalkey&lt;/code&gt;的&lt;code&gt;client&lt;/code&gt;相关的API来进行测试即可。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>CVE-2026-25243 Invalid Memory Access in Redis RESTORE Command May Lead to Remote Code Execution</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/security-cve-2026-25243-restore-rce/</link>
      <pubDate>Wed, 27 May 2026 23:17:00 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/security-cve-2026-25243-restore-rce/</guid>
      <description>&lt;h1 class=&#34;relative group&#34;&gt;CVE-2026-25243 — Invalid Memory Access in Redis RESTORE Command May Lead to Remote Code Execution 
    &lt;div id=&#34;cve-2026-25243--invalid-memory-access-in-redis-restore-command-may-lead-to-remote-code-execution&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100&#34;&gt;
        &lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34;
            style=&#34;text-decoration-line: none !important;&#34; href=&#34;#cve-2026-25243--invalid-memory-access-in-redis-restore-command-may-lead-to-remote-code-execution&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;        
    
&lt;/h1&gt;
&lt;p&gt;该漏洞的触发点位于 Redis 的 &lt;code&gt;RESTORE&lt;/code&gt; 命令。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>CVE-2026-27623 Pre-Authentication DOS from malformed RESP request</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/security-cve-2026-27623-resp-dos/</link>
      <pubDate>Tue, 26 May 2026 23:06:59 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/security-cve-2026-27623-resp-dos/</guid>
      <description>&lt;h1 class=&#34;relative group&#34;&gt;CVE-2026-27623 — Pre-Authentication DOS from malformed RESP request 
    &lt;div id=&#34;cve-2026-27623--pre-authentication-dos-from-malformed-resp-request&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100&#34;&gt;
        &lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34;
            style=&#34;text-decoration-line: none !important;&#34; href=&#34;#cve-2026-27623--pre-authentication-dos-from-malformed-resp-request&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;        
    
&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Valkey 预认证拒绝服务 | RESP 协议状态机 | CVSS 3.1: 7.5 HIGH | CWE-20 | 无需认证&lt;/strong&gt; | &lt;a href=&#34;#%e5%a4%8d%e7%8e%b0%e6%ad%a5%e9%aa%a4&#34;&gt;复现步骤&lt;/a&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>多线程下RDMA的崩溃问题</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/bugfix-multithread-rdma-crash/</link>
      <pubDate>Sun, 17 May 2026 10:48:06 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/bugfix-multithread-rdma-crash/</guid>
      <description>&lt;p&gt;本文记录了作者尝试解决这个[CRASH] Does Valkey over RDMA not support I/O threads? #3112 的问题.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/valkey-io/valkey/issues/3112&#34; target=&#34;_blank&#34;&gt;https://github.com/valkey-io/valkey/issues/3112&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;总结一次实验的workflow,这是拉的战线最长的一次,前前后后整了一个多月还没merge进去.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;server端&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 解开当前进程的内存锁&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo prlimit --memlock&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;unlimited --pid &lt;span class=&#34;nv&#34;&gt;$$&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 创建在内存中工作的虚拟网卡&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo modprobe dummy
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ip link add dummy0 &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt; dummy
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ip link &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; dummy0 up
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 配置本地的IP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ip addr add 10.0.0.1/24 dev dummy0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 做RXE的绑定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo rdma link add rxe_dummy &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt; rxe netdev dummy0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 停止本来运行的 valkey&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl stop valkey
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 编译一遍&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make &lt;span class=&#34;nv&#34;&gt;BUILD_RDMA&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;yes &lt;span class=&#34;nv&#34;&gt;USE_FAST_FLOAT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;yes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 跑server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ./src/valkey-server valkey.conf --rdma-bind 10.0.0.1 --rdma-port &lt;span class=&#34;m&#34;&gt;6379&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;client端&lt;/strong&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>为什么多线程会出现问题的总结</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/bugfix-multithread/</link>
      <pubDate>Fri, 15 May 2026 22:11:18 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/bugfix-multithread/</guid>
      <description>&lt;p&gt;&lt;strong&gt;多线程下RDMA的崩溃问题&lt;/strong&gt;
&lt;strong&gt;多线程下的RDMA的崩溃问题(无锁队列IO模型)&lt;/strong&gt;
上述的两个问题都和RDMA通知模型相关.
对 socket/unix，&lt;code&gt;ConnectionType&lt;/code&gt; 里 &lt;code&gt;update_state&lt;/code&gt; 为 NULL，&lt;code&gt;connUpdateState&lt;/code&gt; 基本是空操作。
对 RDMA，&lt;code&gt;updateRdmaState&lt;/code&gt; 会 直接调用数据面：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-C&#34; data-lang=&#34;C&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;updateRdmaState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;connection&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;n&#34;&gt;rdma_connection&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rdma_conn&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rdma_connection&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nf&#34;&gt;connRdmaSetRwHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nf&#34;&gt;connRdmaEventHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rdma_conn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;而 &lt;code&gt;connRdmaEventHandler&lt;/code&gt; 会 &lt;strong&gt;poll CQ&lt;/strong&gt;，并在未 postpone 时 循环调用 &lt;code&gt;read_handler&lt;/code&gt;（把已 DMA 到 &lt;code&gt;rx.addr&lt;/code&gt; 的数据交给上层）：&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>多线程下RDB文件crash</title>
      <link>https://quanyeyang.github.io/zh-cn/valkey/bugfix-multithread-rdb-crash/</link>
      <pubDate>Fri, 15 May 2026 22:10:35 +0800</pubDate>
      <author>quanyemostima@gmail.com (杨全烨)</author>
      <guid>https://quanyeyang.github.io/zh-cn/valkey/bugfix-multithread-rdb-crash/</guid>
      <description>&lt;p&gt;这个应该就是多线程的情况下才会发生的问题,之后再看.
这是我个人在做测试的时候发现valkey的一个新的问题,可以先试试
workflow可以这样:
首先在unstable上进行编译,先起一个服务器,但是不要更改valkey.conf,之后压测的时候应该默认会产生对应的RDB文件才对.
我们就在主线程上做测试看看是否会出现问题.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 解开当前进程的内存锁&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo prlimit --memlock&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;unlimited --pid &lt;span class=&#34;nv&#34;&gt;$$&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 创建在内存中工作的虚拟网卡&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo modprobe dummy
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ip link add dummy0 &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt; dummy
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ip link &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; dummy0 up
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 配置本地的IP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ip addr add 10.0.0.1/24 dev dummy0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 做RXE的绑定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo rdma link add rxe_dummy &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt; rxe netdev dummy0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 停止本来运行的 valkey&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl stop valkey
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 编译一遍&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make &lt;span class=&#34;nv&#34;&gt;BUILD_RDMA&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;yes &lt;span class=&#34;nv&#34;&gt;USE_FAST_FLOAT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;yes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 跑server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ./src/valkey-server valkey.conf --rdma-bind 10.0.0.1 --rdma-port &lt;span class=&#34;m&#34;&gt;6379&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;之后我们起客户端做压测:&lt;/p&gt;</description>
      
    </item>
    
  </channel>
</rss>
