diff --git a/oslo_messaging/_drivers/zmq_driver/matchmaker/zmq_matchmaker_redis.py b/oslo_messaging/_drivers/zmq_driver/matchmaker/zmq_matchmaker_redis.py
index a7191f22e..5b066af0c 100644
--- a/oslo_messaging/_drivers/zmq_driver/matchmaker/zmq_matchmaker_redis.py
+++ b/oslo_messaging/_drivers/zmq_driver/matchmaker/zmq_matchmaker_redis.py
@@ -160,13 +160,21 @@ class MatchmakerRedisBase(zmq_matchmaker_base.MatchmakerBase):
     def _smembers(self, key):
         pass
 
+    @abc.abstractmethod
+    def _ttl(self, key):
+        pass
+
     @no_reraise
     def register_publisher(self, hostname, expire=-1):
-        self._sadd(_PUBLISHERS_KEY, ','.join(hostname), expire)
+        hostname = ','.join(hostname)
+        self._sadd(_PUBLISHERS_KEY, hostname, expire)
+        self._sadd(hostname, ' ', expire)
 
     @no_reraise
     def unregister_publisher(self, hostname):
-        self._srem(_PUBLISHERS_KEY, ','.join(hostname))
+        hostname = ','.join(hostname)
+        self._srem(_PUBLISHERS_KEY, hostname)
+        self._srem(hostname, ' ')
 
     @empty_list_on_error
     def get_publishers(self):
@@ -176,10 +184,12 @@ class MatchmakerRedisBase(zmq_matchmaker_base.MatchmakerBase):
     @no_reraise
     def register_router(self, hostname, expire=-1):
         self._sadd(_ROUTERS_KEY, hostname, expire)
+        self._sadd(hostname, ' ', expire)
 
     @no_reraise
     def unregister_router(self, hostname):
         self._srem(_ROUTERS_KEY, hostname)
+        self._srem(hostname, ' ')
 
     @empty_list_on_error
     def get_routers(self):
@@ -192,18 +202,22 @@ class MatchmakerRedisBase(zmq_matchmaker_base.MatchmakerBase):
         if target.server:
             key = zmq_address.target_to_key(target, listener_type)
             self._sadd(key, hostname, expire)
+            self._sadd(hostname, ' ', expire)
 
         key = zmq_address.prefix_str(target.topic, listener_type)
         self._sadd(key, hostname, expire)
+        self._sadd(hostname, ' ', expire)
 
     @no_reraise
     def unregister(self, target, hostname, listener_type):
         if target.server:
             key = zmq_address.target_to_key(target, listener_type)
             self._srem(key, hostname)
+            self._srem(hostname, ' ')
 
         key = zmq_address.prefix_str(target.topic, listener_type)
         self._srem(key, hostname)
+        self._srem(hostname, ' ')
 
     def get_hosts(self, target, listener_type):
         hosts = []
@@ -315,9 +329,19 @@ class MatchmakerRedis(MatchmakerRedisBase):
     def _srem(self, redis_instance, key, value):
         redis_instance.srem(key, value)
 
+    @read_from_redis_connection_warn
+    def _ttl(self, redis_instance, key):
+        # NOTE(ozamiatin): If the specialized key doesn't exist,
+        # TTL fuction would return -2. If key exists,
+        # but doesn't have expiration associated,
+        # TTL func would return -1. For more information,
+        # please visit http://redis.io/commands/ttl
+        return redis_instance.ttl(key)
+
     @read_from_redis_connection_warn
     def _smembers(self, redis_instance, key):
-        return redis_instance.smembers(key)
+        hosts = redis_instance.smembers(key)
+        return [host for host in hosts if redis_instance.ttl(host) >= -1]
 
 
 class MatchmakerRedisAvailabilityUpdater(zmq_updater.UpdaterBase):
@@ -421,4 +445,8 @@ class MatchmakerSentinel(MatchmakerRedisBase):
         self._redis_master.srem(key, value)
 
     def _smembers(self, key):
-        return self._redis_slave.smembers(key)
+        hosts = self._redis_slave.smembers(key)
+        return [host for host in hosts if self._ttl(host) >= -1]
+
+    def _ttl(self, key):
+        return self._redis_slave.ttl(key)