python实现redis分布式锁
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiao_xia_ming/article/details/100564708
import time
import redis
class RedisLock(object):
def __init__(self, key):
self.rdcon = redis.Redis(host='127.0.0.1', port=6379, password="", 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
# 127.0.0.1:6379> SETNX 0 1567676678.05
# (integer) 1
# 127.0.0.1:6379> GET 0
# 1567676678.05
# 127.0.0.1:6379> GETSET 0 1567676678.05
# 1567676678.05
print cls._lock
print timestamp
# 商品秒杀
cls._lock = cls.rdcon.setnx(cls.lock_key, timestamp)
if cls._lock == 1 or (time.time() > cls.rdcon.get(cls.lock_key) and time.time() > cls.rdcon.getset(cls.lock_key, timestamp)):
print "get lock"
break
else:
time.sleep(0.3)
@staticmethod
def release(cls):
if time.time() < 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("6666"))
def myfunc():
print "myfunc() called."
time.sleep(20)
if __name__ == "__main__":
myfunc()
# 在传统的基于数据库的架构中,对于数据的抢占问题往往是通过数据库事务(ACID)来保证的。
# 在分布式环境中,出于对性能以及一致性敏感度的要求,使得分布式锁成为了一种比较常见而高效的解决方案。
# 使用场景:
# 某服务提供一组任务,A请求随机从任务组中获取一个任务;B请求随机从任务组中获取一个任务。
# 在理想的情况下,A从任务组中挑选一个任务,任务组删除该任务,B从剩下的的任务中再挑一个,任务组删除该任务。
# 同样的,在真实情况下,如果不做任何处理,可能会出现A和B挑中了同一个任务的情况。
# 分布式锁设计目标
# 可以保证在分布式部署的应用集群中,同一个方法在同一操作只能被一台机器上的一个线程执行。
# 这把锁要是一把可重入锁(避免死锁)
# 这把锁最好是一把阻塞锁(根据业务需求考虑要不要这条)
# 这把锁有高可用的获取锁和释放锁功能
# 这把锁获取锁和释放锁的性能要好……
# 商品提前设置到数据库里面,当在分布式的场景下面,顾客抢占到商品后就可以进行相应的删除
# 基于性能方面的考虑,redis相比mysql更有优势(对redis实现集群配置,或者RDB,AOF备份等)
————————————————
版权声明:本文为CSDN博主「xiao_xia_ming」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiao_xia_ming/article/details/100564708
python实现redis分布式锁相关推荐
- python redis分布式锁_Python 使用 Redis 实现分布式锁
前言 随着互联网技术的不断发展,用户量的不断增加,越来越多的业务场景需要用到分布式系统.而在分布式系统中访问共享资源就需要一种互斥机制,来防止彼此之间的互相干扰,以保证一致性,这个时候就需要使用分布式 ...
- python并发锁,分布式锁,redis分布式锁
关于toollib 当我们高并发时,为了确保一个方法(或代码块)同一时间只能被同一个线程执行,这时我们就需要锁来保证一致性 toollib实现了redis分布式锁.(pip install tooll ...
- Redis分布式锁奥义
分布式锁 分布式系统进行逻辑处理的时候,经常会遇到并发问题,例如直播场景中,用户需要连麦主播,当多个用户在同一个时刻一起连麦时候,应该保证只有一个用户能连麦成功,我们改怎么保证这种业务场景下保证数据的 ...
- Redis分布式锁的实现原理看这篇就够了~
2019独角兽企业重金招聘Python工程师标准>>> 一.写在前面 现在面试,一般都会聊聊分布式系统这块的东西.通常面试官都会从服务框架(Spring Cloud.Dubbo)聊起 ...
- 使用redis分布式锁+lua脚本实现分布式定时任务控制demo
2019独角兽企业重金招聘Python工程师标准>>> 分布式系统经常要遇到定时任务执行的问题,不能重复执行,但很多时候又不能统一到一个微服务里面,因为这样就失去了微服务的意义.由于 ...
- 记一次自定义 Redis 分布式锁导致的故障
点击上方关注 "终端研发部" 设为"星标",和你一起掌握更多数据库知识 背景 企微报警群里连续发出生产环境报错警告,报错核心信息如下: redis setNX ...
- Redis分布式锁详解
Redis分布式锁详解 1. 分布式所概述 1.1 分布式锁 2. 缓存数据库Redis 2.1 redis简介 2.2 Springboot整合Redis两种方式 3. 实现验证 3.1 环境准备 ...
- 七种方案!探讨Redis分布式锁的正确使用姿势
前言 日常开发中,秒杀下单.抢红包等等业务场景,都需要用到分布式锁.而Redis非常适合作为分布式锁使用.本文将分七个方案展开,跟大家探讨Redis分布式锁的正确使用方式.如果有不正确的地方,欢迎大家 ...
- redis分布式锁和看门狗的实现
redis分布式锁和看门狗的实现 分布式应用进行逻辑处理时经常会遇到并发问题. 比如一个操作要修改用户的状态,修改状态需要先读出用户的状态,在内存里进行修 改,改完了再存回去.如果这样的操作同时进行了 ...
最新文章
- 图像处理和计算机视觉中的经典论文(部分)
- 腾讯游戏自研学术成果:基于图分割的网络表征学习初始化技术
- String, StringBuilder 与StringBuffer的区别与联系
- 数据结构——图的深度遍历
- java 跨站点脚本编制_AppScan跨站点脚本编制修复
- java 重写session_使用Shiro重写Session 自定义SESSION
- spring 环境配置
- SpringBoot之Bean之多实例选择
- 一键部署Zabbix客户端
- android studio for android learning (十一) 利用bundle在activity之间进行数据传递示例
- matlab has encountered,matlab运行程序时出现“matlab has encountered an internal problem
- JavaSE_05【数组】拓展练习
- maven离线(offline)构建时无法找到本地依赖 Non-resolvable import POM: Cannot access nexus
- 火焰图:全局视野的Linux性能剖析
- node 文件重命名
- 2015 ACM Arabella Collegiate Programming Contest
- 频域与时域滤波 (一)
- canal同步mysql到es
- MySQL中的char和varcharmysql中varchar能存多少汉字、数字,以及varchar(100)和varchar(10)的区别
- 网页引用优酷视频并添加封面自动播放
热门文章
- 经典C语言程序100例之四九
- pytroch 数据增量 transforms的二十二个方法
- Scala中使用两种方式对单词进行次数统计(wordCount)
- hibernate 延迟加载的错误 failed to lazily initialize a collection of role
- OA中总结:s:select,关于使用modelDriven,项目分层,@Transactional,jspf,各个层上配置注解交给spring管理的方法,简单的OGNL表达式写法
- 实现picturecontrol控件显示图片_陕西曝光机触摸屏实时数据控件
- python神器pandas_Python数据处理神器,pandas入门必需理解的核心内容
- linux内核之内存管理.doc,linux内核之内存管理.doc
- 5新标签中超链接_一环路新标签——“市井生活圈” 正在更新中......
- TensorRT(4)-Profiling and 16-bit Inference