一、项目架构设计
电商平台API技术栈:
- ThinkPHP6:核心框架
- MySQL:主数据库
- Redis:缓存与队列
- Elasticsearch:商品搜索
- JWT:接口认证
二、核心功能实现
1. 高性能商品API
// app/controller/Product.php
namespace appcontroller;
use appmodelProduct as ProductModel;
use thinkfacadeCache;
use thinkfacadeDb;
class Product
{
// 商品详情带缓存
public function detail($id)
{
$cacheKey = 'product_detail_' . $id;
$product = Cache::remember($cacheKey, function() use ($id) {
return ProductModel::with(['skus', 'images'])
->cache(true, 3600)
->find($id);
}, 3600);
return json($product);
}
// 商品搜索
public function search()
{
$keywords = input('keywords');
$page = input('page', 1);
$size = input('size', 10);
$params = [
'index' => 'products',
'body' => [
'query' => [
'multi_match' => [
'query' => $keywords,
'fields' => ['name^3', 'description']
]
],
'from' => ($page - 1) * $size,
'size' => $size
]
];
$results = app('es')->search($params);
return json($results);
}
}
2. 秒杀功能实现
// app/service/SeckillService.php
namespace appservice;
use thinkfacadeDb;
use thinkfacadeCache;
use thinkfacadeQueue;
class SeckillService
{
public static function checkStock($productId)
{
$stockKey = 'seckill_stock_' . $productId;
$stock = Cache::get($stockKey);
if ($stock === false) {
$stock = Db::name('product')
->where('id', $productId)
->value('stock');
Cache::set($stockKey, $stock, 3600);
}
return $stock > 0;
}
public static function seckill($userId, $productId)
{
$lockKey = 'seckill_lock_' . $productId;
if (!Cache::add($lockKey, 1, 10)) {
return false;
}
try {
Db::startTrans();
$stock = Db::name('product')
->where('id', $productId)
->lock(true)
->value('stock');
if ($stock where('id', $productId)
->dec('stock')
->update();
$orderId = Db::name('order')->insertGetId([
'user_id' => $userId,
'product_id' => $productId,
'status' => 0,
'create_time' => time()
]);
Db::commit();
// 异步处理后续逻辑
Queue::push('appjobSeckillAfter', [
'order_id' => $orderId
]);
return $orderId;
} catch (Exception $e) {
Db::rollback();
throw $e;
} finally {
Cache::delete($lockKey);
}
}
}
三、性能优化方案
1. 数据库优化
// 数据库配置 config/database.php
return [
// 主库配置
'default' => env('database.driver', 'mysql'),
'connections' => [
'mysql' => [
'type' => 'mysql',
'hostname' => env('database.hostname', '127.0.0.1'),
'database' => env('database.database', ''),
'username' => env('database.username', 'root'),
'password' => env('database.password', ''),
'hostport' => env('database.hostport', '3306'),
'charset' => 'utf8mb4',
'deploy' => 1, // 分布式部署
'rw_separate' => true, // 读写分离
'master_num' => 2, // 主库数量
'slave_no' => '', // 指定从服务器序号
'fields_strict' => true,
'break_reconnect' => true,
'fields_cache' => false,
'prefix' => 'tp_',
'trigger_sql' => env('app_debug', true),
],
// 从库配置
'mysql_slave' => [
'type' => 'mysql',
'hostname' => env('database.slave_hostname', '127.0.0.1'),
'database' => env('database.database', ''),
'username' => env('database.slave_username', 'root'),
'password' => env('database.slave_password', ''),
'hostport' => env('database.slave_hostport', '3306'),
'charset' => 'utf8mb4',
'prefix' => 'tp_',
]
],
// 其他配置...
];
2. 缓存策略
// 多级缓存实现
namespace appcommoncache;
use thinkfacadeCache;
class MultiLevelCache
{
// 本地缓存时间(短)
const LOCAL_TTL = 60;
// 分布式缓存时间(长)
const DIST_TTL = 3600;
public static function get($key)
{
// 先查本地缓存
$value = apcu_fetch($key);
if ($value !== false) {
return $value;
}
// 再查分布式缓存
$value = Cache::get($key);
if ($value !== null) {
// 回填本地缓存
apcu_store($key, $value, self::LOCAL_TTL);
return $value;
}
return null;
}
public static function set($key, $value, $ttl = null)
{
$ttl = $ttl ?? self::DIST_TTL;
apcu_store($key, $value, min($ttl, self::LOCAL_TTL));
Cache::set($key, $value, $ttl);
}
}