spiritix / lada-cache
基于Redis的、自动化的、可扩展的Laravel数据库缓存层
Requires
- php: >=7.3
- illuminate/database: ^7.0|^8.0|^9.0|^10.0|^11.0
- illuminate/redis: ^7.0|^8.0|^9.0|^10.0|^11.0
- illuminate/support: ^7.0|^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- barryvdh/laravel-debugbar: ^3.2
- mockery/mockery: ^1.3
- orchestra/testbench: ^6.0|^7.0|^8.0|^9.0
- phpunit/phpunit: ^9.0|^10.0
Suggests
- barryvdh/laravel-debugbar: Provides debug information about the cache
This package is auto-updated.
Last update: 2024-09-17 14:10:16 UTC
README
基于Redis的、完全自动化的、可扩展的Laravel数据库缓存层
需要贡献者!请查看开放性问题,如果您有兴趣通过Hangouts快速了解,请发送电子邮件。
目录
有关此库如何工作以及如何调试的更多信息,请参阅Wiki。
功能
- 自动缓存所有数据库查询
- 具有高粒度的智能缓存失效
- 与现有代码兼容,设置后无需更改
- 可以仅缓存特定模型或排除某些模型
- 使用Laravel Redis(支持集群)
版本兼容性
性能
使用Lada Cache获得性能提升的范围在5%到95%之间。这严重取决于您的查询数量和复杂性。您的应用程序每个请求发出的(冗余)查询越多,查询越复杂,性能提升就越大。另一个需要考虑的重要因素是查询返回的数据量,如果查询返回了500MB的数据,Lada Cache根本不会使其更快。根据经验,典型Laravel Web应用程序的性能提升大约在10-30%之间。
除了性能提升之外,使用Lada Cache的另一个基本原因是减少了数据库服务器的负载。根据您的基础设施,这可能导致合理的成本降低,并为扩展应用程序提供新的可能性。
为什么选择它?
许多Web应用程序大量使用数据库。特别是使用Eloquent这样的ORM时,查询经常重复且效率不高。解决此问题的最常见方法之一是缓存数据库查询。
大多数RDBMS提供内部缓存层(例如Mysql Query Cache)。不幸的是,这些缓存系统有一些非常严重的限制
- 它们不缓存跨多表的查询(例如,如果查询使用连接)
- 失效粒度非常低(如果单行更改,则整个表将从缓存中删除)
- 它们不是分布式的,如果您有多个数据库服务器,则缓存将在所有服务器上创建
- 它们不可扩展
另一方面,Laravel提供了手动缓存特定查询的可能性。问题是它不会自动失效缓存的查询,您需要在影响数据可能更改的所有位置手动使它们过期或失效。
此库为所有这些问题提供了解决方案。安装、扩展并轻松后退。
为什么只选择Redis?
当您查看源代码时,可能已经发现了,这个库直接基于Laravel Redis构建,而不是Laravel Cache,从一般角度来看这会更合理。然而,做出这个决定有几个重要的原因
- 存储必须在内存中(否则没有太多意义)
- 存储必须易于扩展
- 存储必须支持标签(Laravel Cache虽然支持标签,但实现非常糟糕且缓慢)
如果您仍然想使用其他存储后端,请随时贡献。
需求
- PHP 8.0+
- Redis 2+
- Laravel 9.0+(对于旧版本请参阅版本兼容性)
- PhpRedis可以提高缓存性能(可选但推荐)
- Laravel Debugbar提供调试信息(可选)
安装
Lada Cache可以通过在项目的composer.json
中要求spiritix/lada-cache
包来通过Composer安装。或者简单地运行以下命令
composer require spiritix/lada-cache
Lada Cache服务提供者将自动通过包发现安装。
最后,所有您的模型都必须包含Spiritix\LadaCache\Database\LadaCacheTrait
特质。创建一个包含特质并扩展所有模型的基础模型类是一种良好的实践。
class Car extends \Illuminate\Database\Eloquent\Model { use \Spiritix\LadaCache\Database\LadaCacheTrait; // ... }
不要试图仅让特定的模型包含Lada Cache特质,这会导致意外的行为。在配置中,您可以找到包括或排除特定模型的可能性。
配置
使用以下命令将lada-cache.php
配置文件发布到您的配置文件夹
php artisan vendor:publish
控制台命令
您可以通过运行以下命令截断缓存
php artisan lada-cache:flush
如果您想暂时禁用缓存(例如在运行迁移之前),请使用以下命令
php artisan lada-cache:disable php artisan lada-cache:enable
已知问题和限制
- 不支持与原始SQL查询一起使用。这需要实现一个SQL解析器,这相当困难且非常低效。只要您只使用原始查询来读取数据,它就不会被缓存。只有当您使用原始查询来写入数据时(您本来就不应该这样做),才会出现严重问题。
- 如果像
DB::connection('foo')
那样使用,则不支持与多个连接一起使用。相反,在相关模型中指定protected $connection = 'foo';
属性。 - 迁移执行后必须手动截断缓存。
- 悲观锁定(sharedLock,lockForUpdate)需要使用原始SQL查询。
- 一些第三方包与Lada Cache配合得不太好。大多数问题的解决方案可以在这里找到。
贡献
欢迎以任何形式进行贡献。请在提交pull请求之前考虑以下指南
- 编码标准 - 它遵循PSR-2
- 添加测试! - 如果您的PR没有测试,则不会被接受。
- 创建功能分支 - 我不会从您的master分支中拉取。
许可证
Lada Cache是免费软件,根据MIT许可证分发。