1. 首页
  2. IT资讯

python语言下通过redis实现分布式锁

“u003Cdivu003Eu003Cpu003E解决的问题u003Cu002Fpu003Eu003Cpu003E分布式环境下,希望把用户的操作从并发执行变成原子执行案例:u003Cu002Fpu003Eu003Cpu003E将订单并发变成串行执行, 相比悲观锁来说能够减少数据库的压力。u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fdfic-imagehandleru002F31db09d4-532e-442f-8dad-bcd6f844d4fa” img_width=”1200″ img_height=”800″ alt=”python语言下通过redis实现分布式锁” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E原理u003Cu002Fpu003Eu003Cpu003Eredis是单线程的,并发过来的请求,redis都会让他们排队串行执行,redis内部是线程安全的u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fd584ff1ea71943a89ed6c343ea31b0eb” img_width=”1003″ img_height=”413″ alt=”python语言下通过redis实现分布式锁” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E实现的代码u003Cu002Fpu003Eu003Cpu003E考虑到如果下单出现异常则锁将永远无法释放,因此做异常捕获,无论代码是否异常要释放锁u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fbeb31bac23fe48938507c5ce8858ef18″ img_width=”976″ img_height=”386″ alt=”python语言下通过redis实现分布式锁” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E考虑到如果下单过程中服务器宕机,则锁将永远无法释放u003Cu002Fpu003Eu003Cpu003E方案一:应用开始起置空redis中的locku003Cu002Fpu003Eu003Cpu003E方案二:给锁设置过期时间,但是如果用户的下单操作超过了lock的过期时间,则下单没有完成锁就失效了。 过期时间设置的太长宕机立刻重启问题也解决不了u003Cu002Fpu003Eu003Cpu003E# 解决方案 启动一个子线程,每过2s给锁重设过期时间,主线程执行结束,则销毁子线程u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002F89f45799356f4f48b5fc79e50bae6e22″ img_width=”984″ img_height=”683″ alt=”python语言下通过redis实现分布式锁” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E销毁线程的代码u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003Efrom threading import Threadu003Cu002Fpu003Eu003Cpu003Eimport inspectu003Cu002Fpu003Eu003Cpu003Eimport ctypesu003Cu002Fpu003Eu003Cpu003Edef _async_raise(tid, exctype):u003Cu002Fpu003Eu003Cpu003E “””raises the exception, performs cleanup if needed”””u003Cu002Fpu003Eu003Cpu003E tid = ctypes.c_long(tid)u003Cu002Fpu003Eu003Cpu003E if not inspect.isclass(exctype):u003Cu002Fpu003Eu003Cpu003E exctype = type(exctype)u003Cu002Fpu003Eu003Cpu003E res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))u003Cu002Fpu003Eu003Cpu003E if res == 0:u003Cu002Fpu003Eu003Cpu003E raise ValueError(“invalid thread id”)u003Cu002Fpu003Eu003Cpu003E elif res != 1:u003Cu002Fpu003Eu003Cpu003E # “””if it returns a number greater than one, you’re in trouble,u003Cu002Fpu003Eu003Cpu003E # and you should call it again with exc=NULL to revert the effect”””u003Cu002Fpu003Eu003Cpu003E ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)u003Cu002Fpu003Eu003Cpu003E raise SystemError(“PyThreadState_SetAsyncExc failed”)u003Cu002Fpu003Eu003Cpu003Edef stop_thread(thread):u003Cu002Fpu003Eu003Cpu003E _async_raise(thread.ident, SystemExit)u003Cu002Fpu003Eu003Cpu003Edef a():u003Cu002Fpu003Eu003Cpu003E while True:u003Cu002Fpu003Eu003Cpu003E print(“123456789″)u003Cu002Fpu003Eu003Cpu003Eif __name__ == ‘__main__’:u003Cu002Fpu003Eu003Cpu003E t = Thread(target=a)u003Cu002Fpu003Eu003Cpu003E t.start()u003Cu002Fpu003Eu003Cpu003E stop_thread(t)u003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003E学习资源:u003Cu002Fpu003Eu003Cpu003Eu003Ca class=”pgc-link” data-content=”mp” href=”http:u002Fu002Fyun.itheima.comu002Fcourseu002F542.html?jrtt” target=”_blank”u003Epython入门必备指南u003Cu002Fau003Eu003Cu002Fpu003Eu003Cu002Fdivu003E”

原文始发于:python语言下通过redis实现分布式锁

主题测试文章,只做测试使用。发布者:程序员,转转请注明出处:http://www.cxybcw.com/26768.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code