上千的请求同时抢购一个商品怎么保证数据的完整:首先想到
1.把库存字段设为unsigned,当库存为0,字段不能为负数,会返回False
2.悲观锁:在修改数据的时候就锁住,排斥其他修改,高并发下,全部请求都阻塞等待,系统会崩溃
3.使用mysql数据库事务,对需要库存修改的操作进行锁住,当修改成功才解锁,确保谁先提交成功就获得该商品,其他人都回滚。
4.使用队列:把多个请求放进队列中,先进先出,不会导致某些请求取不到锁,把多线程变成单线程
但请求很多,还是会把队列内存挤爆,系统再次崩溃,因为处理的速度根本比不上请求的速度
5.乐观锁:所有请求都可以去修改,但会获得该数据的版本号,只有版本号符合才能更新成功,其他全部返回,抢购失败,不过还是会增加CPU的计算开销
6.建议还是把抢购商品数据提前存储到redis,使用redis队列,因为pop操作是原子的,即使有很多用户同时到达,也是依次执行。当全部执行完后再修改mysql数据库库存。
数据库的左右链接查询语句
select 字段 from tb1 left join tb2 on 条件
select 字段 from tb1 ringt join tb2 on 条件
redis的上锁机制
SETNX key value key代表锁的标识名,如果没有该key,则插入,返回1,插入成功可以expire设置过期时间,如果有key则不插入锁了。返回0 ,根据返回值判断是否还是否上锁,有个参数timeout,指获取锁的超时时间,如果超过还没获取到就返回不再等待,
GET key value 获取锁
del key 释放锁
query遵循restful设计风格是怎么样的
对资源的操作通过统一的通用接口规范来访问:
例如:在发ajax时请求方式严格按照http标准动词GET,POST,DELETE,PUT进行请求
例如:如果要求服务器返回json数据,发送ajax时url写?format=json
数据库查询出来数据怎么去重
使用distinct方法:select distinct 字段 from 表
使用group by 方法:select 字段 from 表 group by 字段




yield函数机制:挂起生成器状态,返回yield表达式值,当使用next或者send进行激活生成器,则从上一次挂起的位置继续执行,直到碰到下一次的yield。
with机制:
上下文管理器:任何实现了__enter__()和__exit__()方法的对象都可以称作上下文管理器
上下文管理器对象可以使用with关键字,来替代try/finally的操作,简化代码
__enter__() 方法返回资源对象,__exit__() 方法处理一些清理工作
Flask的SQLAlchemy和Django的orm的不同
1.ORM是活动记录,每一行记录都对应代码中的对象;SQLAlchemy是数据映射,通过中间持久层实现与数据库交互;
2.ORM主键主动生成,SQLA每张表手动创建
3.ORM自动提交,SQLA手动提交
4.MSSQL完全支持SQLA,而ORM不太支持
flask和django的事务提交
django事务:开启事务:@transaction.atomic,设置保存点p=transaction.savepoint()
回滚:transaction.savepoint_rollback(p) 提交:transaction.savepoint_commit(p)
flask:db.session.commit(),db.session.rollback()
引用计数:两个对象a调用b,b调用a,引用计数怎么变化
b对象相互引用时,引用计数不会为0,对象不会被销毁,解释器定时执行循环检测器搜索出来并删掉它们,最后为0,这就是分带收集技术



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值