python使用redis实现协同控制的分布式锁

这两天心情不好,因为感情问题,在这里给朋友们都提个醒! 不要天天code,珍惜身边的人,别你妈天天宅家里,不是代码,就是撸管的。 


上午的时候,有个腾讯的朋友问我,关于用zookeeper分布式锁的设计,他的需求其实很简单,就是节点之间的协同合作。 我以前用redis写过一个网络锁,趁着这个机会就分享了出去。 

其实核心的代码就那几行,就是借用redis setnx来原子性的加一个锁,然后用expire来控制过期时间。

注: setnx跟set的区别在于,setnx是原子性的操作,用set会出现一个问题,比如我先get key看看key是否存在,当我再次去判断的时候,有可能别人把这个key给配置了,这就成了非原子操作。 


在介绍下这个用redis实现的分布式锁,他还含有retry和timetout的功能。

麻痹的爬虫呀,哎,说明下原文地址是,http://xiaorui.cc

*   用with做锁的逻辑语句

*   timeout避免了避免了任务出现异常,没有做delete操作

*   对于长时间的业务,增加retry重试锁的次数

#coding:utf-8
#my blog: http://xiaorui.cc
from __future__ import with_statement
import redis
import time
from redis_netlock import dist_lock

client = redis.Redis(connection_pool=redis.BlockingConnectionPool(max_connections=15, host='localhost', port=6379))
with dist_lock('test', client):
    time.sleep(10)
    print 'welcome to my blog, http://xiaorui.cc'

同时运行test.py and test2.py

python test.py

root@li568-252 redis_netlock]# python test.py
welcome to my blog, http://xiaorui.cc

python test2.py

[root@li568-252 redis_netlock]# python test2.py
Sleeipng for 0.404031367603
Sleeipng for 1.19347232007
Sleeipng for 2.47668271021
Sleeipng for 4.55280708824
hello

已经把redis_netlock提交到了pypi项目里面。 

pip install redis_netlock

下面是redis_netlock的git地址。

git clone https://github.com/rfyiamcool/redis_netlock.git


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

10 Responses

  1. szcountryboy 2016年3月17日 / 下午3:58

    setnx+expire 不是更好?

    • 峰云就她了 2016年3月17日 / 下午5:33

      对的,就是应该setnx,setnx是原子的操作。 另外redis分布式做我加了一层时序队列控制客户端挂了,但expire还没过期的问题。 这两天就把这功能更新上。

  2. kc 2015年1月1日 / 下午2:01

    太牛逼了饿

  3. 枫卷残韵 2014年12月22日 / 下午5:07

    看了一下,并没有考虑并发- -#

    • 峰云 2014年12月22日 / 下午5:44

      我就是不让他并发呀,没听过谁加的锁,能并发呀…. … 这个其实主要就是为了,协调和一致性

    • 峰云 2014年12月22日 / 下午5:51

      刚表达错了, 并发也是可以加锁的,我这个不影响你的并发逻辑。 你用threading啥的,也会用到mutux加锁的逻辑的,防止某个数据乱跑,不准的情况。

    • 奋战 2014年12月25日 / 上午7:32

      个人认为,这个不影响并发,如果你的程序依靠某个逻辑,那这就够用了

  4. 酷毙了 2014年12月19日 / 下午7:29

    但是哥们为什么这么多的网址,啥意思

    • 峰云 2014年12月20日 / 上午8:30

      哎,文章总是被转走了

  5. 酷毙了 2014年12月19日 / 下午7:28

    牛逼,不错

szcountryboy进行回复 取消回复

邮箱地址不会被公开。 必填项已用*标注