diff --git a/registry/etcdv3/listener.go b/registry/etcdv3/listener.go
index 6fa84126f82f134be8a8bbe3129d176a5e17d59d..61c71ee48e529b36b094d5c2532b15471515fcff 100644
--- a/registry/etcdv3/listener.go
+++ b/registry/etcdv3/listener.go
@@ -34,17 +34,20 @@ import (
 )
 
 type dataListener struct {
-	interestedURL []*common.URL
+	interestedURL map[string]*common.URL
 	listener      config_center.ConfigurationListener
 }
 
 // NewRegistryDataListener ...
 func NewRegistryDataListener(listener config_center.ConfigurationListener) *dataListener {
-	return &dataListener{listener: listener, interestedURL: []*common.URL{}}
+	return &dataListener{listener: listener, interestedURL: make(map[string]*common.URL, 16)}
 }
 
 func (l *dataListener) AddInterestedURL(url *common.URL) {
-	l.interestedURL = append(l.interestedURL, url)
+	if _, ok := l.interestedURL[url.String()]; ok {
+		return
+	}
+	l.interestedURL[url.String()] = url
 }
 
 func (l *dataListener) DataChange(eventType remoting.Event) bool {
@@ -56,20 +59,18 @@ func (l *dataListener) DataChange(eventType remoting.Event) bool {
 		return false
 	}
 
-	for _, v := range l.interestedURL {
-		if serviceURL.URLEqual(*v) {
-			l.listener.Process(
-				&config_center.ConfigChangeEvent{
-					Key:        eventType.Path,
-					Value:      serviceURL,
-					ConfigType: eventType.Action,
-				},
-			)
-			return true
-		}
+	if _, ok := l.interestedURL[serviceURL.String()]; !ok {
+		return false
 	}
 
-	return false
+	l.listener.Process(
+		&config_center.ConfigChangeEvent{
+			Key:        eventType.Path,
+			Value:      serviceURL,
+			ConfigType: eventType.Action,
+		},
+	)
+	return true
 }
 
 type configurationListener struct {
diff --git a/registry/kubernetes/listener.go b/registry/kubernetes/listener.go
index c1d4f70fed307f782e05f15a96ace6fc3f27afa9..7837233c18e364ef718b3617812cf68747785b88 100644
--- a/registry/kubernetes/listener.go
+++ b/registry/kubernetes/listener.go
@@ -34,17 +34,21 @@ import (
 )
 
 type dataListener struct {
-	interestedURL []*common.URL
+	interestedURL map[string]*common.URL
 	listener      config_center.ConfigurationListener
 }
 
 // NewRegistryDataListener ...
 func NewRegistryDataListener(listener config_center.ConfigurationListener) *dataListener {
-	return &dataListener{listener: listener}
+	return &dataListener{listener: listener, interestedURL: make(map[string]*common.URL, 16)}
 }
 
 func (l *dataListener) AddInterestedURL(url *common.URL) {
-	l.interestedURL = append(l.interestedURL, url)
+
+	if _, ok := l.interestedURL[url.String()]; ok {
+		return
+	}
+	l.interestedURL[url.String()] = url
 }
 
 func (l *dataListener) DataChange(eventType remoting.Event) bool {
@@ -56,20 +60,19 @@ func (l *dataListener) DataChange(eventType remoting.Event) bool {
 		return false
 	}
 
-	for _, v := range l.interestedURL {
-		if serviceURL.URLEqual(*v) {
-			l.listener.Process(
-				&config_center.ConfigChangeEvent{
-					Key:        eventType.Path,
-					Value:      serviceURL,
-					ConfigType: eventType.Action,
-				},
-			)
-			return true
-		}
+	if _, ok := l.interestedURL[serviceURL.String()]; !ok {
+		return false
 	}
 
-	return false
+	l.listener.Process(
+		&config_center.ConfigChangeEvent{
+			Key:        eventType.Path,
+			Value:      serviceURL,
+			ConfigType: eventType.Action,
+		},
+	)
+	return true
+
 }
 
 type configurationListener struct {
diff --git a/registry/zookeeper/listener.go b/registry/zookeeper/listener.go
index fe8e42db9f39190e34142149a6b67c9638a84ed2..0c46261b39471e2794e3508b65cc5b28b10e80dc 100644
--- a/registry/zookeeper/listener.go
+++ b/registry/zookeeper/listener.go
@@ -37,18 +37,21 @@ import (
 
 // RegistryDataListener ...
 type RegistryDataListener struct {
-	interestedURL []*common.URL
+	interestedURL map[string]*common.URL
 	listener      config_center.ConfigurationListener
 }
 
 // NewRegistryDataListener ...
 func NewRegistryDataListener(listener config_center.ConfigurationListener) *RegistryDataListener {
-	return &RegistryDataListener{listener: listener, interestedURL: []*common.URL{}}
+	return &RegistryDataListener{listener: listener, interestedURL: make(map[string]*common.URL, 16)}
 }
 
 // AddInterestedURL ...
 func (l *RegistryDataListener) AddInterestedURL(url *common.URL) {
-	l.interestedURL = append(l.interestedURL, url)
+	if _, ok := l.interestedURL[url.String()]; ok {
+		return
+	}
+	l.interestedURL[url.String()] = url
 }
 
 // DataChange ...
@@ -65,14 +68,19 @@ func (l *RegistryDataListener) DataChange(eventType remoting.Event) bool {
 		logger.Errorf("Listen NewURL(r{%s}) = error{%v} eventType.Path={%v}", url, err, eventType.Path)
 		return false
 	}
-	for _, v := range l.interestedURL {
-		if serviceURL.URLEqual(*v) {
-			l.listener.Process(&config_center.ConfigChangeEvent{Value: serviceURL, ConfigType: eventType.Action})
-			return true
-		}
+
+	if _, ok := l.interestedURL[serviceURL.String()]; !ok {
+		return false
 	}
 
-	return false
+	l.listener.Process(
+		&config_center.ConfigChangeEvent{
+			Key:        eventType.Path,
+			Value:      serviceURL,
+			ConfigType: eventType.Action,
+		},
+	)
+	return true
 }
 
 // RegistryConfigurationListener ...