Defective Code Logo

Total Downloads Latest Stable Version Latest Stable Version

English | العربية | বাংলা | Bosanski | Deutsch | Español | Français | हिन्दी | Italiano | 日本語 | 한국어 | मराठी | Português | Русский | Kiswahili | தமிழ் | తెలుగు | Türkçe | اردو | Tiếng Việt | 中文

Giới thiệu

Recall là một gói lưu trữ bộ nhớ đệm phía khách hiệu suất cao cho Laravel. Nó tận dụng tính năng lưu trữ bộ nhớ đệm phía khách của Redis 6 với việc tự động vô hiệu hóa, giúp giảm đáng kể số lần truy cập Redis và độ trễ. Được xây dựng đặc biệt cho các môi trường Laravel Octane, nó sử dụng APCu hoặc Swoole Table làm lớp bộ nhớ đệm cục bộ luôn được đồng bộ hóa với Redis thông qua các thông điệp vô hiệu hóa.

Khi bạn lấy một giá trị từ Redis, Recall sẽ lưu trữ nó cục bộ. Khi giá trị đó thay đổi trong Redis (từ bất kỳ khách hàng nào), Redis tự động thông báo cho Recall để vô hiệu hóa bản sao cục bộ. Điều này mang lại cho bạn tốc độ của việc lưu trữ bộ nhớ đệm trong bộ nhớ với các đảm bảo về tính nhất quán của Redis.

Tính năng chính

Ví dụ

// Cấu hình recall làm tài xế bộ nhớ đệm của bạn
// config/cache.php
'stores' => [
'recall' => [
'driver' => 'recall',
],
],
 
// Sử dụng nó như bất kỳ bộ nhớ đệm Laravel nào
use Illuminate\Support\Facades\Cache;
 
// Cuộc gọi đầu tiên: lấy từ Redis, lưu trữ cục bộ
$user = Cache::store('recall')->get('user:1');
 
// Các cuộc gọi tiếp theo: được phục vụ từ APCu/Swoole Table cục bộ (micro giây)
$user = Cache::store('recall')->get('user:1');
 
// Khi user:1 được cập nhật ở bất kỳ đâu, Redis thông báo cho Recall để vô hiệu hóa
Cache::store('recall')->put('user:1', $newUserData, 3600);
// Bộ nhớ đệm cục bộ sẽ tự động bị vô hiệu hóa trên tất cả các worker

Cài đặt

Cài đặt gói qua Composer:

composer require defectivecode/laravel-recall

Yêu cầu

Cách sử dụng

Cài đặt cơ bản

  1. Thêm bộ nhớ đệm Recall vào config/cache.php của bạn:
'stores' => [
// ... các bộ nhớ đệm khác
 
'recall' => [
'driver' => 'recall',
],
],
  1. Sử dụng bộ nhớ đệm trong ứng dụng của bạn:
use Illuminate\Support\Facades\Cache;
 
// Lưu một giá trị (ghi vào Redis)
Cache::store('recall')->put('key', 'value', 3600);
 
// Lấy một giá trị (cuộc gọi đầu tiên truy cập Redis, các cuộc gọi tiếp theo sử dụng bộ nhớ đệm cục bộ)
$value = Cache::store('recall')->get('key');
 
// Xóa một giá trị
Cache::store('recall')->forget('key');

Cách hoạt động

  1. Đọc lần đầu: Giá trị được lấy từ Redis và lưu trữ trong bộ nhớ đệm APCu/Swoole Table cục bộ
  2. Đọc tiếp theo: Giá trị được phục vụ trực tiếp từ bộ nhớ cục bộ (dưới một mili giây)
  3. Ghi ở bất kỳ đâu: Khi bất kỳ khách hàng nào sửa đổi khóa trong Redis, Redis gửi một thông điệp vô hiệu hóa
  4. Vô hiệu hóa tự động: Recall nhận thông điệp và xóa khóa khỏi bộ nhớ đệm cục bộ
  5. Đọc tiếp theo: Giá trị mới được lấy từ Redis và được lưu trữ cục bộ một lần nữa

