spiritix/lada-cache

基于Redis的、自动化的、可扩展的Laravel数据库缓存层

v5.4 2024-03-17 12:52 UTC

README

基于Redis的、完全自动化的、可扩展的Laravel数据库缓存层

Build Status Code Climate Total Downloads Latest Stable Version Latest Unstable Version License

需要贡献者!请查看开放性问题,如果您有兴趣通过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虽然支持标签,但实现非常糟糕且缓慢)

如果您仍然想使用其他存储后端,请随时贡献。

需求

安装

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许可证分发。