Michael-Rubel/lada-cache

此包已被废弃,不再维护。没有建议的替代包。

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

0.0.2 2023-02-01 09:22 UTC

README

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

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

需要贡献者!请查看开放问题,如果您有兴趣通过Hangouts快速介绍,请发送电子邮件给我。

目录

有关此库的工作原理和如何调试的更多信息,请参阅Wiki

特性

  • 自动缓存所有数据库查询
  • 具有高粒度的智能缓存失效
  • 与现有代码兼容,设置后无需更改
  • 可以仅缓存特定模型或排除某些模型
  • 使用Laravel Redis(支持集群

版本兼容性

Laravel PHP Lada Cache
5.1-5.6 5.6.4+ 2.x
5.7-5.8 7.1+ 3.x
6.x 7.2+ 4.x
7.x 7.2+ 5.x
8.x 7.3+ 5.x
9.x 8.0+ 5.x

性能

使用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配合得不太好。大多数问题的解决方案可以在这里找到这里

贡献

欢迎任何形式的贡献。在提交拉取请求之前,请考虑以下指南

  • 编码标准 - 这是PSR-2
  • 添加测试! - 如果您的PR没有测试,它将不会被接受。
  • 创建功能分支 - 我不会从您的master分支拉取。

许可协议

Lada Cache是在MIT许可证下分发的免费软件。