Revert "模糊匹配新增kvIdFuzzyCache,查询时缓存,增删改时直接整个失效,底层kvDoc直接复用 (#327)" (#332)

This reverts commit 14ed5c08c9eb9907844116c87b26a781edf711e4.
diff --git a/go.mod b/go.mod
index 8d1f4dc..f88e287 100644
--- a/go.mod
+++ b/go.mod
@@ -2,7 +2,6 @@
 
 require (
 	github.com/apache/servicecomb-service-center/eventbase v0.0.0-20240328150344-01abe81dc5d0
-	github.com/dgraph-io/ristretto v0.2.0
 	github.com/emicklei/go-restful v2.15.1-0.20220703112237-d9c71e118c95+incompatible
 	github.com/go-chassis/cari v0.9.1-0.20240328115504-88da93faaca7
 	github.com/go-chassis/etcdadpt v0.5.3-0.20240328092602-984e34b756fe
@@ -14,7 +13,7 @@
 	github.com/gofrs/uuid v4.0.0+incompatible
 	github.com/hashicorp/serf v0.9.5
 	github.com/patrickmn/go-cache v2.1.0+incompatible
-	github.com/stretchr/testify v1.8.4
+	github.com/stretchr/testify v1.7.2
 	github.com/urfave/cli v1.22.4
 	go.etcd.io/etcd/api/v3 v3.5.4
 	go.mongodb.org/mongo-driver v1.5.1
@@ -36,7 +35,7 @@
 	github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect
 	github.com/davecgh/go-spew v1.1.1 // indirect
 	github.com/deckarep/golang-set v1.7.1 // indirect
-	github.com/dustin/go-humanize v1.0.1 // indirect
+	github.com/dustin/go-humanize v1.0.0 // indirect
 	github.com/fatih/color v1.10.0 // indirect
 	github.com/form3tech-oss/jwt-go v3.2.3+incompatible // indirect
 	github.com/fsnotify/fsnotify v1.4.9 // indirect
@@ -126,7 +125,7 @@
 	golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838 // indirect
 	golang.org/x/net v0.7.0 // indirect
 	golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
-	golang.org/x/sys v0.11.0 // indirect
+	golang.org/x/sys v0.5.0 // indirect
 	golang.org/x/text v0.7.0 // indirect
 	golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect
 	google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c // indirect
diff --git a/go.sum b/go.sum
index e93b436..652132a 100644
--- a/go.sum
+++ b/go.sum
@@ -126,16 +126,12 @@
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/deckarep/golang-set v1.7.1 h1:SCQV0S6gTtp6itiFrTqI+pfmJ4LN85S1YzhDf9rTHJQ=
 github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ=
-github.com/dgraph-io/ristretto v0.2.0 h1:XAfl+7cmoUDWW/2Lx8TGZQjjxIQ2Ley9DSf52dru4WE=
-github.com/dgraph-io/ristretto v0.2.0/go.mod h1:8uBHCU/PBV4Ag0CJrP47b9Ofby5dqWNh4FicAdoqFNU=
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
-github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y=
 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
 github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
+github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
-github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
-github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
 github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
 github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
 github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
@@ -581,8 +577,8 @@
 github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
 github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
@@ -590,8 +586,8 @@
 github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
-github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s=
+github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
 github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
 github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
@@ -856,8 +852,8 @@
 golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
-golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
diff --git a/pkg/stringutil/string_util_test.go b/pkg/stringutil/string_util_test.go
index 333b8ff..7963f8c 100644
--- a/pkg/stringutil/string_util_test.go
+++ b/pkg/stringutil/string_util_test.go
@@ -20,9 +20,8 @@
 import (
 	"testing"
 
-	"github.com/stretchr/testify/assert"
-
 	"github.com/apache/servicecomb-kie/pkg/stringutil"
+	"github.com/stretchr/testify/assert"
 )
 
 func TestFormat(t *testing.T) {
@@ -36,7 +35,6 @@
 	})
 	t.Log(s)
 	assert.Equal(t, s, s2)
-	assert.Equal(t, s, "service=a::version=1")
 	s3 := stringutil.FormatMap(nil)
 	assert.Equal(t, "none", s3)
 }
diff --git a/server/datasource/etcd/kv/kv_cache.go b/server/datasource/etcd/kv/kv_cache.go
index 025cf3a..e890b87 100644
--- a/server/datasource/etcd/kv/kv_cache.go
+++ b/server/datasource/etcd/kv/kv_cache.go
@@ -4,16 +4,13 @@
 	"context"
 	"encoding/json"
 	"fmt"
