laravel添加api缓存系统

摘要:
前期知识:拉拉威尔框架事件和听众的基本知识;中间件缓存在以下代码中实现:1.首先,在app/Providers/EventServiceProvider中在PHP中添加相应的事件和侦听器。phpnamespaceAppListeners;useCache;useIlluminationFoundationHttpEventsRequestHandled;classCacheApiResult{/***创建事件监听器。**@returnvoid*/publicfunction__construct(){//}/***处理事件。**@ParamRequestHandled$event*@returnvoid*/publicfunctionhandle{//$event-˃response-˃isCached属性添加到后来的中间件中,而对象本身没有此属性。

项目背景:最初是想给接口加缓存,但是不想每个接口添加缓存代码,就写了个统一的缓存系统。

技术方案:

  1. 本项目使用laravel框架
  2. 监听requestHanled事件写入缓存
  3. 添加apiCache中间件,对每个get访问进行拦截,检查是否有缓存,如果有,就读取缓存就返回,如果没有,就执行下一个中间件。

前置知识:

  1. laravel框架基础知识
  2. event(事件)和listener(监听器);
  3. middleware(中间件)
  4. cache

下面是代码实现:

1,首先在app/Providers/EventServiceProvider.php 里添加对应的event和listener。

 
use IlluminateFoundationHttpEventsRequestHandled;
*
*
*
protected $listen = [
    RequestHandled::class => [
        AppListenersCacheApiResult::class
    ]
];

然后在项目的根目录执行 php artisan event:generate 这个命令用来生成event文件和listener文件;event用的是框架自带的RequestHandled事件,所以不会有改动,这个命令只会在app/Listeners文件夹下添加一个CacheApiResult.php文件。 文件内容如下

 
<?php
namespace AppListeners;
use Cache;
use IlluminateFoundationHttpEventsRequestHandled;
class CacheApiResult
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }
    /**
     * Handle the event.
     *
     * @param  RequestHandled  $event
     * @return void
     */
    public function handle(RequestHandled $event)
    {
        //$event->response->isCached这个属性是在后面的中间件里面加的,对象本身是没有这个属性的。
        if($event->request->isMethod('GET') && !isset($event->response->isCached) ){
            //这里的key生成规则是我自己定义的,可以按需更改。
            $uri = $event->request->getUri();
            $params = $event->request->all();
            $keyStr = $uri.'::';
            foreach($params as $key => $val){
                $keyStr = $keyStr.$key.':'.$val.'::';
            }
            $key = md5($keyStr);
            $data = $event->response->getContent();
            Cache::set($key, $data, 1);
            //这里缓存一分钟,目前看来分钟好像是最小粒度了,以后需要再改进;可以按需改成其他缓存
            }
    }
}

然后需要添加一个中间件 添加app/Http/Middleware/ApiCache.php文件

 
<?php
namespace AppHttpMiddleware;
use Closure;
use Cache;
class ApiCache
{
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if($request->isMethod('GET')){
            $uri = $request->getUri();
            $params = $request->all();
            $keyStr = $uri.'::';
            foreach($params as $key => $val){
                $keyStr = $keyStr.$key.':'.$val.'::';
            }
            $key = md5($keyStr);
            $data = Cache::get($key);
            if($data){
                $data = json_decode($data,true);
                $response = response()->json($data);
                $response->isCached = true;//添加这个属性是为了避免监听器重复写入缓存
                return $response;
            }
        }
        return $next($request);
    }
}

然后要去注册这个中间件,让每个请求都经过它。

在app/Http/Kernel.php文件的$routeMiddleware中添加一个元素 'apiCache' => AppHttpMiddlewareApiCache::class,

 
protected $routeMiddleware = [
        'auth' => AppHttpMiddlewareAuthenticate::class,
        'auth.basic' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
        'bindings' => IlluminateRoutingMiddlewareSubstituteBindings::class,
        'cache.headers' => IlluminateHttpMiddlewareSetCacheHeaders::class,
        'can' => IlluminateAuthMiddlewareAuthorize::class,
        'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,
        'change' => AppHttpMiddlewareChangeJsonToForm::class,
        'signed' => IlluminateRoutingMiddlewareValidateSignature::class,
        'throttle' => IlluminateRoutingMiddlewareThrottleRequests::class,
        'verified' => IlluminateAuthMiddlewareEnsureEmailIsVerified::class,
        'apiCache' => AppHttpMiddlewareApiCache::class,
    ];

这样就完成了这个缓存系统。其中的缓存我用的是redis,这个可以按需配置,不了解可以看一下lavarel的缓存知识。

这只是一个初级版,以后有需要可以升级一下。

原创地址:https://blog.csdn.net/u010965027/article/details/87934651

免责声明:文章转载自《laravel添加api缓存系统》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C++——std::vector相关 (转)Scrum在中国——企业实施情况调查实录下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

微信小程序-获取当前城市位置

微信小程序-获取当前城市位置 , 在一些小程序,会根据不同的城市,展现不同的商品,和内容,这就需要获取位置,转换位城市来处理。     1, 获取当前地理位置,首先要拿到用户的授权wx.openSetting;        调起客户端小程序设置界面,返回用户设置的操作结果。设置界面只会出现小程序已经向用户请求过的权限 ,若没位置授权,则弹出。  2,微信...

mysql 缓存机制

了解mysql缓存吗(顺丰) mysql缓存机制就是缓存sql 文本及缓存结果,用KV形式保存再服务器内存中,如果运行相同的sql,服务器直接从缓存中去获取结果,不需要在再去解析、优化、执行sql。 如果这个表修改了,那么使用这个表中的所有缓存将不再有效,查询缓存值得相关条目将被清空。表中得任何改变是值表中任何数据或者是结构的改变,包括insert,upd...

ZK框架笔记5、事件

        事件是org.zkoss.zk.ui.event.Event类,它通知应用程序发生了什么事情。每一种类型的事件都由一个特定的类来表示。         要响应一个事件,应用程序必须为事件注册一个或更多事件监听器。有3种方式可以为一个组件事件监听器。   (1)一般制定onXXX事件监听器为组件的属性,作为属性定义的事件监听器。 &...

Nginx作为静态web服务器——缓存原理

浏览器缓存 ​ 客户端无缓存的情况下 ​ 客户端有缓存的情况下 ​ 校验过期机制 ​ 本地客户端会检查Cache-Control(max-age)缓存是否过期,(max-age)为过期时间 Last-Modified 上次修改时间 配合If-Modified-Since或者If-Unmodified-Since使用 对比上次修改时间验证资源是否需要更...

(转载).net 缓存处理

概述 在ASP.NET应用程序构建过程中,为了提高应用程序的性能,缓存处理无疑是一个非常重要的环节。通常,我们将一些频繁被访问的数据,以及一些需要大量处理时间得出来的数据缓存在内存中,从而提高性能。例如,如果程序需要处理一张报表,这张报表的数据是关联的几张数据库表,并通过大量的计算得到的数据。我们知道表关联是比较耗时的,如果关联之后得出的数据再进行聚合排序...

Laravel之缓存

一.默认缓存的配置 缓存配置位于config/cache.php,你可以使用memcache,redis,数据库缓存,文件缓存等.默认是文件缓存 二.缓存获取 1.获取 $value = Cache::get('key'); // 默认值 $value = Cache::get('key','default'); // 访问多个缓存存储 $value...