Mô hình này đặc biệt mạnh mẽ trong các môi trường Laravel Octane, nơi các worker tồn tại giữa các yêu cầu, cho phép bộ nhớ đệm cục bộ tích lũy và phục vụ nhiều yêu cầu từ bộ nhớ.

Tích hợp Octane

Recall tự động tích hợp với Laravel Octane khi có sẵn:

Không cần cấu hình bổ sung nào. Sự tích hợp là tự động khi Octane được cài đặt.

Cấu hình

Xuất bản tệp cấu hình:

php artisan vendor:publish --tag=recall-config

Điều này tạo ra config/recall.php với các tùy chọn sau:

Bật/Tắt

'enabled' => env('RECALL_ENABLED', true),

Khi bị vô hiệu hóa, Recall sẽ truyền thẳng đến Redis mà không sử dụng lớp bộ nhớ đệm cục bộ. Hữu ích cho việc gỡ lỗi hoặc triển khai dần.

Bộ nhớ Redis

'redis_store' => env('RECALL_REDIS_STORE', 'redis'),

Bộ nhớ cache Laravel được sử dụng cho các hoạt động Redis. Điều này nên tham chiếu đến một bộ nhớ Redis được cấu hình trong config/cache.php của bạn.

Tiền tố bộ nhớ đệm

'cache_prefixes' => [],

Chỉ lưu trữ các khóa khớp với những tiền tố này cục bộ. Để trống để lưu trữ tất cả các khóa.

// Chỉ lưu trữ các khóa người dùng và cài đặt cục bộ
'cache_prefixes' => ['users:', 'settings:', 'config:'],

Điều này hữu ích khi bạn có các khóa có khối lượng lớn thay đổi thường xuyên và không nên được lưu trữ cục bộ.

Cấu hình Bộ nhớ đệm Cục bộ

'local_cache' => [
// Tài xế: "apcu" hoặc "swoole"
'driver' => env('RECALL_LOCAL_DRIVER', 'apcu'),
 
// Tiền tố cho các khóa bộ nhớ đệm cục bộ
'key_prefix' => env('RECALL_LOCAL_PREFIX', 'recall:'),
 
// TTL mặc định tính bằng giây (biện pháp an toàn nếu vô hiệu hóa bị bỏ lỡ)
'default_ttl' => (int) env('RECALL_LOCAL_TTL', 3600),
 
// Kích thước Bảng Swoole (của 2, chỉ dành cho tài xế swoole)
'table_size' => (int) env('RECALL_SWOOLE_TABLE_SIZE', 65536),
 
// Kích thước tối đa mỗi giá trị trong Bảng Swoole (chỉ dành cho tài xế swoole)
'value_size' => (int) env('RECALL_SWOOLE_VALUE_SIZE', 8192),
],

Tài xế APCu (Mặc định)

Tài xế APCu hoạt động với tất cả các môi trường PHP và máy chủ Octane (Swoole, RoadRunner, FrankenPHP). Nó lưu trữ các giá trị đã lưu trữ trong bộ nhớ chia sẻ có thể truy cập từ tất cả các tiến trình PHP.

Yêu cầu:

Tài xế Bảng Swoole

Tài xế Bảng Swoole sử dụng các bảng bộ nhớ chia sẻ của Swoole, cung cấp truy cập nhất quán giữa các coroutine trong cùng một worker. Tốt nhất cho các môi trường Swoole/OpenSwoole.

Mẹo cấu hình:

Người nghe Octane

'listeners' => [
// Kết nối làm ấm khi worker khởi động (giảm độ trễ yêu cầu đầu tiên)
'warm' => env('RECALL_LISTEN_WARM', true),
 
// Xử lý các vô hiệu hóa trong các sự kiện tick (đáp ứng hơn, có một chút độ trễ)
'tick' => env('RECALL_LISTEN_TICK', false),
],