-	"log"
 	"regexp"
 	"strings"
 	"sync"
 	"time"
 
-	"github.com/dgraph-io/ristretto"
 	"github.com/go-chassis/etcdadpt"
 	"github.com/go-chassis/foundation/backoff"
-	"github.com/go-chassis/go-archaius"
 	"github.com/go-chassis/openlog"
 	goCache "github.com/patrickmn/go-cache"
 	"go.etcd.io/etcd/api/v3/mvccpb"
@@ -22,7 +19,6 @@
 	"github.com/apache/servicecomb-kie/pkg/stringutil"
 	"github.com/apache/servicecomb-kie/server/datasource"
 	"github.com/apache/servicecomb-kie/server/datasource/etcd/key"
-	"github.com/apache/servicecomb-kie/server/plugin/qms"
 )
 
 func Init() {
@@ -41,38 +37,24 @@
 )
 
 type Cache struct {
-	timeOut   time.Duration
-	client    etcdadpt.Client
-	revision  int64
-	kvIDCache sync.Map // map[labels]map[kvId]struct{} 精确匹配某组labels的kvId集合
-	// 非精确匹配时,对每一个查找条件建立缓存,由于n个标签理论上有2^n个查找条件,因此需要限制缓存大小。
-	// 任意创建,删除操作,由于其频率较低,直接重建整个缓存,更新操作由于不影响此缓存与etcd一致性,不需额外处理
-	kvIDFuzzyCache *ristretto.Cache // map[labels]map[kvId]struct{} 模糊匹配某组labels的kvId集合
-	kvDocCache     *goCache.Cache
+	timeOut    time.Duration
+	client     etcdadpt.Client
+	revision   int64
+	kvIDCache  sync.Map
+	kvDocCache *goCache.Cache
 }
 
 func NewKvCache() *Cache {
-	quota := archaius.GetInt64(qms.QuotaConfigKey, qms.DefaultQuota)
-	fuzzyCache, err := ristretto.NewCache(&ristretto.Config{
-		MaxCost:     quota * 10,
-		NumCounters: quota * 100,
-		BufferItems: 64,
-	})
-	if err != nil {
-		log.Fatalf("init kv cache fail, configuration error %v", err)
-	}
-
 	kvDocCache := goCache.New(cacheExpirationTime, cacheCleanupInterval)
 	return &Cache{
-		timeOut:        etcdWatchTimeout,
-		client:         etcdadpt.Instance(),
-		revision:       0,
-		kvDocCache:     kvDocCache,
-		kvIDFuzzyCache: fuzzyCache,
+		timeOut:    etcdWatchTimeout,
+		client:     etcdadpt.Instance(),
+		revision:   0,
+		kvDocCache: kvDocCache,
 	}
 }
 
-func cacheEnabled() bool {
+func Enabled() bool {
 	return kvCache != nil
 }
 
@@ -124,6 +106,7 @@
 	timoutCtx, cancel := context.WithTimeout(ctx, kc.timeOut)
 	defer cancel()
 
+	rev := kc.revision
 	opts := append(
 		etcdadpt.WatchPrefixOpOptions(prefixKvs),
 		etcdadpt.WithRev(kc.revision+1),
@@ -131,7 +114,7 @@
 	)
 	err := kc.client.Watch(timoutCtx, opts...)
 	if err != nil {
-		openlog.Error(fmt.Sprintf("watch prefix %s failed, start rev: %d+1->%d->0, err %v", prefixKvs, kc.revision, kc.revision, err))
+		openlog.Error(fmt.Sprintf("watch prefix %s failed, start rev: %d+1->%d->0, err %v", prefixKvs, rev, kc.revision, err))
 		kc.revision = 0
 	}
 	return err
@@ -146,7 +129,7 @@
 	return rsp, nil
 }
 
