<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>KvSQL Engine on KvSQL.com</title>
    <link>https://kvsql.com/tags/kvsql-engine/</link>
    <description>Recent content in KvSQL Engine on KvSQL.com</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 22 Oct 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://kvsql.com/tags/kvsql-engine/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>KvSQL Launches With an Embedded Engine and a Database Server on One Set of Records</title>
      <link>https://kvsql.com/kvsql-launches-with-an-embedded-engine-and-a-database-server-on-one-set-of-records/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/kvsql-launches-with-an-embedded-engine-and-a-database-server-on-one-set-of-records/</guid>
      <description>&lt;p&gt;KvSQL 0.1.0 is out. It&amp;rsquo;s a key-value store and an SQL database that keep one copy of the data between them. Read a row by its key and it comes straight from the storage tree, with nothing parsed or planned. Ask SQL about the same rows and it reads the same bytes. One transaction covers both, and an index stays right whichever way a row was written.&lt;/p&gt;&#xA;&lt;p&gt;The release has two products. &lt;strong&gt;KvSQL Engine&lt;/strong&gt; is a Rust library you put in your own program: one file on disk, no server, and no dependencies beyond the Rust standard library. &lt;strong&gt;KvSQL DB&lt;/strong&gt; is built on it: &lt;code&gt;kvsqld&lt;/code&gt; serves a database file over HTTP with JSON, and &lt;code&gt;kvsql&lt;/code&gt; is a shell that talks to the server or opens a file directly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why Key Lookups and SQL Belong on the Same Records</title>
      <link>https://kvsql.com/why-key-lookups-and-sql-belong-on-the-same-records/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/why-key-lookups-and-sql-belong-on-the-same-records/</guid>
      <description>&lt;p&gt;Think of a cloakroom. At one window you hand over a ticket and get your coat back. Nobody searches, nobody asks what colour it was. At another window you can ask the attendant for every blue coat left after nine o&amp;rsquo;clock, and somebody has to go through the racks to answer. Both are useful. A database that only has the first window is a key-value store. One that only has the second is an SQL database.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How KvSQL Was Tested With Power Cuts, Killed Processes and 30000 Statements Checked Against SQLite</title>
      <link>https://kvsql.com/how-kvsql-was-tested-with-power-cuts-killed-processes-and-30000-statements-checked-against-sqlite/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/how-kvsql-was-tested-with-power-cuts-killed-processes-and-30000-statements-checked-against-sqlite/</guid>
      <description>&lt;p&gt;A database makes one promise above the rest. When it says a commit is done, the data is there, even if the power goes a moment later. And if the power goes during a commit, the file holds the whole transaction or none of it, never part. Most of KvSQL&amp;rsquo;s tests are aimed at that promise, from several sides.&lt;/p&gt;&#xA;&lt;p&gt;All the figures below come from one recorded run of the project&amp;rsquo;s test script, &lt;code&gt;scripts/record-results.sh&lt;/code&gt;, on a Linux container with two virtual CPUs, on October 22, 2026. The full output is in the repository under &lt;a href=&#34;https://github.com/softdevstudio/kvsql/tree/main/test/results/latest&#34;&gt;test/results/latest&lt;/a&gt;. CI runs the same script on Linux and macOS on every change.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Case Study: A Checkout That Is Never Half Done, Tested With 1200 Power Cuts</title>
      <link>https://kvsql.com/case-study-a-checkout-that-is-never-half-done-tested-with-1200-power-cuts/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/case-study-a-checkout-that-is-never-half-done-tested-with-1200-power-cuts/</guid>
      <description>&lt;p&gt;A checkout touches several things that must change together. The cart goes away, an order appears with its lines, and the stock goes down. If the power fails halfway, the worst outcomes are an order with the stock never taken, or a paid order with the cart still sitting there. With a key-value store for carts and an SQL database for orders, those are two systems and two commits, and somebody has to write the cleanup for the gap between them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Case Study: Sessions and Reporting in One Store Instead of Two</title>
      <link>https://kvsql.com/case-study-sessions-and-reporting-in-one-store-instead-of-two/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/case-study-sessions-and-reporting-in-one-store-instead-of-two/</guid>
      <description>&lt;p&gt;A web application checks its session table on every request. A token comes in, and the app needs the user behind it, fast. Once in a while somebody wants a different view of the same data: how many sessions are live per country, or every session of one user, revoked at once when a password changes. Teams often split this in two, with sessions in Redis for speed and a copy in SQL for the reports and the bulk revokes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>KvSQL Against SQLite on the Same Machine: Key Reads, SQL Reads and Synced Commits</title>
      <link>https://kvsql.com/kvsql-against-sqlite-on-the-same-machine-key-reads-sql-reads-and-synced-commits/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/kvsql-against-sqlite-on-the-same-machine-key-reads-sql-reads-and-synced-commits/</guid>
      <description>&lt;p&gt;KvSQL&amp;rsquo;s claim is a fast path by key that skips the SQL machinery, on the same records SQL reads. A claim like that needs a measurement, and the obvious yardstick is SQLite. It&amp;rsquo;s the most used embedded database there is, and it&amp;rsquo;s very good. So the project&amp;rsquo;s test script runs a benchmark against SQLite every time it records results, and saves it next to the test output.&lt;/p&gt;&#xA;&lt;p&gt;The figures here are from the recorded run of October 22, 2026, on a Linux container with two virtual CPUs. The full table, with every condition, is &lt;a href=&#34;https://github.com/softdevstudio/kvsql/blob/main/test/results/latest/bench.md&#34;&gt;bench.md&lt;/a&gt; in the repository. A container like this is noisy: between runs on the same day, single figures moved by 20 to 30 percent. Treat the gaps below as rough sizes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Use Example: A Cache With Expiry Using Key Reads and an SQL Sweep</title>
      <link>https://kvsql.com/use-example-a-cache-with-expiry-using-key-reads-and-an-sql-sweep/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/use-example-a-cache-with-expiry-using-key-reads-and-an-sql-sweep/</guid>
      <description>&lt;p&gt;A response cache has two jobs that pull in different directions. On a hit, it has to find one entry by its key as fast as possible. Now and then it has to throw away everything that has expired, which is a question over all the entries. In KvSQL both jobs run on one table.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;db.execute(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;CREATE TABLE cache (key TEXT PRIMARY KEY, body BLOB, expires INTEGER NOT NULL);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            CREATE INDEX cache_expires ON cache(expires)&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;[])&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Store a response with &lt;code&gt;put_row&lt;/code&gt;, which replaces an older entry under the same key:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Use Example: Settings Read by Key and Audited With SQL</title>
      <link>https://kvsql.com/use-example-settings-read-by-key-and-audited-with-sql/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/use-example-settings-read-by-key-and-audited-with-sql/</guid>
      <description>&lt;p&gt;Feature flags and settings are read all the time and listed rarely. The code asks &amp;ldquo;is the new checkout on?&amp;rdquo; on every request. Once in a while a person asks &amp;ldquo;what are all the search settings right now?&amp;rdquo; A plain keyspace in KvSQL answers both, with no schema at all.&lt;/p&gt;&#xA;&lt;p&gt;Write settings as keys and values:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; tx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; db.begin_write()&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tx.put(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;settings&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;checkout.new_flow&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;on&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tx.put(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;settings&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;search.fuzzy&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;off&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tx.put(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;settings&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;search.limit&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;50&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tx.put(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;settings&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;upload.max_mb&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;20&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tx.commit()&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Read one by key, straight from storage:&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