Kết nối Làm ấm

Khi được bật, Recall thiết lập việc đăng ký vô hiệu hóa Redis khi worker Octane khởi động. Điều này loại bỏ độ trễ kết nối trong yêu cầu đầu tiên.

Xử lý Tick

Khi được bật, Recall xử lý các thông điệp vô hiệu hóa vào các sự kiện tick của Octane bên cạnh các sự kiện yêu cầu. Điều này cung cấp sự vô hiệu hóa bộ nhớ đệm đáp ứng hơn với một chút độ trễ bổ sung.

Sử dụng nâng cao

Xử lý Vô hiệu hóa Thủ công

Nếu bạn cần xử lý vô hiệu hóa thủ công (ví dụ: trong một quá trình chạy lâu dài):

use DefectiveCode\Recall\RecallManager;
 
$manager = app(RecallManager::class);
$manager->processInvalidations();

Giải phóng Bộ nhớ đệm Cục bộ

Để xóa chỉ bộ nhớ đệm cục bộ mà không ảnh hưởng đến Redis:

use DefectiveCode\Recall\RecallManager;
 
$manager = app(RecallManager::class);
$manager->flushLocalCache();

Quản lý Kết nối

use DefectiveCode\Recall\RecallManager;
 
$manager = app(RecallManager::class);
 
// Kiểm tra nếu đăng ký vô hiệu hóa đã kết nối
if ($manager->isConnected()) {
// ...
}
 
// Ngắt kết nối thủ công
$manager->disconnect();

Tối ưu hóa

Giới hạn Yêu cầu Worker

Laravel Octane xoay vòng các worker sau một số lượng yêu cầu có thể cấu hình để tránh rò rỉ bộ nhớ. Khi một worker xoay vòng, bộ nhớ đệm cục bộ của nó được làm sạch. Tăng giới hạn này cho phép bộ nhớ đệm cục bộ của Recall tồn tại lâu hơn, cải thiện tỷ lệ trúng bộ nhớ đệm.

Trong config/octane.php của bạn:

// Mặc định là 500 yêu cầu trước khi xoay vòng
'max_requests' => 10000,

Các giá trị cao hơn có nghĩa là mức sử dụng bộ nhớ đệm tốt hơn nhưng yêu cầu sự tự tin rằng ứng dụng của bạn không có rò rỉ bộ nhớ. Theo dõi mức sử dụng bộ nhớ của worker khi điều chỉnh giá trị này.

Lưu trữ có chọn lọc với Tiền tố

Sử dụng cache_prefixes để kiểm soát các khóa nào được lưu trữ cục bộ. Điều này có giá trị khi:

// config/recall.php
'cache_prefixes' => [
'users:', // Lưu trữ dữ liệu người dùng cục bộ
'settings:', // Lưu trữ cài đặt ứng dụng
'products:', // Lưu trữ danh mục sản phẩm
],

Các khóa không khớp với những tiền tố này sẽ vẫn hoạt động nhưng bỏ qua việc lưu trữ cục bộ, đi thẳng đến Redis.

Cân nhắc về bộ nhớ

Bộ nhớ APCu

APCu chia sẻ bộ nhớ giữa tất cả các tiến trình PHP. Cấu hình giới hạn bộ nhớ trong php.ini:

; Mặc định là 32MB, tăng cho nhu cầu bộ nhớ đệm lớn hơn
apc.shm_size = 128M

Theo dõi mức sử dụng APCu với apcu_cache_info():

$info = apcu_cache_info();
$memory = $info['mem_size']; // Mức sử dụng bộ nhớ hiện tại tính bằng byte

Kích thước Bảng Swoole

Các Bảng Swoole có dung lượng cố định được cấu hình khi tạo. Lập kế hoạch cho kích thước bộ nhớ đệm dự kiến của bạn:

