来源: 分布式锁 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中间件:请求放到队列中,直接返回,告诉用户,您正在排队)
## 有些公司潜规则,秒杀超了无所谓,优惠券而已

Mikel
