redis 锁的案例
2024-08-31 11:11:59
1: redis 锁 作为一种术装饰器使用
基本逻辑:
1:声明一个redislock类 定义生成锁和释放锁两个方法
2:生成锁使用了一个默认值 setnx ; 如果当前时间大于 第一次锁的生成时间就重新生成(循环一次锁的时间更新一次)
3:释放锁:在设置的时间范围timeout 内 , 就释放锁
3:定义一个装饰器方法 参数是redis锁对象(写法值得借鉴)
import time
import redis class RedisLock(object):
def __init__(self, key):
self.rdcon = redis.Redis(host='localhost', port=6379, db=1)
self._lock = 0
self.lock_key = "%s_dynamic_test" % key @staticmethod
def get_lock(cls, timeout=10):
while cls._lock != 1:
timestamp = time.time() + timeout + 1
cls._lock = cls.rdcon.setnx(cls.lock_key, timestamp) if cls._lock == 1 or (
time.time() > float(cls.rdcon.get(cls.lock_key)) and time.time() > float(cls.rdcon.getset(cls.lock_key,
timestamp))):
print("get lock")
break
else:
time.sleep(0.3) @staticmethod
def release(cls):
print('*'*10)
print(time.time())
print(cls.rdcon.get(cls.lock_key))
if time.time() < float(cls.rdcon.get(cls.lock_key)):
print("release lock") cls.rdcon.delete(cls.lock_key) def deco(cls):
def _deco(func):
def __deco(*args, **kwargs):
print("before %s called [%s]." % (func.__name__, cls))
cls.get_lock(cls)
try:
return func(*args, **kwargs)
finally:
cls.release(cls) return __deco return _deco @deco(RedisLock(""))
def myfunc():
print("myfunc() called.")
time.sleep(5)
print('end..') if __name__ == "__main__":
myfunc()
最新文章
- JavaScript中的 offset, client,scroll
- C#获得网卡信息 NetworkInterface IPInterfaceProperties
- eclipse编辑器配置
- java中的static使用--静态变量、静态方法
- js中获取键盘事件【转】
- JSP之错误信息提示
- js笔记——浏览器及版本判断
- 2014华为机试西安地区B组试题
- JavaEE(2) - Weblogic 服务器执行JNDI绑定和查找
- 让你用 Chrome 上网快到想哭:Vimium
- [转] JavaScript中in操作符(for..in)、Object.keys()和Object.getOwnPropertyNames()的区别
- Ubuntu 下使用 Nginx 部署 .NET Core 2.0 网站
- 什么是LDAP?
- FAIR开源Detectron:整合全部顶尖目标检测算法
- AspectJ 切面注解中五种通知注解:@Before、@After、@AfterRunning、@AfterThrowing、@Around
- ux.form.field.Year 只能选年的时间扩展
- mybatis foreach 遍历list中的坑
- 自然语言处理--jieba和gensim的分词功能
- 【PMP】三点估算法
- 浅谈C#中的深拷贝(DeepCopy)与浅拷贝(MemberwiseClone)
热门文章
- day 26作业
- Node: 包管理机制
- C:\Program Files\Docker\Docker\Resources\bin\docker.exe: no matching manifest for windows/amd64 10.0.17763 in the manifest list entries.
- 什么影响了mysql的性能-存储引擎层
- 剖析和解决Python中网络粘包的正确姿势
- 11.vue-router编程式导航
- python中的object
- mysql udf提权
- H5页面中判断是安卓手机还是ios手机的方法;APP页面中嵌套的H5跳转到APP其他页面的方法。
- ArrayList 集合 简单运用