来源: 分布式锁 redis实现分布式锁,分布式id生成方案,秒杀设计方案 – 战斗小人 – 博客园
分布式锁
作用:不同系统上的不同进程,去抢一把锁,谁抢到了,谁才能改数据
要求:高可用性,可冲入性(拿到锁的节点挂了,得有超时过期机制)
实现方式:
基于数据库实现分布式锁;
基于缓存(Redis等)实现分布式锁;
基于Zookeeper实现分布式锁;
# 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号重复 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中间件:请求放到队列中,直接返回,告诉用户,您正在排队) ## 有些公司潜规则,秒杀超了无所谓,优惠券而已