diff --git a/apps/desktop/src/components/redis/RedisDashboard.vue b/apps/desktop/src/components/redis/RedisDashboard.vue
new file mode 100644
index 0000000000..e9d9938115
--- /dev/null
+++ b/apps/desktop/src/components/redis/RedisDashboard.vue
@@ -0,0 +1,432 @@
+
+
+
+
+
+
+
+
+
+
+ Node:
+
+
+
+
+
+
+
+
+
+
+
+ Refresh
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Total Memory
+
+
+ {{ totalMemory }}
+
+
+
+
+
+
+ {{ usedMemory }}
+
+
+
+
+
+
+ Operation
+
+
+ {{ operation }}
+
+
+
+
+
+
+ Hit Ratio
+
+
+ {{ hitRatio }}
+
+
+
+
+
+
+
+
+
+
+ {{ t("common.loading") }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ No matching indicators
+ No data available
+
+
+
+
diff --git a/apps/desktop/src/components/sidebar/TreeItem.vue b/apps/desktop/src/components/sidebar/TreeItem.vue
index 23675f0fc9..18994e8108 100644
--- a/apps/desktop/src/components/sidebar/TreeItem.vue
+++ b/apps/desktop/src/components/sidebar/TreeItem.vue
@@ -53,6 +53,7 @@ import {
FilePlus,
SquarePen,
ListX,
+ Info,
} from "@lucide/vue";
import CustomContextMenu, { type ContextMenuItem } from "@/components/ui/CustomContextMenu.vue";
import { useConnectionStore } from "@/stores/connectionStore";
@@ -1085,6 +1086,14 @@ async function newQuery() {
// SQL template helpers have been extracted to @/lib/tableSqlTemplates.ts
// ---- Template actions ----
+function openRedisInstanceInfo() {
+ const node = props.node;
+ if (!node.connectionId) return;
+ const config = connectionStore.getConfig(node.connectionId);
+ const dbName = config?.name || "Redis";
+ queryStore.createTab(node.connectionId, "0", `${dbName} - ${t("contextMenu.instanceInfo")}`, "redis-dashboard");
+}
+
async function loadTemplateContext(allowView = false) {
const node = props.node;
if (!node.connectionId || !hasTreeNodeDatabaseContext(node)) return null;
@@ -3350,6 +3359,9 @@ function treeItemMenuItems(): ContextMenuItem[] {
items.push({ label: t("contextMenu.closeConnection"), action: disconnectConnection, icon: Unplug });
}
items.push({ label: t("contextMenu.newQuery"), action: newQuery, icon: TerminalSquare });
+ if (currentDatabaseType() === "redis") {
+ items.push({ label: t("contextMenu.instanceInfo"), action: openRedisInstanceInfo, icon: Info });
+ }
const sqlHistoryMenu = savedSqlHistorySubmenu();
if (sqlHistoryMenu) items.push(sqlHistoryMenu);
if (supportsDatabaseUserAdmin(currentDatabaseType())) {
diff --git a/apps/desktop/src/i18n/locales/en.ts b/apps/desktop/src/i18n/locales/en.ts
index 5de819b45d..1ec056d5bb 100644
--- a/apps/desktop/src/i18n/locales/en.ts
+++ b/apps/desktop/src/i18n/locales/en.ts
@@ -1137,6 +1137,7 @@ export default {
openUserAdmin: "Open Users & Privileges",
duplicateConnection: "Duplicate Connection",
newQuery: "New Query",
+ instanceInfo: "Instance Info",
newSql: "New SQL",
generateSql: "Generate SQL",
newInsert: "New Insert",
diff --git a/apps/desktop/src/i18n/locales/zh-CN.ts b/apps/desktop/src/i18n/locales/zh-CN.ts
index bc044e5212..3e80847b11 100644
--- a/apps/desktop/src/i18n/locales/zh-CN.ts
+++ b/apps/desktop/src/i18n/locales/zh-CN.ts
@@ -1136,6 +1136,7 @@ export default {
userAdmin: "用户与权限",
openUserAdmin: "打开用户与权限",
newQuery: "新建查询",
+ instanceInfo: "实例信息",
newInsert: "新建新增",
newSql: "新建 SQL",
generateSql: "生成 SQL",
diff --git a/apps/desktop/src/types/database.ts b/apps/desktop/src/types/database.ts
index 549669c7f9..ed9a18344e 100644
--- a/apps/desktop/src/types/database.ts
+++ b/apps/desktop/src/types/database.ts
@@ -595,7 +595,7 @@ export interface QueryTab {
executionId?: string;
isExplaining?: boolean;
explainExecutionId?: string;
- mode: "data" | "query" | "redis" | "mongo" | "vector" | "etcd" | "mq" | "nacos" | "objects" | "structure" | "users";
+ mode: "data" | "query" | "redis" | "redis-dashboard" | "mongo" | "vector" | "etcd" | "mq" | "nacos" | "objects" | "structure" | "users";
mqTenant?: string;
nacosNamespace?: string;
nacosNamespaceName?: string;