抢购

使用Redis实现抢购的一种思路

最后都变了- 提交于 2019-11-28 11:30:07
抢购是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少(“超卖”问题) 对于第一个问题,已经很容易想到用缓存来处理抢购,避免直接操作数据库,例如使用Redis。重点在于第二个问题,我们看看下面一种常规的实现代码: <?php require('predis/src/Autoloader.php'); $redis = new Predis\Client(array( 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => '6379' )); //redis 登录 $redis->auth('123456'); //库存 $num = 10; //用户id $user_id = $_SESSION['user_id']; //检查库存 $len = $redis->llen('order:1'); if($len >= $num){ exit('已经抢光了'); } //把抢到的用户存入到列表中 $result = $redis->lpush('order:1',$user_id); if($result){ echo '抢到了'; } ?> 如果代码正常运行,列表order:1中最多只能存储10个用户的id,因为库存只有10个。 然而,在使用Apache

小米的抢购骗局+小米的抢购页面的源代码分析(二)文本数组的分析

本秂侑毒 提交于 2019-11-27 14:18:06
首先小米源代码的一部分是一个非常非常大的字符串数组,分析它非常耗费时间,但是要搞明白必须去做。。 var _$ = [ //数组0位置,是空。 "", //2位置,是抢购的开始日期的字符串“11/19/2013 12:00:00” "\x31\x31\x2f\x31\x39\x2f\x32\x30\x31\x33\x20\x31\x32\x3a\x30\x30\x3a\x30\x30", //3位置,是一个奇怪的网址: http://p.www.xiaomi.com/m/zt/open/index.htm "\x68\x74\x74\x70\x3a\x2f\x2f\x70\x2e\x77\x77\x77\x2e\x78\x69\x61\x6f\x6d\x69\x2e\x63\x6f\x6d\x2f\x6d\x2f\x7a\x74\x2f\x6f\x70\x65\x6e\x2f\x69\x6e\x64\x65\x78\x2e\x68\x74\x6d\x6c", "\x68\x74\x74\x70\x3a\x2f\x2f\x74\x63\x2e\x68\x64\x2e\x78\x69\x61\x6f\x6d\x69\x2e\x63\x6f\x6d\x2f\x68\x64\x67\x65\x74\x3f\x63\x61\x6c\x6c\x62\x61\x63\x6b\x3d\x68

小米的抢购骗局+小米的抢购页面的源代码分析(三)工具类分析

雨燕双飞 提交于 2019-11-27 01:01:15
小米的javascript除了数据部分,下面就只剩871行的javascript了。 下面分模块进行分析。首先从简单的工具类入手。 从616行到最后。一共253行。 小米由于采用了一个数组,存储所有的静态字符串。所以需要手动对代码进行翻译 var Util = { time: function() { var a = m.$( "reback" ); if (count === 0x0) {//count应该是一个计数器,是倒计时使用的 m.$( "box-close ").innerHTML = "X" ;//一个关闭的X a.innerHTML = " 进入活动 " ; a.className = " reback_btn_next " ; this.start(); return false }; count = count - 0x1;//倒计时减一 a.innerHTML = ” 重新进入(<span id='initCount'> “ + count + ”</span>) “ }, //以上的time函数,是显示您正在排队倒计时的那个窗口, count这个值,咱们先记住,看看是从何而来 start: function() { var b = this, a = m.$( ” reback “ ); //这里的m.$应该类似于jquery的选择符,选择的是对象的id a