-func (kc *Cache) watchCallBack(_ string, rsp *etcdadpt.Response) error {
+func (kc *Cache) watchCallBack(message string, rsp *etcdadpt.Response) error {
 	if rsp == nil || len(rsp.Kvs) == 0 {
 		return fmt.Errorf("unknown event")
 	}
@@ -165,7 +148,7 @@
 
 func (kc *Cache) cachePut(rsp *etcdadpt.Response) {
 	for _, kv := range rsp.Kvs {
-		kvDoc, err := unmarshalKVDoc(kv)
+		kvDoc, err := kc.GetKvDoc(kv)
 		if err != nil {
 			openlog.Error(fmt.Sprintf("failed to unmarshal kv, err %v", err))
 			continue
@@ -186,7 +169,7 @@
 
 func (kc *Cache) cacheDelete(rsp *etcdadpt.Response) {
 	for _, kv := range rsp.Kvs {
-		kvDoc, err := unmarshalKVDoc(kv)
+		kvDoc, err := kc.GetKvDoc(kv)
 		if err != nil {
 			openlog.Error(fmt.Sprintf("failed to unmarshal kv, err %v", err))
 			continue
@@ -214,18 +197,6 @@
 	return kvIds, true
 }
 
-func (kc *Cache) LoadKvIDSetByFuzzyCache(cacheKey string) (*sync.Map, bool) {
-	val, ok := kc.kvIDFuzzyCache.Get(cacheKey)
-	if !ok {
-		return nil, false
-	}
-	kvIds, ok := val.(*sync.Map)
-	if !ok {
-		return nil, false
-	}
-	return kvIds, true
-}
-
 func (kc *Cache) StoreKvIDSet(cacheKey string, kvIds *sync.Map) {
 	kc.kvIDCache.Store(cacheKey, kvIds)
 }
@@ -250,7 +221,11 @@
 	kc.kvDocCache.Delete(kvID)
 }
 
-func Search(ctx context.Context, req *CacheSearchReq) (*model.KVResponse, error) {
+func Search(ctx context.Context, req *CacheSearchReq) (*model.KVResponse, bool, error) {
+	if !req.Opts.ExactLabels {
+		return nil, false, nil
+	}
+
 	openlog.Debug(fmt.Sprintf("using cache to search kv, domain %v, project %v, opts %+v", req.Domain, req.Project, *req.Opts))
 	result := &model.KVResponse{
 		Data: []*model.KVDoc{},
@@ -259,16 +234,9 @@
 	kvIds, ok := kvCache.LoadKvIDSet(cacheKey)
 	if !ok {
 		kvCache.StoreKvIDSet(cacheKey, &sync.Map{})
-		return result, nil
+		return result, true, nil
 	}
 
-	return getKvDocsByIds(ctx, req, kvIds)
-}
-
-func getKvDocsByIds(ctx context.Context, req *CacheSearchReq, kvIds *sync.Map) (*model.KVResponse, error) {
-	result := &model.KVResponse{
-		Data: []*model.KVDoc{},
-	}
 	var docs []*model.KVDoc
 
 	var kvIdsLeft []string
@@ -282,7 +250,7 @@
 	})
 	tpData, err := kvCache.getKvFromEtcd(ctx, req, kvIdsLeft)
 	if err != nil {
-		return nil, err
+		return nil, true, err
 	}
 	docs = append(docs, tpData...)
 
@@ -293,7 +261,7 @@
 		}
 	}
 	result.Total = len(result.Data)
-	return result, nil
+	return result, true, nil
 }
 
 func (kc *Cache) getKvFromEtcd(ctx context.Context, req *CacheSearchReq, kvIdsLeft []string) ([]*model.KVDoc, error) {
@@ -318,7 +286,7 @@
 				return
 			}
 
-			doc, err := unmarshalKVDoc(kv)
+			doc, err := kc.GetKvDoc(kv)
 			if err != nil {
 				openlog.Error(fmt.Sprintf("failed to unmarshal kv, err %v", err))
 				getKvErr = err
@@ -352,7 +320,7 @@
 	return true
 }
 
-func unmarshalKVDoc(kv *mvccpb.KeyValue) (*model.KVDoc, error) {
+func (kc *Cache) GetKvDoc(kv *mvccpb.KeyValue) (*model.KVDoc, error) {
 	kvDoc := &model.KVDoc{}
 	err := json.Unmarshal(kv.Value, kvDoc)
 	if err != nil {
diff --git a/server/datasource/etcd/kv/kv_cache_test.go b/server/datasource/etcd/kv/kv_cache_test.go
index e198361..56711ac 100644
--- a/server/datasource/etcd/kv/kv_cache_test.go
+++ b/server/datasource/etcd/kv/kv_cache_test.go
@@ -4,7 +4,6 @@
 	"testing"
 
 	"github.com/go-chassis/etcdadpt"
-	"github.com/go-chassis/go-archaius"
 	"github.com/stretchr/testify/assert"
 	"go.etcd.io/etcd/api/v3/mvccpb"
 )
@@ -13,10 +12,6 @@
 	rsp *etcdadpt.Response
 }
 
-func init() {
-	archaius.Init()
-}
-
 func TestCachePut(t *testing.T) {
 	tests := []struct {
 		name string
diff --git a/server/datasource/etcd/kv/kv_dao.go b/server/datasource/etcd/kv/kv_dao.go
index d7ebc37..8d9f63b 100644
--- a/server/datasource/etcd/kv/kv_dao.go
+++ b/server/datasource/etcd/kv/kv_dao.go
@@ -22,9 +22,8 @@
 	"encoding/json"
 	"regexp"
 	"strings"
-	"sync"
 
-	pkgsync "github.com/go-chassis/cari/sync"
+	"github.com/go-chassis/cari/sync"
 	"github.com/go-chassis/etcdadpt"
 	"github.com/go-chassis/openlog"
 
@@ -69,10 +68,6 @@
 		}))
 		return nil, datasource.ErrKVAlreadyExists
 	}
-	// 添加kv时,直接重建kvIdFuzzyCache
-	if cacheEnabled() {
-		kvCache.kvIDFuzzyCache.Clear()
-	}
 	return kv, nil
 }
 
@@ -91,7 +86,7 @@
 		openlog.Error("fail to marshal kv " + err.Error())
 		return false, err
 	}
-	task, err := pkgsync.NewTask(kv.Domain, kv.Project, pkgsync.CreateAction, datasource.ConfigResource, kv)
+	task, err := sync.NewTask(kv.Domain, kv.Project, sync.CreateAction, datasource.ConfigResource, kv)
 	if err != nil {
 		openlog.Error("fail to create task" + err.Error())
 		return false, err
@@ -161,7 +156,7 @@
 		openlog.Error(err.Error())
 		return err
 	}
-	task, err := pkgsync.NewTask(kv.Domain, kv.Project, pkgsync.UpdateAction, datasource.ConfigResource, kv)
+	task, err := sync.NewTask(kv.Domain, kv.Project, sync.UpdateAction, datasource.ConfigResource, kv)
 	if err != nil {
 		openlog.Error("fail to create task" + err.Error())
 		return err
@@ -274,10 +269,6 @@
 		openlog.Error("decode error: " + err.Error())
 		return nil, err
 	}
-	// 删除kv时,直接重建kvIdFuzzyCache
-	if cacheEnabled() {
-		kvCache.kvIDFuzzyCache.Clear()
-	}
 	return &kvDoc, nil
 }
 
