<?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: hepengju</title>
    <description>The latest articles on DEV Community by hepengju (@hepengju).</description>
    <link>https://dev.to/hepengju</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%2F4218357%2F13962064-2c3a-4722-b41f-2eacd1b8016b.png</url>
      <title>DEV Community: hepengju</title>
      <link>https://dev.to/hepengju</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hepengju"/>
    <language>en</language>
    <item>
      <title>I Rebuilt a Redis GUI on Tauri. The Installer Is 7.9 MB. Here's What It Cost Me.</title>
      <dc:creator>hepengju</dc:creator>
      <pubDate>Sat, 31 Oct 2026 14:38:14 +0000</pubDate>
      <link>https://dev.to/hepengju/i-rebuilt-a-redis-gui-on-tauri-the-installer-is-79-mb-heres-what-it-cost-me-3pod</link>
      <guid>https://dev.to/hepengju/i-rebuilt-a-redis-gui-on-tauri-the-installer-is-79-mb-heres-what-it-cost-me-3pod</guid>
      <description>&lt;p&gt;I keep three Redis GUIs installed: Another Redis Desktop Manager, TinyRDM, and the official RedisInsight. Two of the three are Electron, and those are the heavy ones: ARDM's Windows installer is 59 MB and it sits at 230 MB RSS on my machine once connected; the official RedisInsight is Electron too — its Windows installer is 110 MB. TinyRDM, which uses the system WebView just like Tauri does (Wails and Go), needs only 13 MB. The gap between those lines is what this post is about: not WebView versus no WebView, but bundling Chromium versus not.&lt;/p&gt;

&lt;p&gt;You do not have to take my word for any of it. Installer sizes are straight from each project's GitHub Releases asset list (Windows x64, latest version at the time of writing):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Client&lt;/th&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Installer (Windows x64)&lt;/th&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RedisME&lt;/td&gt;
&lt;td&gt;Tauri (system WebView)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7.9 MB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;v5.6.0, 2026-10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TinyRDM&lt;/td&gt;
&lt;td&gt;Wails (system WebView)&lt;/td&gt;
&lt;td&gt;13 MB&lt;/td&gt;
&lt;td&gt;v1.2.7, 2026-03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Another Redis Desktop Manager&lt;/td&gt;
&lt;td&gt;Electron&lt;/td&gt;
&lt;td&gt;59 MB&lt;/td&gt;
&lt;td&gt;v1.7.4, 2026-08&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RedisInsight&lt;/td&gt;
&lt;td&gt;Electron&lt;/td&gt;
&lt;td&gt;110 MB&lt;/td&gt;
&lt;td&gt;3.8.0, 2026-07&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On a 32 GB machine where Docker and an IDE already claim their share, that is a bill I got tired of paying.&lt;/p&gt;

&lt;p&gt;So I wrote &lt;a href="https://github.com/hepengju/redis-me" rel="noopener noreferrer"&gt;RedisME&lt;/a&gt; on Tauri instead. This is the honest version of that decision: what I gained, what it cost, and which numbers you should not trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  First: Electron's bill is not waste
&lt;/h2&gt;

&lt;p&gt;Electron is large because it &lt;strong&gt;bundles an entire Chromium and a Node runtime&lt;/strong&gt;. That is also its best feature:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rendering is identical everywhere.&lt;/strong&gt; Windows, Ubuntu 18.04, CentOS 7 — same pixels. You never think about the host's WebView version.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The ecosystem is mature.&lt;/strong&gt; Any frontend library, any Node module, works.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging is familiar.&lt;/strong&gt; DevTools is right there.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For commercial software that must look identical on every customer machine, those guarantees are worth 200 MB.&lt;/p&gt;

&lt;p&gt;But a Redis GUI does not need them. It runs on your workstation, next to Docker and an IDE — not on a fleet of customer machines that must render identically. Its interface complexity is a fraction of an IDE's.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When consistency is not your core constraint, the size and memory you pay for it is pure cost.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Tauri actually changes
&lt;/h2&gt;