'local_cache' => [
// Số mục tối đa (phải là lũy thừa của 2)
'table_size' => 65536, // 64K mục
 
// Kích thước tối đa của giá trị đã tuần tự bằng byte
'value_size' => 8192, // 8KB mỗi giá trị
],

Mức sử dụng bộ nhớ: table_size × (value_size + overhead). Một bảng với 65536 mục và giá trị 8KB sử dụng khoảng 512MB.

Các mẫu phổ biến

Cấu hình Ứng dụng

// Các cờ và cài đặt tính năng bộ nhớ đệm
$features = Cache::store('recall')->remember('config:features', 3600, function () {
return Feature::all()->pluck('enabled', 'name')->toArray();
});
 
// Khi các cài đặt thay đổi, tất cả các worker tự động nhận được các bản cập nhật

Dữ liệu Tham chiếu Truy cập Thường Xuyên

// Lưu trữ các danh mục sản phẩm
$categories = Cache::store('recall')->remember('categories:all', 3600, function () {
return Category::with('children')->whereNull('parent_id')->get();
});
 
// Lưu trữ các tỷ giá hối đoái
$rates = Cache::store('recall')->remember('rates:exchange', 300, function () {
return ExchangeRate::all()->pluck('rate', 'currency')->toArray();
});

Thay thế Thẻ Bộ nhớ đệm

Recall không hỗ trợ thẻ bộ nhớ đệm, nhưng bạn có thể đạt được chức năng tương tự bằng cách sử dụng các tiền tố:

// Thay vì thẻ, sử dụng các tiền tố nhất quán
Cache::store('recall')->put("blog:posts:{$id}", $post, 3600);
Cache::store('recall')->put("blog:comments:{$postId}", $comments, 3600);
 
// Xóa tất cả bộ nhớ đệm liên quan đến blog theo tiền tố (cần có triển khai thủ công)
// Hoặc dựa vào việc vô hiệu hóa tự động khi dữ liệu thay đổi

Giới hạn

Chế độ Cụm Redis

Recall không hỗ trợ chế độ Cụm Redis. Tùy chọn REDIRECT của lệnh CLIENT TRACKING yêu cầu cả kết nối dữ liệu và kết nối đăng ký vô hiệu hóa phải nằm trên cùng một nút Redis. Trong một cụm, các khóa được phân phối trên nhiều nút khác nhau dựa trên các slot băm, khiến việc nhận các thông điệp vô hiệu hóa cho các khóa lưu trữ trên các nút khác nhau trở nên không khả thi.

Đối với các triển khai Redis cụm, hãy xem xét:

Hướng Dẫn Hỗ Trợ

Cảm ơn bạn đã chọn gói mã nguồn mở của chúng tôi! Vui lòng dành chút thời gian để xem qua các hướng dẫn hỗ trợ này. Chúng sẽ giúp bạn tận dụng tối đa dự án của chúng tôi.

Hỗ Trợ Được Điều Hành Bởi Cộng Đồng

Dự án mã nguồn mở của chúng tôi được thúc đẩy bởi cộng đồng tuyệt vời của chúng tôi. Nếu bạn có câu hỏi hoặc cần trợ giúp, StackOverflow và các tài nguyên trực tuyến khác là lựa chọn tốt nhất của bạn.

Lỗi và Ưu Tiên Tính Năng

Thực tế khi quản lý một dự án mã nguồn mở có nghĩa là chúng tôi không thể giải quyết ngay lập tức mọi lỗi hoặc yêu cầu tính năng được báo cáo. Chúng tôi ưu tiên các vấn đề theo thứ tự sau:

1. Lỗi Ảnh Hưởng Đến Sản Phẩm Trả Phí Của Chúng Tôi

Các lỗi ảnh hưởng đến sản phẩm trả phí của chúng tôi luôn là ưu tiên hàng đầu. Trong một số trường hợp, chúng tôi có thể chỉ giải quyết các lỗi ảnh hưởng trực tiếp đến chúng tôi.

2. Yêu Cầu Kéo Của Cộng Đồng