@@ -289,7 +280,7 @@
 		openlog.Error(err.Error())
 		return nil, err
 	}
-	task, err := pkgsync.NewTask(domain, project, pkgsync.DeleteAction, datasource.ConfigResource, kvDoc)
+	task, err := sync.NewTask(domain, project, sync.DeleteAction, datasource.ConfigResource, kvDoc)
 	if err != nil {
 		openlog.Error("fail to create task" + err.Error())
 		return nil, err
@@ -299,7 +290,7 @@
 		openlog.Error("fail to marshal task" + err.Error())
 		return nil, err
 	}
-	tombstone := pkgsync.NewTombstone(domain, project, datasource.ConfigResource, datasource.TombstoneID(kvDoc))
+	tombstone := sync.NewTombstone(domain, project, datasource.ConfigResource, datasource.TombstoneID(kvDoc))
 	tombstoneBytes, err := json.Marshal(tombstone)
 	if err != nil {
 		openlog.Error("fail to marshal tombstone" + err.Error())
@@ -316,10 +307,6 @@
 		}))
 		return nil, err
 	}
-	// 删除kv时,直接重建kvIdFuzzyCache
-	if cacheEnabled() {
-		kvCache.kvIDFuzzyCache.Clear()
-	}
 	return kvDoc, nil
 }
 
@@ -389,10 +376,6 @@
 		}
 		docs = append(docs, &doc)
 	}
-	// 删除kv时,直接重建kvIdFuzzyCache
-	if cacheEnabled() {
-		kvCache.kvIDFuzzyCache.Clear()
-	}
 	return docs, resp.Count, nil
 }
 
@@ -402,8 +385,8 @@
 	var opOptions []etcdadpt.OpOptions
 	kvTotalNum := len(kvIDs)
 	docs = make([]*model.KVDoc, kvTotalNum)
