Laravel 中使用 Redis 作为缓存

Posted by

为加速 Web 应用程序的最简单方法之一是缓存计算速度慢的数据,这样下次页面加载时就不必重新计算。

Laravel 是一个使用 PHP 构建的 Web 应用程序框架。

它是一个使用提供程序和依赖注入进行代码组织的框架。它遵循模型-视图-控制器设计模式。 Laravel 重用不同框架的现有组件,这有助于创建 Web 应用程序。这样设计的网络应用程序更加结构化和实用。

Redis 是一个磁盘持久键值数据库,支持多种数据结构或数据类型,这意味着虽然它支持基于映射键值的字符串来存储和检索数据(类似于传统数据库中支持的数据模型) ),它还支持其他复杂的数据结构,例如列表和集合。

Laravel 支持使用 Redis,它使用缓存进行临时数据存储,以加快执行数据库查询和获取反馈的过程,从而减少拉取数据所花费的时间。

什么是缓存

缓存是存储数据的组件,以便可以快速满足未来对数据的请求。存储在缓存中的数据可能是早期计算的结果或存储在其他地方的数据的副本。因此,每当需要相同的结果时,都可以使用已经计算并存储在其他地方的缓存值,因此无需对同一事物进行重复计算。

Redis 使用服务器辅助的客户端缓存,这允许它利用应用程序服务器的可用内存,与数据库节点相比,这些服务器通常是不同的计算机,直接在应用程序端存储一些数据库信息子集。通常,当需要一些数据时,应用服务器会向数据库询问这些信息,但在 Redis 中,记录是从本地缓存中检索的。

在使用 Redis 之前,必须在您的 Windows 或 Mac 操作系统上进行设置。如果您没有安装它,您可以按照教程的 MacOS 或 Windows 版本中给出的说明进行设置。

Redis 的好处

Redis 充当临时数据库,用于存储高达 512 MB 的数据,并允许更高效、更快速地执行数据查找,这将证明在大规模应用程序中很有用。

Redis 采用了主从数据复制结构,这意味着从节点始终监听主节点,当主节点更新数据时,从节点也更新数据。所有这些都可以异步完成。

Redis 使用了一种称为 Redis Hashing 的内置哈希机制,它以 key 和 map 的形式存储信息。

Redis 获取和设置方法

Get:从本地缓存中获取关键示例博客并返回其值。 Get 方法只存储字符串并且会返回一个错误——key 存储散列值或其他。

Set:此方法设置一个关键示例博客来保存字符串值。如果键已经存在,那么它将覆盖该键的值,无论其类型如何,除非另有说明。

设置 Laravel

首先,我们需要在本地机器上创建一个新的 Laravel 实例。我们从命令行创建一个名为 laravel-redis 的新 Laravel 项目,进入新创建的包含我们文件的目录,然后运行应用程序:

composer create-project laravel/laravel laravel-redis
cd laravel-redis
php artisan serve

接下来,在我们的应用程序上使用 Redis 之前,我们需要使用 composer 在我们的应用程序中安装 predis 包。 Predis 是一个完全用 PHP 编写的 Redis 客户端,不需要任何额外的扩展。在终端上运行以下命令来安装 Predis:

安装 Redis

composer require predis/predis

安装完成后,我们可以在 config/database.php 中找到我们的 Redis 配置设置。在文件中,您将看到一个包含 Redis 服务器的 redis 数组。默认情况下,客户端设置为 phpredis,由于本教程使用的是 predis,因此将客户端更改为 predis:

'redis' => [

  'client' => env('REDIS_CLIENT', 'predis'),

  'options' => [
      'cluster' => env('REDIS_CLUSTER', 'redis'),
      'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
  ],

  'default' => [
      'url' => env('REDIS_URL'),
      'host' => env('REDIS_HOST', '127.0.0.1'),
      'password' => env('REDIS_PASSWORD', null),
      'port' => env('REDIS_PORT', '6379'),
      'database' => env('REDIS_DB', '0'),
  ],

],

您可以根据您的 URL 将默认设置修改为您自己的自定义设置并添加密码.

完成后,继续在 .env 文件中注册您的 REDIS_CLIENT:

REDIS_CLIENT=predis

查询blog

添加我们的函数来获取所有博客

use App\Models\Blog;
use Illuminate\Support\Facades\Redis;

public function index($id) {

  $cachedBlog = Redis::get('blog_' . $id);

  if(isset($cachedBlog)) {
      $blog = json_decode($cachedBlog, FALSE);

      return response()->json([
          'status_code' => 201,
          'message' => 'Fetched from redis',
          'data' => $blog,
      ]);
  }else {
      $blog = Blog::find($id);
      Redis::set('blog_' . $id, $blog);

      return response()->json([
          'status_code' => 201,
          'message' => 'Fetched from database',
          'data' => $blog,
      ]);
  }
}

在上面的代码中,我们首先在 Redis 中检查带有 blog_ + id 的键,如果存在则以 JSON 格式返回。如果key还没有设置,那么我们去数据库,获取key,在Redis中使用blog_+id设置。

接下来,我们在 routes/web.php 中创建一个路由,当在 Postman 中使用时,我们的 API 可以与之交互。这条路由将指向我们的 BlogController,特别是我们获取博客的函数:

Route::get('/blogs/{id}', 'BlogController@index');

更新

在这个过程中,我们会得到一个单独的博客并在数据库中更新它。完成后,我们将在 Redis 中查找密钥并将其删除,然后使用更新的博客的 id 创建一个新密钥。

首先,我们在 BlogController 中创建更新函数:

public function update(Request $request, $id) {

  $update = Blog::findOrFail($id)->update($request->all());

  if($update) {

      // Delete blog_$id from Redis
      Redis::del('blog_' . $id);

      $blog = Blog::find($id);
      // Set a new key with the blog id
      Redis::set('blog_' . $id, $blog);

      return response()->json([
          'status_code' => 201,
          'message' => 'User updated',
          'data' => $blog,
      ]);
  }

}

在上面的代码中,我们得到了博客的id,在数据库中更新,然后用blog_+id删除了key。删除密钥后,我们使用 id 从数据库中获取博客并在 Redis 中创建一个新密钥。

完成后,我们可以创建我们的路线:

Route::post('/blogs/update/{id}', 'BlogController@update');

删除

最后一部分,我们将从数据库中删除一个博客,然后从 Redis 中删除密钥。首先,添加删除功能:

public function delete($id) {

  Blog::findOrFail($id)->delete();
  Redis::del('blog_' . $id);

  return response()->json([
      'status_code' => 201,
      'message' => 'Blog deleted'
  ]);
}

这将获取 id 并从数据库中删除博客。然后,它将从 Redis 中删除密钥。添加我们的功能后,我们可以创建一个路由。

Route::delete('/blogs/delete/{id}', 'BlogController@delete';

我们讨论了缓存和它是什么,Redis 和它的好处,以及如何在 Laravel 中使用 Redis 来临时缓存数据以加速数据库查询。我们还完成了使用键在 Redis 中更新和删除数据的步骤,并有效地实现了 Get/Set 方法。