版权声明:本文为博主原创文章,遵循 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分布式锁相关推荐

  1. python redis分布式锁_Python 使用 Redis 实现分布式锁

    前言 随着互联网技术的不断发展,用户量的不断增加,越来越多的业务场景需要用到分布式系统.而在分布式系统中访问共享资源就需要一种互斥机制,来防止彼此之间的互相干扰,以保证一致性,这个时候就需要使用分布式 ...

  2. python并发锁,分布式锁,redis分布式锁

    关于toollib 当我们高并发时,为了确保一个方法(或代码块)同一时间只能被同一个线程执行,这时我们就需要锁来保证一致性 toollib实现了redis分布式锁.(pip install tooll ...

  3. Redis分布式锁奥义

    分布式锁 分布式系统进行逻辑处理的时候,经常会遇到并发问题,例如直播场景中,用户需要连麦主播,当多个用户在同一个时刻一起连麦时候,应该保证只有一个用户能连麦成功,我们改怎么保证这种业务场景下保证数据的 ...

  4. Redis分布式锁的实现原理看这篇就够了~

    2019独角兽企业重金招聘Python工程师标准>>> 一.写在前面 现在面试,一般都会聊聊分布式系统这块的东西.通常面试官都会从服务框架(Spring Cloud.Dubbo)聊起 ...

  5. 使用redis分布式锁+lua脚本实现分布式定时任务控制demo

    2019独角兽企业重金招聘Python工程师标准>>> 分布式系统经常要遇到定时任务执行的问题,不能重复执行,但很多时候又不能统一到一个微服务里面,因为这样就失去了微服务的意义.由于 ...

  6. 记一次自定义 Redis 分布式锁导致的故障

    点击上方关注 "终端研发部" 设为"星标",和你一起掌握更多数据库知识 背景 企微报警群里连续发出生产环境报错警告,报错核心信息如下: redis setNX ...

  7. Redis分布式锁详解

    Redis分布式锁详解 1. 分布式所概述 1.1 分布式锁 2. 缓存数据库Redis 2.1 redis简介 2.2 Springboot整合Redis两种方式 3. 实现验证 3.1 环境准备 ...

  8. 七种方案!探讨Redis分布式锁的正确使用姿势

    前言 日常开发中,秒杀下单.抢红包等等业务场景,都需要用到分布式锁.而Redis非常适合作为分布式锁使用.本文将分七个方案展开,跟大家探讨Redis分布式锁的正确使用方式.如果有不正确的地方,欢迎大家 ...

  9. redis分布式锁和看门狗的实现

    redis分布式锁和看门狗的实现 分布式应用进行逻辑处理时经常会遇到并发问题. 比如一个操作要修改用户的状态,修改状态需要先读出用户的状态,在内存里进行修 改,改完了再存回去.如果这样的操作同时进行了 ...

最新文章

  1. 图像处理和计算机视觉中的经典论文(部分)
  2. 腾讯游戏自研学术成果:基于图分割的网络表征学习初始化技术
  3. String, StringBuilder 与StringBuffer的区别与联系
  4. 数据结构——图的深度遍历
  5. java 跨站点脚本编制_AppScan跨站点脚本编制修复
  6. java 重写session_使用Shiro重写Session 自定义SESSION
  7. spring 环境配置
  8. SpringBoot之Bean之多实例选择
  9. 一键部署Zabbix客户端
  10. android studio for android learning (十一) 利用bundle在activity之间进行数据传递示例
  11. matlab has encountered,matlab运行程序时出现“matlab has encountered an internal problem
  12. JavaSE_05【数组】拓展练习
  13. maven离线(offline)构建时无法找到本地依赖 Non-resolvable import POM: Cannot access nexus
  14. 火焰图:全局视野的Linux性能剖析
  15. node 文件重命名
  16. 2015 ACM Arabella Collegiate Programming Contest
  17. 频域与时域滤波 (一)
  18. canal同步mysql到es
  19. MySQL中的char和varcharmysql中varchar能存多少汉字、数字,以及varchar(100)和varchar(10)的区别
  20. 网页引用优酷视频并添加封面自动播放

热门文章

  1. 经典C语言程序100例之四九
  2. pytroch 数据增量 transforms的二十二个方法
  3. Scala中使用两种方式对单词进行次数统计(wordCount)
  4. hibernate 延迟加载的错误 failed to lazily initialize a collection of role
  5. OA中总结:s:select,关于使用modelDriven,项目分层,@Transactional,jspf,各个层上配置注解交给spring管理的方法,简单的OGNL表达式写法
  6. 实现picturecontrol控件显示图片_陕西曝光机触摸屏实时数据控件
  7. python神器pandas_Python数据处理神器,pandas入门必需理解的核心内容
  8. linux内核之内存管理.doc,linux内核之内存管理.doc
  9. 5新标签中超链接_一环路新标签——“市井生活圈” 正在更新中......
  10. TensorRT(4)-Profiling and 16-bit Inference