<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Abbas Ali</title>
    <description>The latest articles on DEV Community by Abbas Ali (@abbas_ali_869806556118641).</description>
    <link>https://dev.to/abbas_ali_869806556118641</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4168023%2Fb1eb21a2-fb6d-43cc-b8a2-68929de5a3ed.png</url>
      <title>DEV Community: Abbas Ali</title>
      <link>https://dev.to/abbas_ali_869806556118641</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abbas_ali_869806556118641"/>
    <language>en</language>
    <item>
      <title>KiviDB is now open source: a multi-core, Redis-compatible database in Rust</title>
      <dc:creator>Abbas Ali</dc:creator>
      <pubDate>Mon, 19 Oct 2026 13:01:18 +0000</pubDate>
      <link>https://dev.to/abbas_ali_869806556118641/kividb-is-now-open-source-a-multi-core-redis-compatible-database-in-rust-4pea</link>
      <guid>https://dev.to/abbas_ali_869806556118641/kividb-is-now-open-source-a-multi-core-redis-compatible-database-in-rust-4pea</guid>
      <description>&lt;p&gt;KiviDB is an in-memory database that speaks the Redis protocol. Any Redis client, library or tool works against it unchanged. The difference is underneath: KiviDB is written in Rust and uses a sharded, multi-core engine, where Redis executes commands on a single thread.&lt;/p&gt;

&lt;p&gt;As of version 1.1.0, the entire engine is open source under the GNU AGPLv3.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/kividbio/kividb" rel="noopener noreferrer"&gt;github.com/kividbio/kividb&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we open-sourced it
&lt;/h2&gt;

&lt;p&gt;KiviDB shipped as a closed binary for its first few months. The benchmarks and scripts were public, but the feedback from engineers was consistent: a database sits at the core of a production system, and teams won't put something there that they can't read.&lt;/p&gt;

&lt;p&gt;That's a reasonable position. Benchmarks show what software does under one set of conditions. Source shows how it behaves under all the others: failure paths, edge cases, persistence, replication. So from 1.1.0 the whole engine is public.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's in it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Redis protocol (RESP):&lt;/strong&gt; strings, hashes, lists, sets, sorted sets, streams, pub/sub, transactions, ACLs. The full list is in &lt;a href="https://github.com/kividbio/kividb/blob/master/COMMANDS.md" rel="noopener noreferrer"&gt;COMMANDS.md&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search and vectors:&lt;/strong&gt; Redis Stack-style &lt;code&gt;FT.*&lt;/code&gt; commands for BM25 full-text, tag and numeric indexes, and FLAT or HNSW vector search, including hybrid queries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence:&lt;/strong&gt; native snapshots (&lt;code&gt;dump.kdb&lt;/code&gt;) plus an optional append-only file. HNSW graphs are stored in snapshots, so vector search quality after a restart matches what you had before shutdown.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High availability:&lt;/strong&gt; replication, and cluster mode with gossip, failure detection and failover.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security:&lt;/strong&gt; ACLs, TLS with mutual authentication, and protected mode on by default.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optional Lua:&lt;/strong&gt; &lt;code&gt;EVAL&lt;/code&gt;, &lt;code&gt;FUNCTION&lt;/code&gt;, &lt;code&gt;FCALL&lt;/code&gt; and related commands in builds with &lt;code&gt;--features lua&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I/O:&lt;/strong&gt; io_uring on Linux when the kernel allows it, with a Tokio fallback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Packaging:&lt;/strong&gt; binaries for Linux and macOS (x86_64 and ARM64), &lt;code&gt;.deb&lt;/code&gt; and &lt;code&gt;.rpm&lt;/code&gt; packages, and Docker images on Docker Hub and GHCR.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;BullMQ and Sidekiq both pass their own test suites against KiviDB.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 6380:6380 kividb/kividb
redis-cli &lt;span class="nt"&gt;-p&lt;/span&gt; 6380 PING
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The default port is 6380, so it can sit next to an existing Redis on 6379 while you try it.&lt;/p&gt;

&lt;p&gt;From Python, nothing changes except the port:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;localhost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6380&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;greeting&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;greeting&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Node with ioredis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Redis&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ioredis&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6380&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;greeting&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;greeting&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Vector search in a few lines
&lt;/h2&gt;

&lt;p&gt;Vectors are stored as raw FLOAT32 bytes in a hash field, the same convention as Redis Stack, so existing tutorials carry over.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6380&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;FT.CREATE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;idx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ON&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HASH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PREFIX&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doc:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SCHEMA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vec&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;VECTOR&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HNSW&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TYPE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;FLOAT32&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DIM&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DISTANCE_METRIC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;COSINE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;docs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doc:1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doc:2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doc:3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.35&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vec&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;tobytes&lt;/span&gt;&lt;span class="p"&gt;()})&lt;/span&gt;

&lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;tobytes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;FT.SEARCH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;idx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*=&amp;gt;[KNN 2 @vec $q]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PARAMS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DIALECT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After a large ingest, run &lt;code&gt;SAVE&lt;/code&gt; or &lt;code&gt;BGSAVE&lt;/code&gt; so the next start loads the HNSW graph from disk instead of rebuilding it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmarks, including where we lose
&lt;/h2&gt;

