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 kullanarak php-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, minimum min_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 fazla wait_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 istekte Redis::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);
    }
});