English | العربية | বাংলা | Bosanski | Deutsch | Español | Français | हिन्दी | Italiano | 日本語 | 한국어 | मराठी | Português | Русский | Kiswahili | தமிழ் | తెలుగు | Türkçe | اردو | Tiếng Việt | 中文
- Giới thiệu
- Cài đặt
- Cách sử dụng
- Cấu hình
- Sử dụng nâng cao
- Tối ưu hóa
- Các mẫu phổ biến
- Giới hạn
- Hướng Dẫn Hỗ Trợ
- Giấy phép - Giấy phép MIT
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ô hiệu hóa tự động: Redis thông báo cho ứng dụng của bạn khi các khóa bộ nhớ đệm thay đổi, đảm bảo tính duy trì của bộ nhớ đệm
- Không cần cấu hình: Hoạt động ngay lập tức với các cấu hình mặc định hợp lý
- Tích hợp Octane: Tự động làm ấm kết nối, xử lý vô hiệu hóa dựa trên yêu cầu, và tắt máy một cách nhẹ nhàng
- Hỗ trợ tài xế kép: APCu cho tất cả các máy chủ Octane, Swoole Table cho các môi trường Swoole/OpenSwoole
- Lưu trữ có chọn lọc: Cấu hình các tiền tố khóa nào sẽ được lưu trữ cục bộ
- Bảo vệ điều kiện đua: Theo dõi yêu cầu đang chờ xử lý ngăn chặn việc lưu trữ dữ liệu cũ trong quá trình vô hiệu hóa đồng thời
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àouse 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óaCache::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
- PHP >= 8.4
- Laravel 11.x hoặc 12.x
- Laravel Octane
- Redis 6.0+ (cho hỗ trợ lưu trữ bộ nhớ đệm phía khách)
- ext-apcu HOẶC ext-swoole (ít nhất một trong hai cái là cần thiết cho bộ nhớ đệm cục bộ)
Cách sử dụng
Cài đặt cơ bản
- Thêm bộ nhớ đệm Recall vào
config/cache.phpcủa bạn:
'stores' => [ // ... các bộ nhớ đệm khác 'recall' => [ 'driver' => 'recall', ],],
- 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
- Đọ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ộ
- Đọ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)
- 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
- 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ộ
- Đọ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ởi động Worker: Thiết lập kết nối vô hiệu hóa Redis (khởi động ấm)
- Yêu cầu nhận: Xử lý bất kỳ thông điệp vô hiệu hóa nào đang chờ
- Dừng Worker: Đóng kết nối một cách nhẹ nhàng
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:
- ext-apcu đã được cài đặt và kích hoạt
apc.enable_cli=1trong php.ini cho việc sử dụng CLI
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:
table_size: Phải là một số mũ của 2 (ví dụ: 65536, 131072). Xác định tối đa số mục.value_size: Số byte tối đa cho các giá trị đã tuần tự. Các giá trị lớn hơn sẽ bị cắt ngầm.
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ốiif ($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:
- Khóa có lượng thay đổi cao: Một số khóa thay đổi quá thường xuyên đến mức việc lưu trữ cục bộ không mang lại lợi ích nhiều
- Giá trị lớn: Giảm áp lực bộ nhớ bằng cách chỉ lưu trữ các khóa nhỏ hơn và được đọc thường xuyên
- Dữ liệu nhạy cảm: Giữ một số dữ liệu chỉ trong Redis vì lý do bảo mật hoặc tuân thủ
// 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ơnapc.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ánCache::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:
- Sử dụng một phiên bản Redis duy nhất cho dữ liệu bộ nhớ đệm mà có lợi từ việc lưu trữ bộ nhớ đệm phía khách
- Sử dụng Redis Cluster cho dữ liệu khác trong khi giữ dữ liệu ổn định, thường xuyên đọc trên một phiên bản độc lập
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.