<?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: Jun</title>
    <description>The latest articles on DEV Community by Jun (@redisviewer).</description>
    <link>https://dev.to/redisviewer</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%2F4103857%2F8634c067-32e0-4910-a999-8625af684585.png</url>
      <title>DEV Community: Jun</title>
      <link>https://dev.to/redisviewer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/redisviewer"/>
    <language>en</language>
    <item>
      <title>How I stopped Redis GUIs from freezing on 10M+ keys</title>
      <dc:creator>Jun</dc:creator>
      <pubDate>Thu, 03 Sep 2026 02:54:01 +0000</pubDate>
      <link>https://dev.to/redisviewer/how-i-stopped-redis-guis-from-freezing-on-10m-keys-5ggl</link>
      <guid>https://dev.to/redisviewer/how-i-stopped-redis-guis-from-freezing-on-10m-keys-5ggl</guid>
      <description>&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%2Fn84ah5984vddi7qsoa08.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%2Fn84ah5984vddi7qsoa08.png" alt="Service Monitoring" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Production Redis with tens of millions of &lt;strong&gt;keys&lt;/strong&gt;. Open a GUI → freeze, RAM spike, or crash. Open a large hash/zset → the same freeze if the client tries to load every member at once.&lt;/p&gt;

&lt;p&gt;I hit this enough times that I rebuilt the loading path. The result is &lt;strong&gt;RedisViewer&lt;/strong&gt;, a local Redis desktop client built first for developers: load the keys you asked for, keep the UI virtualized, and confirm before touching large production databases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Loading vs rendering
&lt;/h2&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%2Fssi74stqnsxm9p81wp5y.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%2Fssi74stqnsxm9p81wp5y.png" alt="Memory usage" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most Redis GUIs mix two problems together: &lt;strong&gt;how keys are fetched&lt;/strong&gt;, and &lt;strong&gt;how every row is painted&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;RedisViewer splits them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Load what you asked for.&lt;/strong&gt; Via ScanConfig (default pattern &lt;code&gt;*&lt;/code&gt;), it uses Redis &lt;code&gt;SCAN&lt;/code&gt; and loads the full target key set. That is the R&amp;amp;D-friendly path — see the whole filtered result without endless "load more."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confirm on large DBs.&lt;/strong&gt; If &lt;code&gt;DBSIZE&lt;/code&gt; ≥ 100,000 (configurable; "SCAN skip confirm"), it asks before loading.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never render what you can't see.&lt;/strong&gt; The key list is virtualized, so a large result set does not mean millions of UI nodes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Large hashes / sets / zsets are separate: members load in chunks, so a fat collection does not freeze the window with one full dump.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core bet:&lt;/strong&gt; smooth browsing on huge instances, without a huge memory bill — full target load for debugging, safety gate for production-sized DBs, virtualized UI either way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Value debugging for Java stacks
&lt;/h2&gt;

&lt;p&gt;If you run Java services, Redis values are often not plain strings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Java JDK serialization&lt;/strong&gt; — open serialized objects without a one-off decoder&lt;br&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%2F0uhg7ar35trh9wgh1dcx.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%2F0uhg7ar35trh9wgh1dcx.png" alt="Java value viewer" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Escape / control characters&lt;/strong&gt; — see and edit translated/escaped bytes visually&lt;br&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%2Fpxsdqhcx8lv0m9gmttvh.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%2Fpxsdqhcx8lv0m9gmttvh.png" alt="Escape characters" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Jackson / Fastjson polymorphic JSON&lt;/strong&gt; — inspect and edit structured polymorphic JSON&lt;br&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%2Foznalcucdg67rvdppl1p.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%2Foznalcucdg67rvdppl1p.png" alt="Jackson / Fastjson polymorphic JSON" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Performance analysis in one local workflow
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SlowLog&lt;/strong&gt; — find slow commands&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BigKey&lt;/strong&gt; — locate oversized keys when memory climbs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HotKey&lt;/strong&gt; — short MONITOR sampling for hot keys / high-frequency commands&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MONITOR&lt;/strong&gt; — live command stream for short diagnostics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Command stats&lt;/strong&gt; — separate business load from monitor/connection noise&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start from CPU, memory, commands, or cache-hit trends, then drill down — without shipping Redis data to a hosted dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Local-first, free, cross-platform
&lt;/h2&gt;

&lt;p&gt;Credentials stay local (encrypted); optional WebDAV sync is for connection profiles only. Keys and values are not uploaded.&lt;/p&gt;

&lt;p&gt;Free. Windows / macOS / Linux.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://redisviewer.com" rel="noopener noreferrer"&gt;https://redisviewer.com&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Feedback welcome: What usually kills your current GUI first — key list, large collections, or memory?&lt;/p&gt;

</description>
      <category>redis</category>
      <category>devtools</category>
      <category>performance</category>
      <category>gui</category>
    </item>
  </channel>
</rss>