&lt;p&gt;Tauri inverts the model: &lt;strong&gt;do not bundle a browser, use the one the OS already has.&lt;/strong&gt;&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;Electron&lt;/th&gt;
&lt;th&gt;Tauri&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Renderer&lt;/td&gt;
&lt;td&gt;bundled Chromium&lt;/td&gt;
&lt;td&gt;system WebView (WebView2 / WKWebView / WebKitGTK)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Installer (Windows x64)&lt;/td&gt;
&lt;td&gt;59 MB (ARDM v1.7.4) · 110 MB (RedisInsight 3.8.0)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;7.9 MB&lt;/strong&gt; (v5.6.0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Idle RSS&lt;/td&gt;
&lt;td&gt;200 MB+&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;~100 MB&lt;/strong&gt; (my machine, one connection)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The installer size is the honest, reproducible win: you are not shipping Chromium, so you do not ship its tens of megabytes. Download the release and check the file size yourself — it is the easiest claim in this article to verify. For the record: the macOS dmg is ~11 MB and the Linux deb ~13 MB. (The Linux AppImage is bigger — it bundles the WebKit libraries so it runs anywhere, which is a different tradeoff.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faaybs3jwk4elou1ld78v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faaybs3jwk4elou1ld78v.png" alt=" " width="800" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am going to hedge on the memory number, because everyone overstates it. &lt;strong&gt;100 MB is what I measured on Windows, one connection, empty key view.&lt;/strong&gt; Different OS, different WebView build, larger datasets — all of it moves the number. Do not treat it as a spec sheet.&lt;/p&gt;

&lt;p&gt;The difference you &lt;em&gt;feel&lt;/em&gt; is cold start. On my machine, double-click to usable is under two seconds — there is no Chromium bootstrap in the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it cost me
&lt;/h2&gt;

&lt;p&gt;This is the part most "Tauri vs Electron" posts skip.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Three rendering engines, not one
&lt;/h3&gt;

&lt;p&gt;WebView2 is Chromium. WKWebView is Safari's engine. WebKitGTK is a third thing. The same CSS can behave differently on all three.&lt;/p&gt;

&lt;p&gt;Bugs I have personally shipped and fixed because of this: fake-bold and blurry font rendering on Linux (WebKitGTK synthesizes font weights; the fix is a dedicated &lt;code&gt;html[data-platform='linux']&lt;/code&gt; patch with &lt;code&gt;font-synthesis: none&lt;/code&gt; and antialiased smoothing — the same workaround Yaak and JetPilot ship), macOS titlebar padding that differs across system versions (new macOS releases have bigger corner radii), and a macOS terminal right-click paste permission error that ended with switching to the Tauri clipboard plugin. None of these are Tauri's fault — they are the direct consequence of "use the system WebView."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If your UI depends on pixel-precise layout and animation, Tauri will eat your schedule in platform adaptation.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The build chain is longer
&lt;/h3&gt;

&lt;p&gt;Vue + Element Plus on the front, Rust on the back. Change a line of Rust and you wait for a recompile. Shipping requires the Rust toolchain plus per-platform signing and notarization — macOS notarization in particular is its own afternoon.&lt;/p&gt;

&lt;p&gt;For a solo maintainer, the release cadence is partly set by the build pipeline, not just by how fast you code.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Linux users must install dependencies
&lt;/h3&gt;

&lt;p&gt;WebKitGTK is not present on every distro. A first run on Linux may mean installing &lt;code&gt;libwebkit2gtk&lt;/code&gt; and friends. On Windows, WebView2 is effectively a system component now (bundled on 11, mostly delivered via Edge updates on 10), so it is a non-issue there.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Fewer ready-made wheels
&lt;/h3&gt;

&lt;p&gt;In Electron, "show a native file dialog" is one line. In Tauri it is a plugin, and version mismatches are a real failure mode. Small frictions, but they accumulate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two UI decisions, and what they cost
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Read-only mode deletes the buttons
&lt;/h3&gt;

&lt;p&gt;The alternative is to keep every button and pop a "you are in read-only mode" confirmation. More complete, functionally.&lt;/p&gt;

&lt;p&gt;I chose the aggressive version: &lt;strong&gt;in read-only mode, every mutating control disappears from the UI.&lt;/strong&gt; Unlock with the padlock in the top bar.&lt;/p&gt;

&lt;p&gt;The reasoning: when you are debugging production, every clickable element is a decision you have to make. "Will clicking this change data?" Removing the buttons removes the question.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo372em0vqz10g303ro44.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo372em0vqz10g303ro44.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgbm6ruxdfnis30n32mvd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgbm6ruxdfnis30n32mvd.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The cost is real too: &lt;strong&gt;new users take a while to find delete.&lt;/strong&gt; It is documented, but the muscle memory of "buttons are always there" works against it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multiple connections in windows, not tabs
&lt;/h3&gt;

&lt;p&gt;Tabs are more popular and tidier in the taskbar.&lt;/p&gt;

&lt;p&gt;I use windows because of one workflow: &lt;strong&gt;comparing the same key across two clusters.&lt;/strong&gt; Two windows sit side by side on two monitors, or split half-and-half. With tabs you switch back and forth and have to remember what the other one showed.&lt;/p&gt;

&lt;p&gt;Cost: a messy taskbar. Neither choice is correct — it depends on whether your day is "many operations on one database" or "the same operation across several."&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this thing is actually differentiated
&lt;/h2&gt;

&lt;p&gt;Three features I would point at, rather than a feature list:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Runtime config diff against version defaults.&lt;/strong&gt; Pull &lt;code&gt;CONFIG GET *&lt;/code&gt;, compare against Redis 6/7/8 defaults, highlight the differences. When you are asking "why does this node behave differently from the others," this is the only entry point that works. Cluster config drift is a genuinely nasty failure mode: &lt;code&gt;CONFIG SET&lt;/code&gt; applies to one node, a failover happens a year later, and behavior changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Codecs for non-UTF-8 values, taken past "it decodes".&lt;/strong&gt; RedisInsight and ARDM both read Java serialization (same library I use), so the difference is the layer after: &lt;code&gt;java.time&lt;/code&gt; / records / collections rendered as JSON, per-field codec selection on Hash/List/Set/ZSet, and an external script hook (Python/Node/Java) exposing &lt;code&gt;decode&lt;/code&gt; and &lt;code&gt;encode&lt;/code&gt; for in-house formats. Your codec logic stays in your repo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Cluster command broadcast &lt;em&gt;and&lt;/em&gt; node targeting.&lt;/strong&gt; In the terminal, &lt;code&gt;CONFIG SET&lt;/code&gt; can broadcast to every node or run on one specific node. Cluster operations need both; most clients implement one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who should use it, who should not
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Good fit:&lt;/strong&gt; memory-constrained machines, multiple simultaneous connections, internal/production clusters behind SSH tunnels, Java services storing serialized objects, people who care about cold start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bad fit:&lt;/strong&gt; software that must render identically on old customer machines; complex custom UI with heavy animation; single-database CRUD where tabs beat windows; anything needing a Redis module I have not implemented.&lt;/p&gt;

&lt;p&gt;That last point deserves emphasis. &lt;strong&gt;RedisME has 129 stars. Another Redis Desktop Manager has 34.8K, TinyRDM has 13.1K.&lt;/strong&gt; On ecosystem maturity, edge-case coverage, and community responsiveness, they are better. That is not modesty, it is a fact you should factor into your choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;GPL-3.0, fully open source, Windows / macOS / Linux, x64 and arm64.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://www.hepengju.com/en/" rel="noopener noreferrer"&gt;https://www.hepengju.com/en/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/hepengju/redis-me?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=tauri" rel="noopener noreferrer"&gt;https://github.com/hepengju/redis-me?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=tauri&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://www.hepengju.com/en/guide/intro/about.html" rel="noopener noreferrer"&gt;https://www.hepengju.com/en/guide/intro/about.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am not asking anyone to switch. I am pointing out that if "three GUI windows ate my RAM" is a problem you have, a 7.9 MB option now exists.&lt;/p&gt;

</description>
      <category>tauri</category>
      <category>electron</category>
      <category>rust</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Why Your Redis Values Look Like Garbage in Every GUI (and How to Fix It)</title>
      <dc:creator>hepengju</dc:creator>
      <pubDate>Sat, 31 Oct 2026 14:05:51 +0000</pubDate>
      <link>https://dev.to/hepengju/why-your-redis-values-look-like-garbage-in-every-gui-and-how-to-fix-it-47ic</link>
      <guid>https://dev.to/hepengju/why-your-redis-values-look-like-garbage-in-every-gui-and-how-to-fix-it-47ic</guid>
      <description>&lt;p&gt;You connect your Redis GUI to the database your service writes to. You click a key. You get this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\xac\xed\x00\x05sr\x00\x1dcom.example.order.OrderDetail\x00\x00\x00...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, depending on the client, a wall of &lt;code&gt;�&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzo2abvhdwlytbrb4pi4z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzo2abvhdwlytbrb4pi4z.png" alt=" " width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F06ly8bvsx8blf8omio8r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F06ly8bvsx8blf8omio8r.png" alt=" " width="799" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is not a bug in Redis and it is not a broken client. It is a serialization problem — and the real problem is not that nobody supports it. &lt;strong&gt;Most clients do.&lt;/strong&gt; RedisInsight has shipped a Java serialized objects formatter since 2.10 (September 2022), Another Redis Desktop Manager has a &lt;code&gt;JavaSerialize&lt;/code&gt; viewer, and both use the same library I do (&lt;code&gt;java-object-serialization&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;The problem is that the default is still UTF-8, you have to know the feature exists to switch, and &lt;strong&gt;what you get after switching differs a lot between clients.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I maintain &lt;a href="https://github.com/hepengju/redis-me" rel="noopener noreferrer"&gt;RedisME&lt;/a&gt;, an open-source Redis GUI. This post covers four things: why the bytes look like that, why the usual workarounds hurt, why "supported" and "usable" are different claims, and what to do with formats nobody ships a decoder for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Redis stores bytes. Types are your client's problem.
&lt;/h2&gt;

&lt;p&gt;RESP is binary-safe. &lt;code&gt;SET foo bar&lt;/code&gt; stores three bytes — &lt;code&gt;0x62 0x61 0x72&lt;/code&gt;. &lt;code&gt;GET foo&lt;/code&gt; returns those three bytes. Redis has no idea what they mean.&lt;/p&gt;

&lt;p&gt;So when a Java service writes an &lt;code&gt;OrderDetail&lt;/code&gt; object, what actually happens is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Spring Data Redis' default, effectively&lt;/span&gt;
&lt;span class="nc"&gt;RedisSerializer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;serializer&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;JdkSerializationRedisSerializer&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;serializer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;serialize&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orderDetail&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;JdkSerializationRedisSerializer&lt;/code&gt; goes through &lt;code&gt;ObjectOutputStream&lt;/code&gt;, which emits a stream starting with a fixed magic number:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bytes&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0xAC 0xED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;STREAM_MAGIC&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x00 0x05&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;STREAM_VERSION&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That is your &lt;code&gt;\xac\xed\x00\x05&lt;/code&gt;. It is a perfectly valid Java serialization stream, and it is an illegal UTF-8 byte sequence. By default, a GUI just decodes as UTF-8:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bytes -&amp;gt; decode as UTF-8 -&amp;gt; fail -&amp;gt; print � or \xNN -&amp;gt; done
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is not laziness. Doing it properly needs format detection, a runtime that can deserialize, and handling for every case where deserialization fails. So the capability is usually &lt;strong&gt;built in but off by default&lt;/strong&gt; — you have to know it exists and remember to switch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five serializers, five kinds of garbage
&lt;/h2&gt;

&lt;p&gt;Java teams do not have one way to write objects to Redis. They have at least five, and each produces completely different bytes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Serializer&lt;/th&gt;
&lt;th&gt;Where you see it&lt;/th&gt;
&lt;th&gt;What's stored&lt;/th&gt;
&lt;th&gt;GUI shows&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;JdkSerializationRedisSerializer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Spring Data Redis default&lt;/td&gt;
&lt;td&gt;binary stream, starts &lt;code&gt;AC ED 00 05&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;garbage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;StringRedisSerializer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;manual &lt;code&gt;toString()&lt;/code&gt; / JSON strings&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"id":10086,...}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;readable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Jackson2JsonRedisSerializer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;explicit config&lt;/td&gt;
&lt;td&gt;JSON text&lt;/td&gt;
&lt;td&gt;readable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GenericJackson2JsonRedisSerializer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JSON with &lt;code&gt;@class&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"@class":"com...","id":...}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;readable, with type noise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redisson &lt;code&gt;Codec&lt;/code&gt; (Kryo / FST / Marshalling / JSON)&lt;/td&gt;
&lt;td&gt;Redisson client&lt;/td&gt;
&lt;td&gt;custom binary header&lt;/td&gt;
&lt;td&gt;garbage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protobuf / Hessian / in-house&lt;/td&gt;
&lt;td&gt;custom RPC stacks&lt;/td&gt;
&lt;td&gt;binary&lt;/td&gt;
&lt;td&gt;garbage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One table explains a lot of confusion. &lt;strong&gt;The moment a team migrates serializers, or runs Spring Data Redis and Redisson side by side, the same database holds multiple formats at once.&lt;/strong&gt; And the default dropdown still says UTF-8.&lt;/p&gt;

&lt;p&gt;Worse, many developers do not know which serializer their &lt;code&gt;RedisTemplate&lt;/code&gt; uses, because someone else configured it three years ago and it was injected with &lt;code&gt;@Autowired&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three workarounds, and why they hurt
&lt;/h2&gt;

&lt;p&gt;If clients support this, why do people still do it? Because it is off by default, because plenty of developers do not know the feature exists, and because not every client ships it — TinyRDM's built-in decoders cover Base64/GZip/Msgpack/PHP/Pickle but not Java, so you wire up an external command; RESP.app has no Java formatter at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. &lt;code&gt;redis-cli --raw&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;redis-cli &lt;span class="nt"&gt;-h&lt;/span&gt; 10.0.0.1 &lt;span class="nt"&gt;--raw&lt;/span&gt; get order:10086
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--raw&lt;/code&gt; only turns off redis-cli's output escaping. The bytes are unchanged. You get unprintable characters, and on some terminals you will need to &lt;code&gt;reset&lt;/code&gt; afterwards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. A throwaway &lt;code&gt;main&lt;/code&gt; method&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readAllBytes&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Paths&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"dump.bin"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;o&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;ObjectInputStream&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;ByteArrayInputStream&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="o"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;readObject&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;JSON&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toJSONString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works. The workflow is: copy Base64 out of the GUI, save to a file, base64-decode, run Java, read output. Five steps to look at one key. And &lt;code&gt;readObject&lt;/code&gt; needs the class on the classpath, so you will spend most of your time fighting &lt;code&gt;ClassNotFoundException&lt;/code&gt; in a scratch project that does not have your domain classes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. &lt;code&gt;DUMP&lt;/code&gt; + an online decoder&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;DUMP&lt;/code&gt; output includes an RDB version header and a CRC64 checksum — it is not the same as the raw &lt;code&gt;GET&lt;/code&gt; bytes. And pasting production data into a third-party website is not a tradeoff worth discussing.&lt;/p&gt;

&lt;p&gt;All three share the same flaw: &lt;strong&gt;they turn a two-second "let me look at this value" into a cross-tool, cross-process workflow.&lt;/strong&gt; When you are debugging, you need to click through five keys and confirm they share a structure. Any approach that requires switching windows has already failed at that job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supported is not the same as usable
&lt;/h2&gt;

&lt;p&gt;Let me be precise about what already exists. RedisInsight has had a Java formatter since 2.10, ARDM has a &lt;code&gt;JavaSerialize&lt;/code&gt; viewer, and both are built on &lt;code&gt;java-object-serialization&lt;/code&gt; — the same library RedisME uses. Nobody has a monopoly here.&lt;/p&gt;

&lt;p&gt;So the interesting question is not "does it decode". It is &lt;strong&gt;what you get after it decodes&lt;/strong&gt;, and how many steps stand between you and the answer. That is where implementations drift apart.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 1 — built-in codecs
&lt;/h3&gt;

&lt;p&gt;Next to UTF-8 / Base64 / Hex, RedisME ships three decoders in the &lt;strong&gt;Data Encoding&lt;/strong&gt; dropdown:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JavaSerial&lt;/strong&gt; — JDK serialization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pickle&lt;/strong&gt; — Python &lt;code&gt;pickle&lt;/code&gt;, protocols 0–5&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PhpSerial&lt;/strong&gt; — PHP &lt;code&gt;serialize()&lt;/code&gt; text&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frtkulptfzmwavj1rn7bl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frtkulptfzmwavj1rn7bl.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The library solves "can we read the bytes". What the value &lt;em&gt;looks like&lt;/em&gt; afterwards is written by each client, and that layer is where the work is:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Case&lt;/th&gt;
&lt;th&gt;Raw deserialization output&lt;/th&gt;
&lt;th&gt;What I render&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;LocalDateTime&lt;/code&gt; / &lt;code&gt;Instant&lt;/code&gt; / &lt;code&gt;Duration&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;nested &lt;code&gt;{seconds, nanos}&lt;/code&gt; or epoch numbers&lt;/td&gt;
&lt;td&gt;readable timestamps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 16+ &lt;code&gt;record&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;fields fetched reflectively, often incomplete&lt;/td&gt;
&lt;td&gt;expanded JSON by field&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ArrayList&lt;/code&gt; / &lt;code&gt;HashMap&lt;/code&gt; / &lt;code&gt;TreeSet&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;toString()&lt;/code&gt;-ish &lt;code&gt;[a, b, c]&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;arrays and objects, collapsible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;very large values&lt;/td&gt;
&lt;td&gt;the whole thing dumped into the page&lt;/td&gt;
&lt;td&gt;truncated preview, downloadable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;There is also a structural difference: &lt;strong&gt;Hash / List / Set / ZSet support per-field codec selection.&lt;/strong&gt; Open the field editor and pick a codec for one field; if the magic number matches, it preselects it. Some clients apply one formatter to the &lt;em&gt;entire key value&lt;/em&gt;, which does not help when a hash holds mixed formats.&lt;/p&gt;

&lt;p&gt;Pickle maps &lt;code&gt;dict&lt;/code&gt; / &lt;code&gt;list&lt;/code&gt; / &lt;code&gt;set&lt;/code&gt; / &lt;code&gt;bytes&lt;/code&gt; to JSON, and objects carrying &lt;code&gt;$class&lt;/code&gt; / &lt;code&gt;$type&lt;/code&gt; are viewable. PhpSerial keeps the class name as &lt;code&gt;$class&lt;/code&gt; for &lt;code&gt;O:&lt;/code&gt; instances and handles nesting (references via &lt;code&gt;R:&lt;/code&gt; / &lt;code&gt;r:&lt;/code&gt; are not supported).&lt;/p&gt;

&lt;p&gt;All three are &lt;strong&gt;read-only&lt;/strong&gt; — more on why below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fytbfnr1f4jy8zzg0prgj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fytbfnr1f4jy8zzg0prgj.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 2 — auto-detection
&lt;/h3&gt;

&lt;p&gt;Select &lt;code&gt;Auto&lt;/code&gt; and the client walks the built-in decoders, matching on magic numbers rather than guessing. &lt;code&gt;AC ED&lt;/code&gt; is unambiguously a Java stream; &lt;code&gt;O:&lt;/code&gt; + trailing &lt;code&gt;;&lt;/code&gt; is almost certainly PHP serialize. That keeps false positives out of ordinary strings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 3 — custom codec scripts
&lt;/h3&gt;

&lt;p&gt;This is where the real problems live: in-house binary protocols, compressed JSON, AES-encrypted values, your company's own serialization framework.&lt;/p&gt;

&lt;p&gt;RedisME delegates the work to an external script over a minimal stdin/stdout contract:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# read: Redis raw bytes (base64) -&amp;gt; text shown in the editor&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;your &lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; decode &lt;span class="o"&gt;{&lt;/span&gt;wire_base64&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# write: editor text -&amp;gt; Redis raw bytes (base64)&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;your &lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; encode &lt;span class="o"&gt;{&lt;/span&gt;editor_text_utf8_base64&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# when base64 exceeds 8000 chars (Windows command-line limits)&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;your &lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; decode &lt;span class="nt"&gt;--stdin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Direction&lt;/th&gt;
&lt;th&gt;arg 1&lt;/th&gt;
&lt;th&gt;arg 2&lt;/th&gt;
&lt;th&gt;stdout&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;decode&lt;/td&gt;
&lt;td&gt;&lt;code&gt;decode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;base64 of Redis raw bytes&lt;/td&gt;
&lt;td&gt;UTF-8 text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;encode&lt;/td&gt;
&lt;td&gt;&lt;code&gt;encode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;base64 of editor text (UTF-8)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;single line&lt;/strong&gt; of base64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;large payload&lt;/td&gt;
&lt;td&gt;same&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--stdin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;same&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On failure, write to &lt;code&gt;stderr&lt;/code&gt; and exit non-zero. The client surfaces &lt;strong&gt;the exact command it ran&lt;/strong&gt; in the error dialog — which has saved me more times than I can count, because the cause is nearly always a space in a path or an interpreter missing from &lt;code&gt;PATH&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The client ships templates for Python, Node, and Java. Export one, and you only edit two functions:&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Redis raw bytes -&amp;gt; text for the editor&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;binascii&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hexlify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ascii&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# replace with your logic
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;editor text -&amp;gt; Redis raw bytes&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;binascii&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unhexlify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;        &lt;span class="c1"&gt;# replace with your logic
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your codec logic stays in your own repository. The GUI only shells out to it — which matters if you have compliance constraints, because it means you never hand private keys or an internal protocol to a third-party tool.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7kv1ed7gvyeqzxfx42ud.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7kv1ed7gvyeqzxfx42ud.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One trap:&lt;/strong&gt; the bundled hex template "succeeds" on any input, because every byte sequence converts to hex. If you tick &lt;strong&gt;Auto detect&lt;/strong&gt; on it, it will claim every value in the database and you will think the client is broken. Only auto-detect the codec you actually use, and make its &lt;code&gt;decode&lt;/code&gt; throw when the format does not match.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three design decisions worth explaining
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Switching encodings never re-queries Redis.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;STRING / Hash / List / Set / ZSet are transferred over IPC as base64 wire, always. The Data Encoding dropdown only changes &lt;em&gt;presentation&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Why it matters: an &lt;code&gt;HGETALL&lt;/code&gt; on a production hash can be tens of megabytes. Re-fetching on every dropdown change is not "switching views", it is DDoSing your own database. And the lag you would feel makes you stop exploring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Large payloads go through stdin, not argv.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Windows caps a command line at 32767 characters. The protocol switches to &lt;code&gt;--stdin&lt;/code&gt; at 8000 base64 characters — deliberately below the ceiling, because paths, arguments, and environment variables all consume the budget.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The built-in codecs are read-only on purpose.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Writing back means fully reconstructing a valid serialization stream: class version UIDs, field order, circular references. Deserialization is best-effort; serialization must be exactly right. A bad write leaves you with a key that no service can read — significantly worse than not being able to read it yourself.&lt;/p&gt;

&lt;p&gt;For write-back, use a custom codec script with your local &lt;code&gt;java&lt;/code&gt; / &lt;code&gt;python&lt;/code&gt; / &lt;code&gt;php&lt;/code&gt;. Your runtime, your correctness. I think that boundary should be explicit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations, stated plainly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No write-back through the three built-in decoders.&lt;/li&gt;
&lt;li&gt;Custom codec scripts time out at 5 seconds by default — not the place for heavy inference.&lt;/li&gt;
&lt;li&gt;Auto-detection only works on formats with a recognizable magic number.&lt;/li&gt;
&lt;li&gt;Stream and JSON types have the encoding dropdown disabled; their handling differs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you look at a value once a month, &lt;code&gt;redis-cli&lt;/code&gt; plus a scratch &lt;code&gt;main&lt;/code&gt; method is fine. If your day is spent confirming what eight Java services wrote into the same key, this saves hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;RedisME is a cross-platform Redis GUI built with Tauri (Rust + system WebView), GPL-3.0, under 10 MB, for Windows / macOS / Linux.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://www.hepengju.com/en/" rel="noopener noreferrer"&gt;https://www.hepengju.com/en/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/hepengju/redis-me?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=codec" rel="noopener noreferrer"&gt;https://github.com/hepengju/redis-me?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=codec&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Codec docs: &lt;a href="https://www.hepengju.com/en/guide/usage/codec.html" rel="noopener noreferrer"&gt;https://www.hepengju.com/en/guide/usage/codec.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have hit this problem, I would genuinely like to know which serializer your team uses — I want to find the ones I have not covered yet.&lt;/p&gt;

</description>
      <category>redis</category>
      <category>java</category>
      <category>opensource</category>
      <category>database</category>
    </item>
  </channel>
</rss>
