分布式锁 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中间件:请求放到队列中,直接返回,告诉用户,您正在排队)

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

 

posted @ 2020-12-10 16:37  战斗小人  阅读(544)  评论(0编辑  收藏  举报