-	tasks := make([]*pkgsync.Task, kvTotalNum)
-	tombstones := make([]*pkgsync.Tombstone, kvTotalNum)
+	tasks := make([]*sync.Task, kvTotalNum)
+	tombstones := make([]*sync.Tombstone, kvTotalNum)
 	successKVNum := 0
 	for i := 0; i < kvTotalNum; i++ {
 		kvDoc, err := getKVDoc(ctx, domain, project, kvIDs[i])
@@ -418,14 +401,14 @@
 		if kvDoc == nil {
 			continue
 		}
-		task, err := pkgsync.NewTask(domain, project, pkgsync.DeleteAction, datasource.ConfigResource, kvDoc)
+		task, err := sync.NewTask(domain, project, sync.DeleteAction, datasource.ConfigResource, kvDoc)
 		if err != nil {
 			openlog.Error("fail to create task")
 			return nil, 0, err
 		}
 		docs[successKVNum] = kvDoc
 		tasks[successKVNum] = task
-		tombstones[successKVNum] = pkgsync.NewTombstone(domain, project, datasource.ConfigResource,
+		tombstones[successKVNum] = sync.NewTombstone(domain, project, datasource.ConfigResource,
 			datasource.TombstoneID(kvDoc))
 		successKVNum++
 	}
@@ -465,10 +448,6 @@
 		}))
 		return nil, 0, err
 	}
-	// 删除kv时,直接重建kvIdFuzzyCache
-	if cacheEnabled() {
-		kvCache.kvIDFuzzyCache.Clear()
-	}
 	return docs, int64(successKVNum), nil
 }
 
@@ -546,43 +525,19 @@
 		return nil, opts, err
 	}
 
-	if cacheEnabled() {
-		return listDataByCache(ctx, project, domain, opts, regex)
-	}
-
-	result, err := matchLabelsSearch(ctx, domain, project, regex, opts)
-	if err != nil {
-		openlog.Error("list kv failed: " + err.Error())
-		return nil, opts, err
-	}
-
-	return result, opts, nil
-}
-
-func listDataByCache(ctx context.Context, project string, domain string, opts datasource.FindOptions, regex *regexp.Regexp) (*model.KVResponse, datasource.FindOptions, error) {
-	req := &CacheSearchReq{
-		Domain:  domain,
-		Project: project,
-		Opts:    &opts,
-		Regex:   regex,
-	}
-	if opts.ExactLabels {
-		result, err := Search(ctx, req)
-		if err == nil {
+	if Enabled() {
+		result, useCache, err := Search(ctx, &CacheSearchReq{
+			Domain:  domain,
+			Project: project,
+			Opts:    &opts,
+			Regex:   regex,
+		})
+		if useCache && err == nil {
 			return result, opts, nil
 		}
-		openlog.Warn("using cache to search kv failed: " + err.Error())
-	} else {
-		cacheKey := kvCache.GetCacheKey(domain, project, opts.Labels)
-		kvIdSet, ok := kvCache.LoadKvIDSetByFuzzyCache(cacheKey)
-		if ok {
-			result, err := getKvDocsByIds(ctx, req, kvIdSet)
-			if err == nil {
-				return result, opts, nil
-			}
-			openlog.Warn("using fuzzy cache to search kv failed: " + err.Error())
+		if useCache && err != nil {
+			openlog.Error("using cache to search kv failed: " + err.Error())
 		}
-		openlog.Info("using fuzzy cache to search kv not hit")
 	}
 
 	result, err := matchLabelsSearch(ctx, domain, project, regex, opts)
@@ -591,16 +546,6 @@
 		return nil, opts, err
 	}
 
-	if opts.ExactLabels {
-		return result, opts, nil
-	}
-
-	kvIdSet := new(sync.Map)
-	for _, kv := range result.Data {
-		kvIdSet.Store(kv.ID, struct{}{})
-	}
-	cacheKey := kvCache.GetCacheKey(domain, project, opts.Labels)
-	kvCache.kvIDFuzzyCache.Set(cacheKey, kvIdSet, int64(result.Total))
 	return result, opts, nil
 }
 
@@ -628,6 +573,9 @@
 		result.Data = append(result.Data, &doc)
 		result.Total++
 
+		if IsUniqueFind(opts) {
+			break
+		}
 	}
 
 	return result, nil