欢迎光临
我们一直在努力

利用Python+Redis实现分布式锁



利用Python+Redis实现分布式锁


欢迎一起交流技术:一个人可以走的很快,但是一群人却可以走的更远。


常见关系型数据库(Oracle+MySQL+PG+GP)+高可用企业解决方案+分布式锁


使用场景:


  彻底解决HA的脑裂问题


  多个服务器之间只允许一个进程执行的场景





class MyDLock(object):


    def __init__(self, lockID,timeout):


        self.connection = redis.Redis(host=cfg.REDIS_SERVER_IP


                                      , port=cfg.REDIS_SERVER_PORT


                                      , password=cfg.REDIS_SERVER_PWD


                                      , db=cfg.REDIS_SERVER_DB_NUM


                                      ,decode_responses=True)


        self.__lockID = lockID


        self.__timeout  = timeout




    def tryLock(self, appid):


        #To_Main


        try:


            val=self.connection.get(self.__lockID)


            if val is None:


                logging.info("The app(%s) try lock(%s) ok." % (appid, self.__lockID));


                self.connection.set(self.__lockID, appid, ex=self.__timeout)


                return True


            else:


                logging.info("The owner of lock(%s) is %s. you(%s) can not get it"%(self.__lockID, val, appid));


                return False


        except Exception as e:


            logging.error("Warning: Can't write log. (%s)" % e)


            return False








    def activeLock(self, appid):


        #心跳,定期激活


        val = self.connection.get(self.__lockID)


        if val is None:


            logging.info("There is no lock(%s)." % (self.__lockID));


            return False


        else:


            if appid == val:


                #只能激活自己的锁


                logging.info("Application(%s) active lock(%s) ok." % (appid, self.__lockID));


                self.connection.set(self.__lockID, appid, ex=self.__timeout)


                return True


            else:


                #不能激活非自己的锁


                logging.info("Application(%s) can not active lock(%s). The owner is (%s)" % (appid, self.__lockID, val));


                return False




    def releaseLock(self, key, appid):


        val = self.connection.get(self.__lockID)


        if val is None:


            return False


        else:


            if appid == val:


                # 只能删除自己的锁


                self.connection.delete(self.__lockID)


                return True


            else:


                # 不能删除非自己的锁


                return False

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。