Tìm hiểu về Redis trong Laravel
Bài đăng này đã không được cập nhật trong 7 năm
GIỚI THIỆU
Redis
là một dự án store mã nguồn mở để lưu các cặp dữ liệu kiểu key-value
. Nó thường được gọi là server cấu trúc dữ liệu vì các khoá có thử chứa dữ liệu kiểu strings, hashes, lists, sets, và sorted sets. Trước khi sử dụng Redis
với Laravel, bạn sẽ cần cài thư viện predis/predis (~1.0) bằng Composer.
Cấu hình
Cấu hình cho Redis
nằm tại file config/database.php
. Trong file này, bạn sẽ thấy một mảng redis
có chứa thông số tới Redis
server:
'redis' => [
'cluster' => false,
'default' => [
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
],
],
Cấu hình server mặc định cần cung cấp đầy dủ để phát triển. Tuy nhiên, bạn hoàn toàn thoải mái để thay đổi các giá trị này dựa theo môi trường của bạn. Đơn giản chỉ cần cung cấp tên Redis server
và chỉ định host
và port
mà server sử dụng.
Thông số cluster
sẽ cho Laravel Redis client biết để thực hiện phân mảnh trên các node
của Redis
, cho phép bạn tạo pool cho các node và tạo một lượng lớn RAM
có thể sử dụng. Tuy nhiên, chú ý là việc phân mảnh phía client
không xử lý khi thất bại; dó đó, cái này phù hợp với dữ liệu đã được cache có thể dùng được trong các data store chính khác.
Thêm vào đó, bạn có thể khai báo một mảng options trong kết nối tới Redis
, cho phép bạn chỉ định một set các thông số client
của Predis
.
Nếu Redis server
yêu cầu đăng nhập, bạn cần phải cung cấp mật khảu bằng cách thêm thông số password vào trong mảng cấu hình cho Redis server
.
Lưu ý: Nếu bạn có Redis PHP extension cài thông qua PECL, bạn cần phải đổi tên của Redis trong config/app.php.
Sử dụng cơ bản
Bạn có thể tương tác với Redis
bằng cách gọi một số hàm trong Redis facade
. Redis facade
hỗ trợ các hàm động, nghĩa là bạn có thể gọi bất cứ câu lệnh Redis
trong facade
và nó sẽ được truyền trực tiếp tới Redis
. Ở ví dụ này, chúng ta sẽ gọi GET trên Redis bằng cách gọi hàm get
trong Redis facade
:
<?php
namespace App\Http\Controllers;
use Redis;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* Show the profile for the given user.
*
* @param int $id
* @return Response
*/
public function showProfile($id)
{
$user = Redis::get('user:profile:'.$id);
return view('user.profile', ['user' => $user]);
}
}
Dĩ nhiên, như đã nói ở trước, bạn có thể gọi bất cứ câu lệnh Redis
nào trên Redis facade
. Laravel sử dụng các hàm magic để truyền câu lệnh tới Redis server
, vì thế, đơn giản chỉ cần truyền tham số mà lệnh Redis
muốn:
Redis::set('name', 'Taylor');
$values = Redis::lrange('names', 5, 10);
Một cách khác, bạn cũng có thể truyền câu lệnh tới server sử dụng hàm command
, hàm này nhận tên trong tham số đầu tiên và một mảng các giá trị ở tham số thứ hai:
$values = Redis::command('lrange', ['name', 5, 10]);
Sử dụng nhiều Redis connection
Bạn có thể lấy một đối tượng kết nối Redis bằng cách gọi tới hàm Redis::connection
:
$redis = Redis::connection();
Lệnh này sẽ cho bạn đối tượng kết nối tới Redis server
mặc định. Nếu bạn không sử dụng server clustering
nào, bạn có thể truyền vào tên server trong hàm connection để lấy một server chỉ định được khai báo trong cấu hình Redis
:
$redis = Redis::connection('other');
Các câu lệnh pipelining
Pipelining
nên được sử dụng khi bạn cần gửi nhiều câu lệnh tới server trong một yêu cầu. Hàm pipeline
nhận một tham số: một Closure
nhận đối tượng Redis
. Bạn có thể cung cấp tất cả các câu lệnh tới đối tượng Redis
này và chúng sẽ được thực thi trong một yêu cầu:
Redis::pipeline(function ($pipe) {
for ($i = 0; $i < 1000; $i++) {
$pipe->set("key:$i", $i);
}
});
Pub / Sub
Laravel
cũng cung cấp một interface tiện ích cho hai lệnh của Redis
là publish
và subscribe
. Những câu lệnh này cho phép bạn listen bản tin trên một "channel". Bạn có thể publish
bản tin tới một channel từ ứng dụng khác, hoặc thậm chí sử dụng một ngôn ngữ lập trình khác, cho phép trao đổi dễ dàng giữa các ứng dụng và processes.
Đầu tiện, hãy cùng nhau thiết lập một listener trên một channel thông qua Redis sử dụng hàm subscribe. Chúng ta sẽ đặt hàm gọi này bên trong câu lệnh Artisan
vì việc gọi hàm subscribe
bắt đầu một tiến trình chạy lâu:
<?php
namespace App\Console\Commands;
use Redis;
use Illuminate\Console\Command;
class RedisSubscribe extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'redis:subscribe';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Subscribe to a Redis channel';
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
Redis::subscribe(['test-channel'], function($message) {
echo $message;
});
}
}
Lúc này, chúng ta có thể publish
bản tin tới channel sử dụng publish
:
Route::get('publish', function () {
// Route logic...
Redis::publish('test-channel', json_encode(['foo' => 'bar']));
});
Đăng kí subscription sử dụng wildcard
Sử dụng hàm psubscribe
, bạn có thể subscribe
tới một channel dạng wildcard, khá hữu dụng để bắt tất cả các bản tin trên mọi channel. Tên $channel sẽ được truyền ở tham số thứ hai trong Closure
:
Redis::psubscribe(['*'], function($message, $channel) {
echo $message;
});
Redis::psubscribe(['users.*'], function($message, $channel) {
echo $message;
});
Tài liệu tham khảo https://laravel.com/docs/5.4/redis#interacting-with-redis
All rights reserved