From d61eb1323f086f04495b13eb2bf675b31c74ae04 Mon Sep 17 00:00:00 2001 From: tiny-craft <137850705+tiny-craft@users.noreply.github.com> Date: Mon, 16 Oct 2023 01:09:04 +0800 Subject: [PATCH] feat: add sync/async delete key option to delete key dialog --- backend/services/connection_service.go | 25 +++++++++++++------ .../components/dialogs/DeleteKeyDialog.vue | 9 +++++-- frontend/src/langs/en.json | 4 ++- frontend/src/langs/zh-cn.json | 4 ++- frontend/src/stores/connections.js | 11 ++++---- 5 files changed, 37 insertions(+), 16 deletions(-) diff --git a/backend/services/connection_service.go b/backend/services/connection_service.go index f5e2656..7921690 100644 --- a/backend/services/connection_service.go +++ b/backend/services/connection_service.go @@ -1330,7 +1330,7 @@ func (c *connectionService) SetKeyTTL(connName string, db int, k any, ttl int64) } // DeleteKey remove redis key -func (c *connectionService) DeleteKey(connName string, db int, k any) (resp types.JSResp) { +func (c *connectionService) DeleteKey(connName string, db int, k any, async bool) (resp types.JSResp) { client, ctx, err := c.getRedisClient(connName, db) if err != nil { resp.Msg = err.Error() @@ -1344,10 +1344,15 @@ func (c *connectionService) DeleteKey(connName string, db int, k any) (resp type var mutex sync.Mutex del := func(ctx context.Context, cli redis.UniversalClient) error { iter := cli.Scan(ctx, 0, key, 10000).Iterator() + var fn func(c context.Context, ks ...string) *redis.IntCmd + if async { + fn = cli.Unlink + } else { + fn = cli.Del + } for iter.Next(ctx) { subKey := iter.Val() - if err = cli.Unlink(ctx, subKey).Err(); err != nil { - log.Println("unlink error", err.Error()) + if err = fn(ctx, subKey).Err(); err != nil { return err } else { mutex.Lock() @@ -1373,10 +1378,16 @@ func (c *connectionService) DeleteKey(connName string, db int, k any) (resp type } } else { // delete key only - _, err = client.Del(ctx, key).Result() - if err != nil { - resp.Msg = err.Error() - return + if async { + if _, err = client.Unlink(ctx, key).Result(); err != nil { + resp.Msg = err.Error() + return + } + } else { + if _, err = client.Del(ctx, key).Result(); err != nil { + resp.Msg = err.Error() + return + } } deletedKeys = append(deletedKeys, key) } diff --git a/frontend/src/components/dialogs/DeleteKeyDialog.vue b/frontend/src/components/dialogs/DeleteKeyDialog.vue index 67d4022..c445ed4 100644 --- a/frontend/src/components/dialogs/DeleteKeyDialog.vue +++ b/frontend/src/components/dialogs/DeleteKeyDialog.vue @@ -12,6 +12,7 @@ const deleteForm = reactive({ showAffected: false, loadingAffected: false, affectedKeys: [], + async: true, }) const dialogStore = useDialog() @@ -27,6 +28,7 @@ watch( deleteForm.showAffected = false deleteForm.loadingAffected = false deleteForm.affectedKeys = [] + deleteForm.async = true } }, ) @@ -50,8 +52,8 @@ const resetAffected = () => { const i18n = useI18n() const onConfirmDelete = async () => { try { - const { server, db, key } = deleteForm - const success = await connectionStore.deleteKeyPrefix(server, db, key) + const { server, db, key, async } = deleteForm + const success = await connectionStore.deleteKeyPrefix(server, db, key, async) if (success) { $message.success(i18n.t('dialogue.handle_succ')) } @@ -86,6 +88,9 @@ const onClose = () => { + + {{ $t('dialogue.key.async_delete_title') }} + } */ - async deleteKeyPrefix(connName, db, prefix) { + async deleteKeyPrefix(connName, db, prefix, async) { if (isEmpty(prefix)) { return false } @@ -1492,7 +1493,7 @@ const useConnectionStore = defineStore('connections', { if (!endsWith(prefix, '*')) { prefix += '*' } - const { data, success, msg } = await DeleteKey(connName, db, prefix) + const { data, success, msg } = await DeleteKey(connName, db, prefix, async) if (success) { // const { deleted: keys = [] } = data // for (const key of keys) {