利用Python+Redis实现分布式锁
2024-09-07 05:20:06
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
最新文章
- windows上面捕获声卡数据
- 关于 QImage::Format_Mono
- 64bit upload app store
- 如何使用coding.net
- 使用mysql服务来记录用户的反馈
- 让图片完全显示出来,应对overflow,以及在背景中完全显示出来
- Java IO(四)
- [HIve - LanguageManual] Union
- java反射案例讲解
- bzoj2333
- Selenium索引
- android ViewFlipper的使用
- frame和iframe
- Html 小插件10 即时新闻
- Linux下Birt、JTreeChart中文乱码问题解决办法
- 微信小程序之页面跳转路径问题
- [国嵌笔记][011][Linux密码破解]
- 【环套树+树形dp】Bzoj1040 [ZJOI2008] 骑士
- hdu1256
- svn提交报错Previous operation has not finished; run 'cleanup' if it was interrupted