执行sql:
beginTranse(开启事务)
try{
//quantity为请求减掉的库存数量
$dbca->query('update s_store set amount = amount - quantity where amount>=quantity and postID = 12345');
}catch($e Exception){
rollBack(回滚)
}
commit(提交事务)
从技术方面剖析,很多人肯定会想到事务,但是数据库事务是控制库存超卖的必要条件,但不是充分必要条件。
1、缓存秒杀(秒杀场景)
商品库存预先放到缓存中。
先将商品数量递减(加锁/解锁)后再进行其他方面的处理,
处理失败在将数据递增1(加锁/解锁),否则表示交易成功。
当商品数量递减到0时,表示商品秒杀完毕,拒绝其他用户的请求。
2、排队方案(秒杀场景)
限制最多10000个人进来,最后排队,取出前100的人才能下单成功,
适合:不能粗糙限流的场景,12306。或者一次性要处理完,又不能限流。
重要:秒杀服务单独部署
1、通过服务端的内存锁(锁主键,起始就是商品id的分布式锁),按顺序一个一个,非秒杀场景,无需限流(缓存支持的最大并发)。
当某个用户要修改某个id的数据时,把要修改的id存入memcache,加上超时,
若其他用户触发修改此id的数据时,读到memcache有这个id的值时,等待三次,每次1秒,或者直接拒绝重新下单。
如:incre = 1,执行完,del。
2、库存操作进队列,库存扣减采用消息,扣减里面有订单号,和扣减状态,更新订单库存可支付状态。(要限流)
a)查询库存操作数和实际库存,实际库存》库存操作数才执行,否则拦截,
b)生成订单,支付时候,查询订单库存可支付状态执行后续操作。
这是库存总是动态算出来的,可能会慢,而且消费一定要保证,但是不需要更新缓存和DB,保持缓存和DB一致性也是问题。
实际应用中,并不是让mysql去直面大并发读写,会借助“外力”,
比如缓存、分布式锁、队列写入等方法来降低并发读写。
Integer A = 128;
Integer B = 128;
Assert.assertEquals(true,A!=B);
Integer C = 2;
Integer D = 2;
Assert.assertEquals(true,C==D);
线程池几个参数?拒绝策略默认有哪几种
int和long各占多少字节
java系列化,hessian序列化原理?序列化反序列化过程?
什么是ABA问题,出现ABA问题,JDK是如何解决的。
假设现在是 20018-12-03 12:00:00.000,如果我调用一下 Thread.Sleep(1000) ,在 20018-12-03 12:00:01.000 的时候,这个线程会不会被唤醒?
某人的代码中用了一句看似莫明其妙的话:Thread.Sleep(0) 。既然是 Sleep 0 毫秒,那么他跟去掉这句代码相比,有啥区别么?
为什么HashMap,长度使用2的倍数
位运算(&)效率要比取模运算(%)高很多,主要原因是位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。
1、什么是Redis?
2、Redis相比memcached有哪些优势?
3、Redis支持哪几种数据类型?
4、Redis主要消耗什么物理资源?
5、Redis的全称是什么?
6、Redis有哪几种数据淘汰策略?
7、Redis官方为什么不提供Windows版本?
8、一个字符串类型的值能存储最大容量是多少?
9、为什么Redis需要把所有数据放到内存中?
10、Redis集群方案应该怎么做?都有哪些方案?
10、Redis集群方案应该怎么做?都有哪些方案?
11、Redis集群方案什么情况下会导致整个集群不可用?
12、MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
13、Redis有哪些适合的场景?
14、Redis支持的Java客户端都有哪些?官方推荐用哪个?
15、Redis和Redisson有什么关系?
16、Jedis与Redisson对比有什么优缺点?
17、Redis如何设置密码及验证密码?
18、说说Redis哈希槽的概念?
19、Redis集群的主从复制模型是怎样的?
20、Redis集群会有写操作丢失吗?为什么?
21、Redis集群之间是如何复制的?
22、Redis集群最大节点个数是多少?
23、Redis集群如何选择数据库?
24、怎么测试Redis的连通性?
25、Redis中的管道有什么用?
26、怎么理解Redis事务?
27、Redis事务相关的命令有哪几个?
28、Redis key的过期时间和永久有效分别怎么设置?
29、Redis如何做内存优化?
30、Redis回收进程如何工作的?
31、Redis回收使用的是什么算法?
32、Redis如何做大量数据插入?
33、为什么要做Redis分区?
34、你知道有哪些Redis分区实现方案?
35、Redis分区有什么缺点?
36、Redis持久化数据和缓存怎么做扩容?
37、分布式Redis是前期做还是后期规模上来了再做好?为什么?
38、Twemproxy是什么?
39、支持一致性哈希的客户端有哪些?
40、Redis与其他key-value存储有什么不同?
42、都有哪些办法可以降低Redis的内存使用情况呢?
43、查看Redis使用情况及状态信息用什么命令?
44、Redis的内存用完了会发生什么?
45、Redis是单线程的,如何提高多核CPU的利用率?
46、一个Redis实例最多能存放多少的keys?List、Set、Sorted Set他们最多能存放多少元素?
47、Redis常见性能问题和解决方案?
48、Redis提供了哪几种持久化方式?
49、如何选择合适的持久化方式?
50、修改配置不重启Redis会实时生效吗?
搜云库技术团队,面试必备的技术干货
想进大厂?50个多线程面试题,你会多少?(一)
金三银四跳槽季,Java面试大纲,冲击年薪70W
史上最全阿里 Java 面试题总结
小马哥每日一问
小马哥技术周报