PHP 秒杀设计



中小型公司完全的解决掉并发的方案。
服务框架
读 | 写 | |
---|---|---|
客户端 | 页面静态化、CDN缓存、限流 | 削峰、限流 |
接入层 | 负载均衡、限流 | 负载均衡、限流 |
服务层 | 集群化部署、本地缓存、总缓存 | 集群化部署、本地库存、写订单排队 |
数据层 | 读写分离 | 读写分离 |
单服务的极致性能
想要做到单服务的极致性能,就必须压榨CPU的性能,可以从以下几点入手。
- 减少上下文切换
- 减少阻塞式I/O
- rpc调用
- 磁盘读写
PHP的代码现实
class CacheController extends BaseController
{
// Redis单例对象
static $redisObj;
/*
* 连接Redis的单例
*/
static function conRedis()
{
if (self::$redisObj) return self::$redisObj;
self::$redisObj = new \Redis();
self::$redisObj->connect('127.0.0.1',6379);
return self::$redisObj;
}
/*
* 使用Lua脚本和Redis的原子性,从而避开PHP的多线程引起的问题
*/
private static function incUseCount()
{
$script = <<<eof
local key = KEYS[1]
local field1 = KEYS[2]
local field2 = KEYS[3]
local field1_val = redis.call('hget',key,field1)
local field2_val = redis.call('hget',key,field2)
if(field1_val>field2_val) then
return redis.call('HINCRBY',key,field2,1)
end
return 0
eof;
return self::conRedis()->eval($script,['共享信息Key','商品总库存','已售库存'],3);
}
}