学习笔记20251220
消息队列:基于Redis的轻量级实践
- 核心:使用Redis ZSET(有序集合)是实现延迟队列的经典方案。
score存储执行时间戳,member存储任务数据,通过轮询获取到期的任务。 - 应用场景扩展:
- 订单超时关闭:下单30分钟后未支付,触发关闭任务。
- 异步通知:短信、邮件发送,失败后可重试。
- 批量数据处理:如导出生报表,避免HTTP请求超时。
- 更新第三方信息:比如微信授权信息
- 优劣分析:
- 优点:实现简单,无需引入RabbitMQ等重型组件,利用现有Redis,非常适合中小型项目。
- 缺点:可靠性、监控、高级特性(如ACK确认)不如专业消息队列。需自行处理崩溃后的任务恢复。
- 对比点:这是与使用
RabbitMQ或Kafka的系统(如一些Java项目)的核心差异之一。
自动依赖的实现
- 原理:
- 自动依赖解析:正是通过
Reflection(反射)实现,与你写的Container类思想一致。 - 绑定与单例:可以将接口绑定到实现,并控制是否单例。
- 无处不在:控制器构造函数、中间件、服务类等都能享受自动注入。
- 自动依赖解析:正是通过
简单实现说明
<?php
class LoginServices
{
public function login()
{
return 1;
}
}
class Index
{
protected $service;
public function __construct(LoginServices $loginServices)
{
$this->service = $loginServices;
}
public function index()
{
return $this->service->login();
}
}
// 简化版示例,展示 ThinkPHP 内部工作原理
class Container
{
/**
* @throws ReflectionException
*/
public function make($className)
{
// 1. 创建反射类
$reflector = new ReflectionClass($className);
// 2. 获取构造函数
$constructor = $reflector->getConstructor();
if (!$constructor) {
// 没有构造函数,直接实例化
return new $className();
}
// 3. 获取构造函数参数
$parameters = $constructor->getParameters();
$dependencies = [];
// var_dump($parameters);
foreach ($parameters as $parameter) {
// 4. 获取参数的类型声明
$type = $parameter->getType();
if ($type && !$type->isBuiltin()) {
// 5. 如果是类类型,递归解析
$dependencyClassName = $type->getName();
$dependencies[] = $this->make($dependencyClassName);
} else {
// 6. 基本类型或未声明类型,尝试从配置获取或报错
throw new Exception("无法解析参数: " . $parameter->getName());
}
}
// 7. 实例化类,传入解析好的依赖
return $reflector->newInstanceArgs($dependencies);
}
}
$container = new Container();
$action = 'index';
var_dump($container->make(Index::class)->$action());
作者:需要成长的小哥
出处:https://chuna2.787528.xyz/myDreamRealization/
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
如果希望更容易地发现我的新博客,记得在左下角点个“关注我”哦。(如有错误之处,还请指正!)
出处:https://chuna2.787528.xyz/myDreamRealization/
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
如果希望更容易地发现我的新博客,记得在左下角点个“关注我”哦。(如有错误之处,还请指正!)

浙公网安备 33010602011771号