<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on KvSQL.com</title>
    <link>https://kvsql.com/posts/</link>
    <description>Recent content in Posts 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/posts/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: An Edge Gateway Collecting Sensor Readings Over HTTP With kvsqld</title>
      <link>https://kvsql.com/case-study-an-edge-gateway-collecting-sensor-readings-over-http-with-kvsqld/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/case-study-an-edge-gateway-collecting-sensor-readings-over-http-with-kvsqld/</guid>
      <description>&lt;p&gt;An edge gateway sits between a set of devices and the rest of the world. Sensors post readings to it, a dashboard on the same network shows the latest value per device, and someone asks about history: averages, peaks, the hour a fridge ran warm. The gateway is often a small box with no room for a database team, so it should be one program and one file.&lt;/p&gt;&#xA;&lt;p&gt;This case study runs that set-up with &lt;code&gt;kvsqld&lt;/code&gt;. Twenty simulated devices post readings over HTTP on their own connections, while a dashboard reads the latest value by key and asks SQL for history. It&amp;rsquo;s part of &lt;a href=&#34;https://github.com/softdevstudio/kvsql/blob/main/crates/kvsql-db/examples/case_studies.rs&#34;&gt;case_studies.rs&lt;/a&gt; in the repository. The figures are from its recorded run of October 22, 2026, on a real file on a Linux container with two virtual CPUs. The output is in &lt;a href=&#34;https://github.com/softdevstudio/kvsql/blob/main/test/results/latest/case-studies.md&#34;&gt;case-studies.md&lt;/a&gt;.&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>
    <item>
      <title>Use Example: Working With a Database File in the kvsql Shell</title>
      <link>https://kvsql.com/use-example-working-with-a-database-file-in-the-kvsql-shell/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/use-example-working-with-a-database-file-in-the-kvsql-shell/</guid>
      <description>&lt;p&gt;Sometimes you just want to look inside a database. Maybe a test left a file behind, or you&amp;rsquo;re checking what a service wrote, or you want to try a query before putting it in code. The &lt;code&gt;kvsql&lt;/code&gt; shell opens a file directly, with no server running, and takes SQL and key-value commands side by side.&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-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kvsql --file jobs.kvsql&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here is a short session, as the project&amp;rsquo;s &lt;a href=&#34;https://github.com/softdevstudio/kvsql/blob/main/crates/kvsql-db/examples/case_studies.rs&#34;&gt;use example program&lt;/a&gt; ran it through the shell&amp;rsquo;s own command code, one command at a time the way &lt;code&gt;-c&lt;/code&gt; takes them. The output is exactly what came back:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why the Project Is Called KvSQL</title>
      <link>https://kvsql.com/why-the-project-is-called-kvsql/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://kvsql.com/why-the-project-is-called-kvsql/</guid>
      <description>&lt;p&gt;The name is the design, spelled out. KV for key-value, SQL for SQL, written together because in this database they aren&amp;rsquo;t two systems glued side by side. They&amp;rsquo;re two ways into one store.&lt;/p&gt;&#xA;&lt;p&gt;The lower-case v is on purpose. Kv reads as one small syllable in front of the three letters everybody knows, and it keeps the name from turning into a row of capitals. Say it &amp;ldquo;K-V-S-Q-L&amp;rdquo;, or &amp;ldquo;kv sequel&amp;rdquo; if you prefer; both are fine.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
