Source code for gemstone.discovery.redis_strategy
import threading
import urllib.parse
import hashlib
import redis
from gemstone.discovery.base import BaseDiscoveryStrategy
_thread_local = threading.local()
[docs]class RedisDiscoveryStrategy(BaseDiscoveryStrategy):
def __init__(self, redis_url, time_to_live=180):
parsed = urllib.parse.urlparse(redis_url)
if parsed.scheme != "redis":
raise ValueError("Invalid scheme: {}".format(parsed.scheme))
self.host = parsed.hostname
self.port = parsed.port
self.db = int(parsed.path[1:])
self.ttl = time_to_live
self.connection = self._get_connection()
def _get_connection(self):
conn = getattr(_thread_local, "_redisconn", None)
if conn:
return conn
conn = redis.StrictRedis(host=self.host, port=self.port, db=self.db)
setattr(_thread_local, "_redisconn", conn)
return conn
def locate(self, name):
values = []
keys = self.connection.keys(name + "#*")
for key in keys:
values.append(self.connection.get(key))
return [x.decode() for x in values]
@staticmethod
def make_hash(target):
if isinstance(target, str):
target = target.encode()
return hashlib.md5(target).hexdigest()
def ping(self, name, location, **kwargs):
self.connection.setex(name + "#" + self.make_hash(location),
self.ttl, location)