Beispiel #1
0
from rediscluster import RedisCluster


def doSomething(msg_id, raw_data):
    print(msg_id)
    print(raw_data)


STARTUP_NODES = [{"host": "192.168.36.71", "port": "7001"}]

stream = "teststream"

rc = RedisCluster(startup_nodes=STARTUP_NODES, decode_responses=True)

## Continue fetch data from stream
print("## Continue fetching data")
data = rc.xread(streams={stream: '0'})

result_stream_name = data[0][0]
messages = data[0][1]

for msg in messages:
    msg_id = msg[0]
    raw_data = msg[1]
    doSomething(msg_id, raw_data)

rc.close()
Beispiel #2
0
class RedisPool(object):
    def __init__(self,
                 urls,
                 username=None,
                 password=None,
                 redis_mode=RedisMode.STANDALONE,
                 timeout=5,
                 master_name=None,
                 db=0,
                 decode_responses=True):
        """

        :param urls: redis 地址 ('hostname', 6379) 或 [('hostname', 6379),('hostname', 6378)] 或 [{"host": "127.0.0.1", "port": "7000"}, {"host": "127.0.0.1", "port": "7001"}]
        :param password: auth
        :param redis_mode: @see RedisMode
        :param timeout:
        :param master_name:
        :param db:
        :param decode_responses:
        """
        self.urls = urls
        self.username = username
        self.password = password
        self.redis_mode = redis_mode
        self.timeout = timeout
        self.master_name = master_name
        self.db = db

        self.__conn = None
        self.__pool = None
        self.__cluster = None
        if self.redis_mode == RedisMode.SENTINEL or self.redis_mode == 1:
            if isinstance(urls, str):
                urls = [url.split(":") for url in urls.split(";")]
            if not isinstance(urls, List) and not isinstance(urls, Tuple):
                raise TypeError(
                    "url : [('hostname', 6379),('hostname', 6378)]")
            sentinel = Sentinel(urls,
                                socket_timeout=self.timeout,
                                db=self.db,
                                username=username,
                                password=self.password,
                                decode_responses=decode_responses)
            self.__pool = SentinelConnectionPool(master_name,
                                                 sentinel,
                                                 password=self.password)
        elif self.redis_mode == RedisMode.CLUSTER or self.redis_mode == 2:
            if isinstance(urls, str):

                def addr(url):
                    _host, _port = url.split(":")
                    return {"host": _host, "port": _port}

                urls = [addr(url) for url in urls.split(";")]

            if not isinstance(urls, List) and not isinstance(urls, Tuple):
                raise TypeError(
                    'url : [{"host": "127.0.0.1", "port": "7000"}, {"host": "127.0.0.1", "port": "7001"}]'
                )
            self.__cluster = RedisCluster(startup_nodes=urls,
                                          decode_responses=decode_responses,
                                          socket_timeout=self.timeout,
                                          db=self.db,
                                          username=username,
                                          password=self.password)
        elif self.redis_mode == RedisMode.STANDALONE or self.redis_mode == 0:
            if isinstance(urls, str):
                urls = urls.split(":")
            if not isinstance(urls, List) and not isinstance(urls, Tuple):
                raise TypeError("url : ('hostname', 6379)")
            hostname, port = urls
            self.__pool = ConnectionPool(host=hostname,
                                         port=port,
                                         socket_timeout=self.timeout,
                                         password=self.password,
                                         db=self.db,
                                         username=username,
                                         decode_responses=decode_responses)
        else:
            raise TypeError('redis mode err')

    def __connection(self) -> Redis:
        if not self.__conn:
            if self.redis_mode == RedisMode.SENTINEL or self.redis_mode == RedisMode.STANDALONE:
                self.__conn = Redis(connection_pool=self.__pool)
            elif self.redis_mode == RedisMode.CLUSTER:
                pass
            else:
                raise TypeError('redis mode err')
        return self.__conn

    def database(self) -> Union[Database, RedisCluster]:
        if self.redis_mode == RedisMode.CLUSTER or self.redis_mode == 2:
            return self.__cluster
        else:
            return Database(self.__pool)

    def graph(self, name):
        """
        RedisGraph api @see https://github.com/RedisGraph/redisgraph-py
        pip install redisgraph
        :param name:
        :return:
        """
        if self.redis_mode == RedisMode.CLUSTER or self.redis_mode == 2:
            raise NotImplementedError("cluster is not supported")
        if not self.__conn:
            self.__connection()

        from redisgraph import Graph
        return Graph(name, self.__conn)

    def json(self):
        """
        RedisJson api @see https://github.com/RedisJSON/redisjson-py
        pip install rejson
        :return:
        """
        if self.redis_mode == RedisMode.CLUSTER or self.redis_mode == 2:
            raise NotImplementedError("cluster is not supported")

        from .json import Json
        return Json(self.__pool)

    def search(self, index_name):
        """
        RediSearch api @see https://github.com/RediSearch/redisearch-py
        pip install redisearch
        :return:
        """
        if self.redis_mode == RedisMode.CLUSTER or self.redis_mode == 2:
            raise NotImplementedError("cluster is not supported")

        from .search import Search
        return Search(index_name, self.__pool)

    def table(self, table_name):
        """
        :param table_name:
        :return:
        """
        if self.redis_mode == RedisMode.CLUSTER or self.redis_mode == 2:
            raise NotImplementedError("cluster is not supported")

        from .table import Table
        return Table(self.search(table_name), table_name)

    def close(self):
        """
        关闭连接池和当前使用的连接
        :return:
        """
        if self.__pool:
            self.__pool.disconnect()
        if self.__cluster:
            self.__cluster.close()