Skip to content

Python连接Redis哨兵

python
from redis.sentinel import Sentinel

if __name__ == '__main__':
    # 哨兵监听的别名,这个就是你redis配置中的名字
    server_name = "myredis"

    # 设置哨兵组的IP和PORT
    sentinel_list = [
        ("192.168.10.150", 26379),
        ("192.168.10.151", 26379),
        ("192.168.10.152", 26379)
    ]
    # 初始化哨兵对象,并传递哨兵组的IP和端口信息
    sentinel = Sentinel(sentinel_list)

    # print(sentinel.discover_slaves(server_name))
    # print(sentinel.discover_master(server_name))

    # 从哨兵监视中获取master主库 ('192.168.10.150', 6379)
    master_client = sentinel.master_for(server_name, decode_responses=True)

    # 从哨兵监视中获取slave从库 [('192.168.10.151', 6379), ('192.168.10.152', 6379)]
    slave_client = sentinel.slave_for(server_name, decode_responses=True)

    # 主库中设置值
    master_client.set("user", "zhangkai")

    # 从库中获取值
    print(slave_client.get("user"))

封装:

python
from redis.sentinel import Sentinel

class PyConnectionSentinel(object):
    """ Python连接Redis哨兵 """

    def __init__(self, server_name, sentinel_list, decode_responses=True):
        # 从库对象
        self.replica = None
        # 主库对象
        self.master = None
        # 哨兵对象
        self.sentinel_obj = None
        # 哨兵监听的别名,这个就是你redis配置中的名字
        self.server_name = server_name
        self.sentinel_list = sentinel_list
        # 根据需要决定是否自动对响应结果进行decode操作,这里默认是True
        self.decode_responses = decode_responses
        self.init_sentinel()
        self.get_master_client()
        self.get_replica_client()

    def init_sentinel(self):
        """ 初始化哨兵对象,并传递哨兵组的IP和端口信息 """
        self.sentinel_obj = Sentinel(self.sentinel_list)
        print("discover_master-->", self.sentinel_obj.discover_master(self.server_name))
        print("discover_slaves-->", self.sentinel_obj.discover_slaves(self.server_name))
        """
        discover_master--> ('192.168.10.150', 6379)
		discover_slaves--> [('192.168.10.151', 6379), ('192.168.10.152', 6379)]
        """

    def get_master_client(self):
        """ 从哨兵监视中获取master主库 """
        self.master = self.sentinel_obj.master_for(
            self.server_name,
            decode_responses=self.decode_responses,
            # 指Redis发出命令接收响应的时间不能超过此参数设置时间. 如果超过了此时间, 将会抛出异常redis.exceptions.TimeoutError: Timeout reading from socket, 即读取响应超时。
            # 建议设置这个时间,防止程序读取redis数据超时导致服务卡住,同时增加对这个的异常处理。
            # socket_timeout=0.5,

            # 指Redis建立连接超时时间. 当设置此参数时, 如果在此时间内没有建立连接, 将会抛出异常redis.exceptions.TimeoutError: Timeout connecting to server。
            # socket_connect_timeout不设置时,这个值等于socket_timeout。
            # 可以只设置socket_timeout
            # socket_connect_timeout=0.5

            # password='12345'

            # Boolean类型,建议设置为True,当设置False时, 一个命令超时后, 将会直接抛出timeout异常。
            # 当设置为True时, 命令超时后,将会重试一次, 重试成功则正常返回; 失败则抛出timeout异常。
            retry_on_timeout=True
        )

    def get_replica_client(self):
        """ 从哨兵监视中获取slave主库 """
        self.replica = self.sentinel_obj.master_for(self.server_name, decode_responses=self.decode_responses)


if __name__ == '__main__':
    # 哨兵监听的别名,这个就是你redis配置中的名字
    server_name = "myredis"

    # 设置哨兵组的IP和PORT
    sentinel_list = [
        ("192.168.10.150", 26379),
        ("192.168.10.151", 26379),
        ("192.168.10.152", 26379)
    ]
    # 关于哨兵的所有操作都可以通过这个类封装
    obj = PyConnectionSentinel(
        server_name=server_name,
        sentinel_list=sentinel_list
    )
    # 通过master可以进行读写操作
    obj.master.set('k1', 'v1111')
    print(obj.master.get("k1"))  # v1111
    # 你也可以通过从节点进行读操作,从而达到主从分离的目的
    print(obj.replica.get("k1"))  # v1111

部分内容网络所学,如有侵权可联系QQ:3127993395