zoukankan      html  css  js  c++  java
  • 分布式锁 redis实现分布式锁,分布式id生成方案,秒杀设计方案

    分布式锁

    作用:不同系统上的不同进程,去抢一把锁,谁抢到了,谁才能改数据

    要求:高可用性,可冲入性(拿到锁的节点挂了,得有超时过期机制)

    实现方式:

    基于数据库实现分布式锁;

    基于缓存(Redis等)实现分布式锁;

    基于Zookeeper实现分布式锁;

    redis实现分布式锁

    # 1 分布式锁: 锁住不同机器上的不同进程
    # 2 redis实现:官方提供了    https://github.com/SPSCommerce/redlock-py
    
    #Redlock    pip install redlock-py     安装,此为官方提供版
    
    from redlock import Redlock
    
    dlm = Redlock([{"host": "localhost", "port": 6379, "db": 0}, ])    # 创建锁管理器
    # dlm = Redlock([{"host":"localhost",'port':6379,'db':0,'password':"admin123"},])
    
    # 获取锁,my_resource_name是锁的唯一标识符。1000代表1000毫秒数,超过这个时间,锁自动释放(防机器宕机)
    my_lock = dlm.lock("my_resource_name",1000)    
    # 自己的逻辑---》悲观锁---你的代码
    print("xxx")
    
    #你写的业务
    # 自己的逻辑---》悲观锁---你的代码
    dlm.unlock(my_lock)    # 把锁释放了
    
    原理:https://www.cnblogs.com/liuqingzheng/p/11080501.html  # 在4、分布式锁的简单实现代码中
    # 也可以参考第三方库  https://github.com/glasslion/redlock

    分布式id生成方案

    # 分布式id:为了保证全局唯一
        -分表,默认自增--》两个库上--》可能id号重复       uuid:有没有重复(数据量极大的情况下可能会重复,概率较低)
    # 设计思路:
      low版本的出来:
        -一个库 1,3,5,7,9
        -另一个库2,4,6,8,10
      分布式id生成方案
          -UUID:不是趋势自增,性能挺高(5台机器生成,一般不会重复)
        -mysql生成:性能低      机器都去mysql中要id
        -redis生成:很快,自增 ,必须还得有台redis服务器  incrby   16位: '当前时间戳+自增'  
        -雪花算法:python版雪花算法
        # 雪花算法是64位二进制数,第1位不用;41位是时间戳,可用69年;10位代表机器id(进程号),最大1024;12位表示4096个数字。雪花算法同一毫秒内最多产生4096个id
        # python实现雪花算法代码参考:https://www.cnblogs.com/oklizz/p/11865750.html

    秒杀设计方案

    # 思路一:    # 该方案适用于客户提前充好钱了,不适合连支付宝支付方案
        -某个时间段---》卖商品---》别卖超了---》mysql悲观锁实现---》缺陷,性能低
      -100商品---》预热---》100这个数,放到redis中----》incrby--》[来一个秒杀请求-1,在redis集合中把用户id放进去](加锁,使用分布式锁或者使用pipline做),最后100这个数变成了0,---》起个异步任务---》消费集合中的id,生成订单,扣减库存,扣减账户余额,提前充钱了
      -用户真去看订单的时候---》异步任务完成了
    
    # 思路二:
      -用户发了秒杀请求---》前端看到--》您正在排队 
      -请求来了---》放到队列里---》(djnago中间件:请求放到队列中,直接返回,告诉用户,您正在排队)

    ## 有些公司潜规则,秒杀超了无所谓,优惠券而已

  • 相关阅读:
    程序员的 59 条搞笑但却真实无比的编程语录
    Github最流行的10,000个Java项目使用的类库
    10大怪异的编程语言
    如何写一篇好的技术博客
    四件在我步入职业软件开发生涯那天起就该知道的事情
    程序员最艰巨的十大任务
    10 个理由让你继续干 IT
    被诅咒的程序员的七宗罪
    顶级程序员的 10 条最佳实践
    谷歌如何管理世界上最聪明的工程师?
  • 原文地址:https://www.cnblogs.com/ludingchao/p/14110170.html
Copyright © 2011-2022 走看看