Redis in SQLly: key editing, Cluster, Sentinel and more

Redis in SQLly now edits keys by type, shows stream consumer groups, completes commands, and connects to Cluster, Sentinel and Azure Redis with Entra.

By

The short version

SQLly's Redis support grew from a command editor with a key browser into a Redis workbench.

You can open a key and edit it by type, with the exact command shown before it runs. Streams show their consumer groups and the entries nobody acknowledged. Commands complete as you type. Connections reach Redis Cluster, Sentinel and Azure Redis with Entra sign-in. And Test Connection tells you which step failed. This post covers what is in the release, why we built it, what we proved, and what is still missing.

Why we built it

SQLly is for teams whose Redis sits next to their SQL databases: the session cache in front of PostgreSQL, the job queue beside SQL Server. Until now, Redis in SQLly was good for reading and watching: a command editor, a key browser, a profiler, a Pub/Sub viewer, a memory analyzer. But changing a hash field meant typing HSET by hand, and a cluster or a Sentinel deployment was out of reach. People kept a second Redis tool open for those jobs. This release is meant to close that gap.

We also read the public Redis Insight issue tracker. Redis Insight is the official tool and the deepest Redis GUI there is, and our comparison page says where it is still the better choice. But its reported issues are a good list of what goes wrong when a GUI meets a real Redis deployment, and several of them shaped the decisions below: a cluster reached through locally forwarded SSH ports failing with "Failed to refresh slots cache" (#6537), SSH tunnels dropping after sitting idle (#6292), a cloud import that lost its TLS settings and then failed with read ECONNRESET (#6019), a hash value of 00014 treated as a number (#6269), MessagePack timestamp decoding (#5540, fixed in Redis Insight 3.4.1), an incomplete cluster topology with TLS and hostnames (#5722), Entra ID behind a TLS-inspecting proxy (#6472), and a request for names on logical databases (#6437). Some of these are old and some are fixed. We cite them because they describe the problems clearly, not because Redis Insight still has them.

Read and change keys

Double-click a key in the explorer, or choose Open Value, and it opens in the key view. A header strip shows the key's type, TTL, encoding, memory and length. Below it the value loads 1,000 fields, elements, members or entries at a time, with a "showing N of M" count and Load more. Each type gets the edits it allows: Edit value… on a string (with KEEPTTL ticked when the key has an expiry), Add field… and Edit selected… on a hash, pushes and removes on a list, members on a set, scores on a sorted set, Edit document… on JSON. Every form shows the command it will run and updates it as you type. Nothing runs until you press Run. Read-only and locked production connections refuse the edit, and a connection that confirms data changes asks for a second click. Open in Query Tab still runs the type's read command in a tab if you prefer that.

Screenshot to comeredis-key-view-hash-edit.webp — the key view on a hash, with the header strip, the paged field grid, the selected field's value below it, and the Add field form showing the exact HSET above Run
The key view on a hash: the header strip, a page of fields, and the HSET the form will run.

Values are bytes from end to end. 00014 stays 00014, a twenty-digit id is never rounded, and a value that isn't valid text is shown and edited as hex. We'll go into how that was tested in the follow-up on byte-exact values.

A stream key opens with four tabs: Entries, Groups, Consumers and Pending. The Pending tab lists every delivered entry nobody acknowledged, with its owner, idle milliseconds and delivery count, so a consumer that died mid-batch is easy to spot. From there Claim selected… and Auto-claim… move its entries to a live consumer. Trimming a stream or destroying a group asks you to type the count or the group name first. The walkthrough is in finding a dead consumer.

Screenshot to comeredis-stream-pending-dead-consumer.webp — a stream's Pending tab for the workers group, with two entries held by consumer dead and their idle milliseconds growing
The Pending tab: the entries a dead consumer still holds, and how long they have waited.

A key's menu also has Rename…, Copy to Database… and Copy to Connection…. Folders and databases have Export Folder as Command File… and Export as Command File…. These write the keys as commands that Import Command File… runs back, with binary values escaped, so the round trip is byte-exact (see bulk actions). The value viewer now decodes gzip, zstd, LZ4, deflate, Base64, Protobuf (without a schema), PHP serialize, and Java and Python pickle summaries, in addition to UTF-8, JSON, hex and MessagePack. Auto mode recognises them by their leading bytes.

Write commands

Redis query tabs now have command IntelliSense. It completes command names, the options that still fit (after SET k v EX 10 it stops offering KEEPTTL), subcommands, and key names the explorer has already scanned. It gets its command list from the server's own COMMAND DOCS, so Stack modules and commands you loaded yourself complete too. Hovering a command shows its syntax and complexity with a Write, Destructive or Blocking badge, so you see what a line does before you run it. More in the IntelliSense post.

Screenshot to comeredis-intellisense-zrange-options.webp — the completion popup after ZRANGE k 0 -1 offering BYSCORE, BYLEX, REV, LIMIT and WITHSCORES, with signature help above the line
Completion follows the command's documented syntax, and signature help marks the argument you are typing.

Redis Stack replies come back as real grids: FT.SEARCH gives one row per document, TS.RANGE a timestamp column you can chart, and the JSON, Bloom, cuckoo, top-k, count-min, geo, stream-info and latency commands each get the columns their replies imply. On a server with the search module, each database gets an Indexes folder with Query…, Explain…, Profile… and a reviewed Drop Index….

Connect

  • Redis Cluster, including ElastiCache cluster mode and MemoryDB. Commands are routed by slot and MOVED/ASK redirects are followed. A node map rewrites announced addresses you can't dial, and each node gets its own SSH forward. The key browser, memory analyzer, bulk delete, Profiler and Pub/Sub viewer cover every master, and each live row names its node. The Cluster Topology… view has a per-node Trace. Details in Redis Cluster behind SSH.
  • Sentinel by master name, for Redis and Valkey, with a redis+sentinel:// URL and optional replica reads. After a failover a read-only script retries and a write script stops. Why: failover without double writes.
  • Microsoft Entra sign-in for Azure Cache for Redis and Azure Managed Redis. It uses the same Azure account as your Azure SQL connections and re-authenticates before the token expires.
  • RESP3 when the server offers it, with RESP2 as the fallback and results that look the same either way. Every connection names itself sqlly:<connection name>:<process id> so you can find it in CLIENT LIST. There is a command timeout (30 seconds by default), and timed-out commands are never re-run.
  • Test Connection step by step. It runs name lookup, tunnel or proxy, TCP, TLS, AUTH, HELLO/PING, SELECT and CLUSTER INFO, and the error starts with the step that failed: "TLS failed: …", "AUTH failed: …". See every step of Test Connection.
  • SSH keepalives every 30 seconds of silence. If the session drops anyway, a fresh tunnel opens on the next run, which says Tunnel re-established and re-runs nothing.
  • OS trust roots. Tick "Also trust the OS keychain roots" and a company CA installed on your machine verifies without a CA file. A CA file now adds to the built-in roots instead of replacing them.

Operate

  • Key events in the Pub/Sub viewer. The preset subscribes to every keyspace notification on a database and fills event and key columns. When notifications are off, the viewer offers Enable Key Events (KEA)… as a reviewed CONFIG SET.
  • Sharded Pub/Sub. Enter #orders and the viewer watches it with SSUBSCRIBE, on a cluster or a standalone Redis 7.
  • An ACL page in the Security tool. It lists every user and the recent denials, and writes changes as reviewed ACL SETUSER scripts with passwords as hashes.
  • Database names. Right-click a database, choose Rename…, and it shows as db3 — sessions. Show Only Databases… hides the empty ones. Both are kept on your machine and never change the server.
  • An honest key browser. A walk stops at 10,000 keys and the tree draws 2,000 rows. One note row says which cut applied: "Showing 2,000 of 7,350 rows from 10,000 scanned keys; the SCAN stopped there". Scan more continues the same scan. The pattern you filter a database with is remembered for that database, Filter Keys… offers your last five patterns, and Clear Key Filter shows everything again.
  • Stoppable counts. The bulk dry-run count and the memory analyzer's sample both have a Stop button. A stopped count is labelled partial, and the action touches only the keys it listed.
Screenshot to comeredis-key-browser-note-row.webp — a database with more than 10,000 keys expanded in the explorer, the note row at the bottom reading "Showing 2,000 of … rows from 10,000 scanned keys; the SCAN stopped there" with its menu open on Load more and Scan more
One note row says what you are seeing of a long listing, and how to see more.

Move in

Import From Other Tools… now reads Redis Insight database exports, plain or base64. Each database becomes a Redis connection with its host, port, database, user, SSH tunnel and TLS settings. TLS is never dropped. Certificates are saved as files only you can read, and passwords go to your system keychain. Entra databases come over with Entra sign-in, cluster databases as Redis Cluster connections, and Sentinel databases as Sentinel connections. Delete the export afterwards, because it holds passwords in clear text (importing from Redis Insight).

Screenshot to comeredis-import-redis-insight-summary.webp — the connection list after importing a Redis Insight export, with the new standalone, TLS, cluster and Sentinel connections and the import summary in the status bar
A Redis Insight export after import: one connection per database, TLS kept, secrets in the keychain.

The deep dives

This post is the map. Six follow-ups each take one part of the release and explain the decisions behind it:

If you would rather skim, the Redis page has the whole tour, Cluster and Sentinel covers high-availability setups, and the Valkey page says what works on Valkey and the other Redis-compatible servers.

What we proved

A live suite pushes the values a numeric conversion would mangle through the command editor, the key browser, a hash read and the Pub/Sub viewer: 00014, the empty string, a NUL byte, invalid UTF-8, a 40-digit integer, 1e309, and 100 KB and 2 MB strings. It checks that the same bytes come back as text and never as a number. The suite passed on Redis 7, Redis Stack, Valkey 8, KeyDB and DragonflyDB, and the three TLS modes passed against a TLS-only server. CSV, JSON, Excel and SQL exports write those values as text too.

Then we timed the tools on a database of 1,000,000 keys (SET wsl:<n> with a 20-byte value, Redis 7.4.11 in a loopback container on Apple Silicon):

0.069 skey browser listing its 10,000-key limit
0.342 sworst case: a pattern nothing matches, whole keyspace walked
0.436 smemory analyzer, maximum 50,000-key sample

The bulk dry run listed its cap of 25,001 keys in 0.133 s, and the default 1,000-key memory sample took 0.009 s. These are loopback numbers. A remote server adds one round trip per 1,000-key SCAN page and per 200-key MEMORY USAGE chunk. Every path has a cap and says when it hit it. The matrix in that report was recorded before cluster routing and Sentinel landed. Those two have their own opt-in live tests against a local three-master cluster and a three-sentinel fixture, and they are not part of the timings above.

What is not done

  • No live test yet against Azure Managed Redis, ElastiCache or MemoryDB. Entra sign-in was tested with a scripted identity provider and a local Redis standing in for the cache.
  • The Profiler and the RESP2 Pub/Sub fallback don't re-authenticate Entra mid-capture. They end when their token expires.
  • KeyDB has no COMMAND DOCS, so completion there uses the bundled Redis 7.4 snapshot. DragonflyDB refuses notify-keyspace-events, so key events can't be turned on there.
  • No vector-set editor, and no index-creation wizard or saved-query library for Search.
  • Sentinel profiles refuse SSH tunnels, proxies and relay routes.
  • On a cluster, cross-slot multi-key commands, SELECT of anything but 0, KEYS, SCAN and MULTI/EXEC are refused, with a message naming the rule.

Everything above is in the current build. Download SQLly, paste a redis:// URL, and double-click a key. The Redis docs cover each tool.