上午的时候,有个腾讯的朋友问我,关于用zookeeper分布式锁的设计,他的需求其实很简单,就是节点之间的协同合作。 我以前用redis写过一个网络锁,趁着这个机会就分享了出去。
其实核心的代码就那几行,就是借用redis setnx来原子性的加一个锁,然后用expire来控制过期时间。
注: setnx跟set的区别在于,setnx是原子性的操作,用set会出现一个问题,比如我先get key看看key是否存在,当我再次去判断的时候,有可能别人把这个key给配置了,这就成了非原子操作。
在介绍下这个用redis实现的分布式锁,他还含有retry和timetout的功能。
麻痹的爬虫呀,哎,说明下原文地址是,http://xiaorui.cc
* 用with做锁的逻辑语句
* timeout避免了避免了任务出现异常,没有做delete操作
* 对于长时间的业务,增加retry重试锁的次数
* 对于长时间的业务,增加retry重试锁的次数
1
2
3
4
5
6
7
8
9
10
11
|
#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
1
2
|
root@li568-252 redis_netlock]# python test.py
welcome to my blog, http://xiaorui.cc
|
python test2.py
1
2
3
4
5
6
|
[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项目里面。
1
|
pip install redis_netlock
|
下面是redis_netlock的git地址。
1
|
git clone https://github.com/rfyiamcool/redis_netlock.git
|
原文:https://www.cnblogs.com/leijiangtao/p/11889637.html