Redis, kendi içerisinde pub/sub (publish/subscribe) yapılmasına olanak sağlıyor.
Peki pub/sub pattern nedir?
Pub/sub pattern (desen), mesajlaşma pattern’ı olarak geçer. Temelinde; takip edilen bir olayın, takipçilere duyurulması yatar.
Gerçek hayattan örnek verirsek: Öğretmen publish (pub) görevini üstlenir. Öğrenciler ise subscribe (sub) görevini üstlenir. Öğretmen sınav sonuçlarını panoya asar. Öğrenciler de sınav sonucunu bekledikleri için sürekli gözleri panoda bir haber beklerler.
Öncelikle öğretmen görevini yani pub kısmına gözatalım:
pub.php
$teacher = new Predis\Client(array('host' => '127.0.0.1'));
$teacher->publish('Pano', 'Ali, sinavdan AA aldin.');
Gördüğünüz gibi öğretmen Pano’ya Ali isimli öğrencinin sınav bilgisini girdi. Ali de Pano kanalına (channel) aktif olarak abone.
Ali isimli öğrenci Pano kanalını ise şöyle dinleyebiliyor:
sub.php
ini_set("default_socket_timeout", -1); // Ilgili socket surekli dinleniyor
$client = new Predis\Client(array('host' => '127.0.0.1'));
$redis = new Predis\PubSub\DispatcherLoop($client);
$redis->attachCallback('Pano', 'showResult');
$redis->run();
function showResult($data) {
static $i = 0;
echo ++$i . '. ogrencinin sonucu aciklandi: ' . $data . PHP_EOL;
}
Deneme yapabilmek için öncelikle sub.php dosyasını ardından pub.php dosyasını çalıştırın. Böylece ilk önce kullanıcıyı Pano isimli kanala abone ediyorsunuz ve artık Pano’dan gelecek mesaajı ekrana basmaya hazır oluyor. Daha sonra pub.php ile Pano‘ya veri giriyorsunuz.
pub.php dosyasını biraz genişletelim. Öğretmen daha çok sınav sonucu açıklasın.
$teacher = new Predis\Client(array('host' => '127.0.0.1'));
$students = array('Ali', 'Ayse', 'Veli', 'Hasan', 'Fatma', 'Oguz');
$results = array('AA', 'BA', 'DC', 'CC', 'AA', 'BA');
for($i = 0; $i < 6; $i++) {
$teacher->publish('Pano', $students[$i] . ', sinavdan ' . $results[$i] . ' aldin.');
sleep(1);
}
Yeni pub.php dosyası ile öğretmen, iki dizideki verileri eşleştirerek birer saniye aralıklarla Pano’ya sınav sonuçlarını koyuyor.
Ayrıca bkz.: Observer Design Pattern
adililhan.com