Redis
webman/redis, illuminate/redis temelinde bağlantı havuzu işlevi ekleyen bir eklentidir. Coroutine ve coroutine olmayan ortamları destekler, kullanımı laravel ile aynıdır.
illuminate/redis
kullanmadan önce php-cli
için redis uzantısını kurmanız gerekmektedir.
Dikkat
Bu kılavuz webman v2 sürümüne aittir. Eğer webman v1 sürümünü kullanıyorsanız, lütfen v1 sürüm kılavuzuna bakın.
Bu bileşenin redis uzantısını kurmanız gerekmektedir.php -m | grep redis
komutunu kullanarakphp-cli
'nin redis uzantısını kurup kurmadığını kontrol edebilirsiniz.
Kurulum
composer require -W webman/redis illuminate/events
Kurulumdan sonra yeniden başlatmanız gerekmektedir (reload geçerli değildir).
Konfigürasyon
redis konfigürasyon dosyası config/redis.php
içinde bulunur.
return [
'default' => [
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'database' => 0,
'pool' => [ // Bağlantı havuzu konfigürasyonu
'max_connections' => 10, // Bağlantı havuzunun maksimum bağlantı sayısı
'min_connections' => 1, // Bağlantı havuzunun minimum bağlantı sayısı
'wait_timeout' => 3, // Bağlantı havuzundan bağlantı almak için beklenen maksimum süre
'idle_timeout' => 50, // Bağlantı havuzundaki bağlantıların boşta kalma süresi, bu süre aşıldığında kapanacaktır, bağlantı sayısı min_connections'a eşit olana kadar
'heartbeat_interval' => 50, // Kalp atışı kontrol aralığı, 60 saniyeden fazla olmamalıdır
],
]
];
Bağlantı Havuzu Hakkında
- Her süreç kendi bağlantı havuzuna sahiptir, süreçler arasında bağlantı havuzu paylaşılmaz.
- Coroutine açılmazsa, iş süreç içinde sıralı olarak yürütülür, bu yüzden bağlantı havuzunda en fazla 1 bağlantı vardır.
- Coroutine açıldığında, iş süreç içinde eşzamanlı olarak yürütülür, bağlantı havuzu ihtiyaçlara göre dinamik olarak bağlantı sayısını ayarlar, maksimum
max_connections
'ı aşmaz, minimummin_connections
'dan az olamaz. - Bağlantı havuzunun maksimum bağlantı sayısı
max_connections
olduğundan, Redis üzerinde çalışan coroutine sayısımax_connections
'dan fazla olduğunda, bazı coroutine'ler bekler ve en fazlawait_timeout
saniye bekler, bu süre aşıldığında hata oluşur. - Boşta durumda (hem coroutine hem de coroutine olmayan ortamlar için) bağlantılar
idle_timeout
süresinin sonunda geri alınır, bağlantı sayısımin_connections
'a (min_connections 0 olabilir) ulaşana kadar.
Örnek
<?php
namespace app\controller;
use support\Request;
use support\Redis;
class UserController
{
public function db(Request $request)
{
$key = 'test_key';
Redis::set($key, rand());
return response(Redis::get($key));
}
}
Redis Arabirimi
Redis::append($key, $value)
Redis::bitCount($key)
Redis::decr($key, $value)
Redis::decrBy($key, $value)
Redis::get($key)
Redis::getBit($key, $offset)
Redis::getRange($key, $start, $end)
Redis::getSet($key, $value)
Redis::incr($key, $value)
Redis::incrBy($key, $value)
Redis::incrByFloat($key, $value)
Redis::mGet(array $keys)
Redis::getMultiple(array $keys)
Redis::mSet($pairs)
Redis::mSetNx($pairs)
Redis::set($key, $value, $expireResolution = null, $expireTTL = null, $flag = null)
Redis::setBit($key, $offset, $value)
Redis::setEx($key, $ttl, $value)
Redis::pSetEx($key, $ttl, $value)
Redis::setNx($key, $value)
Redis::setRange($key, $offset, $value)
Redis::strLen($key)
Redis::del(...$keys)
Redis::exists(...$keys)
Redis::expire($key, $ttl)
Redis::expireAt($key, $timestamp)
Redis::select($dbIndex)
eşdeğerdir
$redis = Redis::connection('default');
$redis->append($key, $value)
$redis->bitCount($key)
$redis->decr($key, $value)
$redis->decrBy($key, $value)
$redis->get($key)
$redis->getBit($key, $offset)
...
Dikkat
Redis::select($db)
arayüzünü dikkatli kullanın, çünkü webman sürekli bellek üzerinde çalışan bir çerçevedir. Eğer bir istekteRedis::select($db)
ile veritabanını değiştirdiğinizde, bu durum sonraki diğer istekleri etkileyecektir. Birden fazla veritabanı kullanıyorsanız, farklı$db
değerlerini farklı Redis bağlantı konfigürasyonları olarak ayarlamanız önerilir.
Birden Fazla Redis Bağlantısı Kullanma
Örneğin konfigürasyon dosyası config/redis.php
return [
'default' => [
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'database' => 0,
],
'cache' => [
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'database' => 1,
],
]
Varsayılan olarak default
altındaki konfigürasyona bağlı bağlantı kullanılır, hangi redis bağlantısını kullanacağınızı seçmek için Redis::connection()
yöntemini kullanabilirsiniz.
$redis = Redis::connection('cache');
$redis->get('test_key');
Küme Konfigürasyonu
Eğer uygulamanız Redis sunucu kümesi kullanıyorsa, bu kümeleri Redis konfigürasyon dosyasında clusters anahtarını kullanarak tanımlamalısınız:
return [
'clusters' => [
'default' => [
[
'host' => 'localhost',
'password' => null,
'port' => 6379,
'database' => 0,
],
],
],
];
Varsayılan olarak, küme, düğümlerde istemci parçalama sağlamakta ve düğüm havuzları oluşturmanıza ve kullanılabilir bellek miktarını artırmanıza olanak tanımaktadır. Burada belirtmek gerekir ki, istemcilerin paylaşımı hatalı durumları işleyemez; bu nedenle, bu özellik esas olarak başka bir ana veritabanından alınan önbellek verilerinin elde edilmesi için uygundur. Eğer Redis'in yerel kümesini kullanmak istiyorsanız, konfigürasyon dosyasındaki options anahtarında aşağıdaki gibi belirtmeniz gerekmektedir:
return[
'options' => [
'cluster' => 'redis',
],
'clusters' => [
// ...
],
];
Boru Hattı Komutları
Eğer bir işlemde sunucuya birçok komut göndermeniz gerekiyorsa, boru hattı komutlarını kullanmanızı öneririz. pipeline yöntemi, bir Redis örneğinin kapalı fonksiyonunu kabul eder. Tüm komutları Redis örneğine gönderebilirsiniz, bunlar tek bir işlemde tamamlanır:
Redis::pipeline(function ($pipe) {
for ($i = 0; $i < 1000; $i++) {
$pipe->set("key:$i", $i);
}
});