Nếu bạn đã xác định một lỗi và có giải pháp, vui lòng gửi yêu cầu kéo. Sau các vấn đề ảnh hưởng đến sản phẩm của chúng tôi, chúng tôi dành ưu tiên cao nhất tiếp theo cho các sửa lỗi do cộng đồng thực hiện. Sau khi được xem xét và phê duyệt, chúng tôi sẽ hợp nhất giải pháp của bạn và ghi nhận đóng góp của bạn.

3. Hỗ Trợ Tài Chính

Đối với các vấn đề ngoài các danh mục đã nêu, bạn có thể chọn tài trợ cho việc giải quyết của chúng. Mỗi vấn đề mở đều liên kết với một mẫu đơn đặt hàng nơi bạn có thể đóng góp tài chính. Chúng tôi ưu tiên các vấn đề này dựa trên số tiền tài trợ được cung cấp.

Đóng Góp Của Cộng Đồng

Mã nguồn mở phát triển mạnh khi cộng đồng của nó hoạt động tích cực. Ngay cả khi bạn không sửa lỗi, hãy cân nhắc đóng góp thông qua cải tiến mã, cập nhật tài liệu, hướng dẫn, hoặc bằng cách hỗ trợ những người khác trong các kênh cộng đồng. Chúng tôi rất khuyến khích mọi người, với tư cách là một cộng đồng, giúp đỡ trong công việc mã nguồn mở.

Nhấn mạnh lại, DefectiveCode sẽ ưu tiên các lỗi dựa trên cách chúng ảnh hưởng đến các sản phẩm trả phí của chúng tôi, yêu cầu kéo của cộng đồng và sự hỗ trợ tài chính nhận được cho các vấn đề.

Giấy phép - Giấy phép MIT

Bản quyền © Defective Code, LLC. Tất cả các quyền được bảo lưu

Permission là được cấp miễn phí, cho bất kỳ người nào nhận được một bản sao của phần mềm này và các tài liệu liên quan (gọi là "Phần mềm"), được phép sử dụng Phần mềm mà không có hạn chế, bao gồm nhưng không giới hạn các quyền sử dụng, sao chép, chỉnh sửa, hợp nhất, công bố, phân phối, cấp phép lại, và/hoặc bán các bản sao của Phần mềm, và cho phép những người mà Phần mềm được cung cấp có thể làm như vậy, với điều kiện là:

Thông báo bản quyền ở trên và thông báo phép này sẽ được bao gồm trong tất cả các bản sao hoặc phần đáng kể của Phần mềm.

PHẦN MỀM ĐƯỢC CUNG CẤP "NHƯ THẾ", KHÔNG CÓ BẢO ĐẢM DƯỚI BẤT KỲ HÌNH THỨC NÀO, RÕ RÀNG HAY NGỤ Ý, BAO GỒM NHƯNG KHÔNG GIỚI HẠN ĐẾN CÁC BẢO ĐẢM VỀ THƯƠNG MẠI, PHÙ HỢP CHO MỘT MỤC ĐÍCH CỤ THỂ VÀ KHÔNG XÂM PHẠM. TRONG BẤT KỲ TRƯỜNG HỢP NÀO, CÁC TÁC GIẢ HOẶC CÁC CHỦ SỞ HỮU BẢN QUYỀN KHÔNG CHỊU TRÁCH NHIỆM VỀ BẤT KỲ KHIẾU NẠI, THIỆT HẠI HOẶC TRÁCH NHIỆM KHÁC, DÙ TRONG MỘT HÀNH ĐỘNG HỢP ĐỒNG, LỖI HOẶC CÁC HÌNH THỨC KHÁC, PHÁT SINH TỪ, RA HOẶC LIÊN QUAN ĐẾN PHẦN MỀM HOẶC VIỆC SỬ DỤNG HAY CÁC GIAO DỊCH KHÁC LIÊN QUAN ĐẾN PHẦN MỀM.