&lt;p&gt;All figures are from one session in October 2026 on AWS Graviton3 bare metal: the server on a &lt;code&gt;c7gn.metal&lt;/code&gt; limited to 32 cores, and the load generator on a second &lt;code&gt;c7gn.metal&lt;/code&gt; in the same placement group. Each engine ran alone, one after another. memtier_benchmark, 10 million keys, 100-byte values.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ops/s&lt;/th&gt;
&lt;th&gt;KiviDB 1.1.0&lt;/th&gt;
&lt;th&gt;Dragonfly 2.0.2&lt;/th&gt;
&lt;th&gt;Redis 8.10&lt;/th&gt;
&lt;th&gt;Redis Cluster (32 shards)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GET, pipeline 16&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;21.2M&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9.1M&lt;/td&gt;
&lt;td&gt;2.4M&lt;/td&gt;
&lt;td&gt;4.7M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SET, pipeline 16&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;19.2M&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8.5M&lt;/td&gt;
&lt;td&gt;2.0M&lt;/td&gt;
&lt;td&gt;4.7M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET, no pipelining&lt;/td&gt;
&lt;td&gt;3.07M&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.35M&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.32M&lt;/td&gt;
&lt;td&gt;1.46M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SET, no pipelining&lt;/td&gt;
&lt;td&gt;3.12M&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.38M&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.54M&lt;/td&gt;
&lt;td&gt;1.46M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;p99 GET / SET, pipeline 16&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.36 / 0.42 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.88 / 1.07 ms&lt;/td&gt;
&lt;td&gt;2.2 / 2.7 ms&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory per key&lt;/td&gt;
&lt;td&gt;177 B&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;134 B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;178 B&lt;/td&gt;
&lt;td&gt;183 B&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Vector search on glove-25-angular (1.18M vectors, HNSW M=16, EF_CONSTRUCTION=256):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;KiviDB 1.1.0&lt;/th&gt;
&lt;th&gt;Dragonfly 2.0.2&lt;/th&gt;
&lt;th&gt;Redis 8.10&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;QPS at ef 64 (recall@10)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;59.3K&lt;/strong&gt; (0.943)&lt;/td&gt;
&lt;td&gt;41.3K (0.912)&lt;/td&gt;
&lt;td&gt;31.8K (0.912)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QPS at ef 512 (recall@10)&lt;/td&gt;
&lt;td&gt;18.7K (0.998)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;29.8K&lt;/strong&gt; (0.995)&lt;/td&gt;
&lt;td&gt;13.7K (0.995)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ingest and index build&lt;/td&gt;
&lt;td&gt;31 s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;13 s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;38 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;How to read this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;KiviDB's lead is largest with pipelining. Without it, Dragonfly is slightly ahead.&lt;/li&gt;
&lt;li&gt;Dragonfly uses less memory per key and builds vector indexes faster.&lt;/li&gt;
&lt;li&gt;The Redis Cluster column is there because comparing a multi-core engine with a single Redis process isn't the whole story. A 32-shard cluster on the same machine is the fairer "all cores" baseline.&lt;/li&gt;
&lt;li&gt;The pipelined runs used a fixed 300 connections, which bounds that number rather than the engine. An independent benchmark now in progress sweeps connection counts instead.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Methodology, scripts and raw output: &lt;a href="https://github.com/kividbio/kivi-benchmark" rel="noopener noreferrer"&gt;kivi-benchmark&lt;/a&gt;. Results depend on hardware and workload, so measure on yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  On the license
&lt;/h2&gt;

&lt;p&gt;KiviDB is AGPL-3.0-only.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Using KiviDB as your database does not put your application under the AGPL.&lt;/strong&gt; An app talking to KiviDB over the network is a separate program, whether it's open source or closed, commercial or not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you modify KiviDB itself&lt;/strong&gt; and offer that modified version to others over a network, you must offer them its source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A commercial license&lt;/strong&gt; is available for organisations that can't use AGPL software.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contributions&lt;/strong&gt; are accepted under a CLA, so the commercial license can exist alongside the open one. Every version released under the AGPLv3 stays available under the AGPLv3.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Contributing
&lt;/h2&gt;

&lt;p&gt;Build from source with stable Rust (1.89 or newer):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/kividbio/kividb.git
&lt;span class="nb"&gt;cd &lt;/span&gt;kividb
cargo build &lt;span class="nt"&gt;--release&lt;/span&gt;
./target/release/kividb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/kividbio/kividb/blob/master/CONTRIBUTING.md" rel="noopener noreferrer"&gt;CONTRIBUTING.md&lt;/a&gt; covers tests and the PR process. Bug reports with a reproduction are especially useful, and security issues go through &lt;a href="https://github.com/kividbio/kividb/blob/master/SECURITY.md" rel="noopener noreferrer"&gt;SECURITY.md&lt;/a&gt; rather than public issues.&lt;/p&gt;




&lt;p&gt;Repo: &lt;a href="https://github.com/kividbio/kividb" rel="noopener noreferrer"&gt;github.com/kividbio/kividb&lt;/a&gt; · Website: &lt;a href="https://kividb.io" rel="noopener noreferrer"&gt;kividb.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Redis® is a registered trademark of Redis Ltd. KiviDB is not affiliated with Redis Ltd.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>backend</category>
      <category>database</category>
      <category>opensource</category>
      <category>rust</category>
    </item>
  </channel>
</rss>
