Cache 是不是在 API 路由中工作,我们应该使用它吗?

Posted

技术标签:

【中文标题】Cache 是不是在 API 路由中工作,我们应该使用它吗?【英文标题】:Does Cache work in an API route and should we use it?Cache 是否在 API 路由中工作,我们应该使用它吗? 【发布时间】:2020-10-04 01:42:40 【问题描述】:

我正在创建一个 API。在这个 API 中,我在中间件和控制器中多次访问数据库中的(权限)表。我在想,与其多次访问数据库,不如调用一次,多次使用。调用一次后,我可以将其存储在服务提供者的缓存中。但我不确定这是否是一个好方法,因为 API 路由不会加载会话等所有服务。

还有其他方法,例如将数据存储到配置中。或者创建一个类并为其创建一个外观,然后在需要时调用它。但是我很好奇缓存是否可以在 API 路由中工作,这是一个好主意吗?

【问题讨论】:

路由的类型无关紧要,它们只是有不同的中间件堆栈...如果您为相同的数据多次访问某些内容并且它不经常更改,那么缓存可能是一个不错的选择选项,但是您应该进行测试以确保您实际上从使用它中获得了好处......您也有不同的方式来查看这里的缓存,您可以只拥有一个运行时缓存,其中一个对象在第一次之后只是持有这些权限当您检索它们时,或者您可以将它们放在您直接访问的实际缓存存储中 @lagbox 嘿实际上运行时缓存将是一个很好的解决方案,因为我不需要运行后的数据。而且我想我以后不需要清除它。我该如何使用运行时缓存? 简而言之,您可以制作一些东西来为您检索所有权限(或者如果它已经检索到它们,只需返回它缓存的内容)并将其绑定到容器并在您调用它时调用它想要检索权限,现在一件事情可以将它们存储在一个数组中,并且它不会每次都继续访问数据库......一个概念的超级简单概述......你想要实现这样的事情吗跨度> 肯定会这样做。谢谢@lagbox。 【参考方案1】:

好的,根据@lagbox 的建议,我创建了一个简单的类。

namespace App\Helpers;

use App\Permission;

class Provide

    public $permissions = [];

    function __construct() 
        $this->permissions = Permission::whereNotNull('route_name')->get();
    

这可能会有所不同,它只是一个将一些集合数据保存在其中的类。我将其命名为provide 以保持其通用性,以防我将来需要其他数据而不是权限。当然这个类可以更详细一点,但只是为了存储和返回权限就足够了。

然后我将它绑定为我的 AppServiceProvider 中的单例,只运行一次。

public function register()

    $this->app->singleton('App\Helpers\Provide', function ($app) 
        return new \App\Helpers\Provide();
    );

当我需要它时,我会这样称呼它

$provide->permissions->toArray() 

该系列的所有功能从头到尾随处可见。是的,这可能看起来像是过度杀伤或滥用 IoC,但在我的情况下,这种超级简单的方法是一个极好的解决方案。

【讨论】:

以上是关于Cache 是不是在 API 路由中工作,我们应该使用它吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 MVC 结构中工作时,DAO 是不是与 Model 相同? [复制]

QWebView 类是不是在 Qt 5.0.0 中工作?

新的 Microsoft Lync 2010 客户端 API 是不是可以在非 IE 浏览器中工作?

jOOQ 3.15.1 新的 ad-hoc 转换 API 是不是在 Kotlin 中工作?

WebRequest.CachePolicy 是不是应该在 IIS 中运行的代码中工作?

RadioButtons 是不是应该在 VS 2022 Preview 17.1/MAUI preview 10 中工作?