asyncfunctionrenderPage(){const data =awaitgetPageDatas();return data;}
Bileşenler hazırlanıyor...
Not içeriği yükleniyor...
// Markdown dosyası okunuyor
// İçerik işleniyor
// Syntax highlighting hazırlanıyor
Redis List Veri Türü | Queue ve Stack Implementation | Kubilay Bozak
Redis List Veri Türü
2025-07-12
16 min
Redis Lists implementation, queue ve stack operations. LPUSH, RPUSH, LPOP, RPOP komutları ile message queue ve job processing patterns.
Redis
List
Queue
Stack
Message Queue
Redis’teki List, sıralı bir string koleksiyonudur. Her liste bir key altında tutulur ve elemanlar eklenme sırasına göre dizilir. Listeye hem baştan hem sondan veri eklenebilir veya çıkarılabilir. Bu özellikleri sayesinde yığın (stack) ve kuyruk (queue) işlemleri için idealdir.
🔧 Temel Özellikler
Aynı key altında sıralı birden fazla değer saklanabilir.
FIFO (First In First Out) ya da LIFO (Last In First Out) mantığı ile çalışabilir.
Bir listeye baştan (LPUSH) ya da sondan (RPUSH) ekleme yapılabilir.
Maksimum eleman sayısı: 2^32 - 1 (yaklaşık 4 milyar eleman).
🎯 Kullanım Senaryoları
Kullanım
Açıklama
Mesaj Kuyruğu
queue:email → [job1, job2, job3]
Log Kayıtları
logs:app:1 → [log1, log2, log3]
Görev listesi
tasks:user:123 → [taskA, taskB]
Ziyaret geçmişi
history:product:42 → [user1, user2]
🔧 Temel Komutlar ve Açıklamaları
Komut
Açıklama
Örnek
LPUSH
Listenin başına eleman ekler.
LPUSH sepet "elma"
RPUSH
Listenin sonuna eleman ekler.
RPUSH sepet "armut"
LRANGE
Belirli aralıktaki elemanları getirir.
LRANGE sepet 0 -1
LPOP
Listenin başındaki elemanı çıkarır.
LPOP sepet
RPOP
Listenin sonundaki elemanı çıkarır.
RPOP sepet
LLEN
Listenin eleman sayısını verir.
LLEN sepet
LREM
Belirli değeri listeden siler.
LREM sepet 1 "elma"
LSET
Belirli indeksteki değeri günceller.
LSET sepet 0 "çilek"
LINDEX
Belirli indeksteki değeri getirir.
LINDEX sepet 1
🧪 LPUSH ve RPUSH Komutları
Listelere veri eklemek için kullanılır:
LPUSH: Elemanı listenin başına ekler.
RPUSH: Elemanı listenin sonuna ekler.
text
127.0.0.1:6379> Rpush Keywords Kubilay // Keywords listesinin sonuna "Kubilay" ekliyoruz.
(integer) 1 // Listenin şu anki eleman sayısı döndürülüyor.
127.0.0.1:6379> Rpush Keywords Bozak // Keywords listesinin sonuna "Bozak" ekliyoruz.
(integer) 2 // Listenin şu anki eleman sayısı döndürülüyor.
127.0.0.1:6379> Rpush Keywords Refis // Keywords listesinin sonuna "Redis" ekliyoruz.
(integer) 3 // Listenin şu anki eleman sayısı döndürülüyor.
127.0.0.1:6379> Rpush Keywords Ders Notlari // Keywords listesinin sonuna "Ders" ve "Notlari" ekliyoruz.
(integer) 5 // İki eleman eklendiği için toplam eleman sayısı 5 oldu.
127.0.0.1:6379>
📌 Dikkat Edilmesi Gereken Noktalar:
Eğer verilen key altında bir liste yoksa, LPUSH veya RPUSH komutu bu key için yeni bir liste oluşturur.
Eğer aynı isimde bir key başka bir veri türünde (örneğin string) tanımlanmışsa, LPUSH veya RPUSH kullanıldığında tip uyuşmazlığı hatası döner.
text
127.0.0.1:6379> SET sepet "metin" // "sepet" key'ine string türünde "metin" değeri atanıyor.
OK // İşlem başarılı olduğunu gösterir.
127.0.0.1:6379> LPUSH sepet "elma" // String olan key'e liste elemanı eklemeye çalışıyoruz.
(error) WRONGTYPE Operation against a key holding the wrong kind of value // Tür uyuşmazlığı hatası.
Yukarıda bulunan örnekte önce String tipinde sepet key değeri tanımlanmış ve buna sen liste olarak Elma'yı sola ekle diyoruz bundan dolayı hataya düşüyor.
LPUSH ve RPUSH komutlarına aynı anda birden fazla eleman verilebilir. Bu durumda değerler sırasıyla eklenir.
text
127.0.0.1:6379> RPUSH liste "a" "b" "c" // Listeye aynı anda üç eleman ekliyoruz.
(integer) 3 // Listenin toplam eleman sayısı döndürülüyor.
Tüm değerler, sayı bile olsa string olarak listeye eklenir.
LPUSH → veriyi başından ekler
RPUSH → veriyi sonundan ekler
Dolayısıyla ekleme sırası farklı sonuçlara yol açar:
Ekledikten sonra listenin kaç elemanı olduğunu görmek için LLEN komutu kullanılabilir:
Büyük listelerde (binlerce eleman) sürekli baştan (LPUSH) veya sondan (RPUSH) ekleme/silme işlemi yapmak hızlıdır. Ancak listenin ortasında işlem yapılmak istendiğinde performans düşebilir.
🧪 LRANGE Komutunu İnceleyelim
Listede belirli bir aralıktaki elemanları getirir.
Liste sıralıdır, indeksler önemlidir
start ve end parametreleri, elemanların sırasına göre çalışır.
İndeksler 0'dan başlar, negatif değerler sondan saymak için kullanılır.
Tüm elemanlar string olarak döner, sayı girseniz bile:
Negatif indeksler sondan sayar
-1: son eleman-2: sondan bir önceki eleman-n: sondan n. eleman
Redis'te end parametresi dahil edilir. Yani LRANGE liste 0 2 → 0, 1 ve 2. indeksli elemanları getirir.
Eğer key yoksa veya liste boşsa, LRANGE komutu hata vermez, sadece boş bir dizi döner:
127.0.0.1:6379> SET StringKey "Kubilay" // "StringKey" adında string bir key oluşturuyoruz.
OK // İşlem başarılı olduğunu gösterir.
127.0.0.1:6379> LRANGE StringKey 0 -1 // String olan key'e liste komutu uyguluyoruz.
(error) WRONGTYPE Operation against a key holding the wrong kind of value // Tür uyuşmazlığı hatası.
127.0.0.1:6379>
LRANGE büyük listelerde tüm elemanları getirirse performans düşebilir.
Özellikle LRANGE key 0 -1 gibi tüm listeyi çekmek, çok sayıda eleman varsa önerilmez.
Sayfalamalı LRANGE kullanımı daha verimlidir:
127.0.0.1:6379> LRANGE Keywords 0 -1 // Keywords listesinin tüm elemanlarını görüntülüyoruz.
1) "Kubilay" // Listenin 1. elemanı.
2) "Bozak" // Listenin 2. elemanı.
3) "Redis" // Listenin 3. elemanı.
4) "Ders" // Listenin 4. elemanı.
5) "Notlari" // Listenin 5. elemanı.
127.0.0.1:6379> LPOP Keywords // Listenin başından (solundan) eleman çıkarıyoruz.
"Kubilay" // Çıkarılan eleman döndürülüyor.
127.0.0.1:6379> LRANGE Keywords 0 -1 // Listenin güncel durumunu kontrol ediyoruz.
1) "Bozak" // İlk eleman çıkarıldığı için "Bozak" birinci sıraya geldi.
2) "Redis" // Listenin yeni 2. elemanı.
3) "Ders" // Listenin yeni 3. elemanı.
4) "Notlari" // Listenin yeni 4. elemanı.
127.0.0.1:6379> RPOP Keywords // Listenin sonundan (sağından) eleman çıkarıyoruz.
"Notlari" // Çıkarılan eleman döndürülüyor.
127.0.0.1:6379> LRANGE Keywords 0 -1 // Listenin güncel durumunu kontrol ediyoruz.
1) "Bozak" // Listenin 1. elemanı.
2) "Redis" // Listenin 2. elemanı.
3) "Ders" // Son eleman çıkarıldığı için "Ders" son eleman oldu.
127.0.0.1:6379>
📌 Dikkat Edilmesi Gereken Noktalar
Bu komutlar, elemanı listeden çıkarır ve aynı zamanda silinen değeri geri döner:
Liste yoksa (ya da boşsa) sonuç nil döner
Key başka veri türünde ise hata verir
text
127.0.0.1:6379> SET sepet "tekil veri" // "sepet" key'ine string değer atıyoruz.
OK // İşlem başarılı olduğunu gösterir.
127.0.0.1:6379> LPOP sepet // String olan key'den liste elemanı çıkarmaya çalışıyoruz.
(error) WRONGTYPE Operation against a key holding the wrong kind of value // Tür uyuşmazlığı hatası.
Kuyruk ve yığın işlemlerinde kullanılır
Yeni sürümlerde LPOP ve RPOP komutları, kaç eleman çıkarılacağını belirlemek için sayı parametresi alabilir:
LPOP / RPOP ile alınan veriler tekrar listede bulunmaz. Bu nedenle veri kaybı yaşamamak için önce LRANGE ile kontrol edip sonra çıkarmak gerekebilir.
🧪 LLEN Komutunu İnceleyelim
Listenin eleman sayısını verir. Eğer key yoksa 0 döner.
text
127.0.0.1:6379> LLEN Keywords // Keywords listesinin eleman sayısını kontrol ediyoruz.
(integer) 1 // Listede 1 eleman olduğu döndürülüyor.
127.0.0.1:6379> llen BigListKey // BigListKey listesinin eleman sayısını kontrol ediyoruz.
(integer) 18 // Listede 18 eleman olduğu döndürülüyor.
127.0.0.1:6379>
📌 Dikkat Edilmesi Gereken Noktalar
Eğer belirtilen key’e karşılık gelen bir liste yoksa LLEN komutu 0 döner. Bu, Redis’in diğer komutlarında olduğu gibi hata vermek yerine sessizce çalışmasına olanak tanır.
Eğer key başka bir türdeyse (örneğin String, Set, Hash), LLEN komutu bir tür hatası döner:
Liste ne kadar büyük olursa olsun, LLEN komutu her zaman sabit zamanda (O(1)) çalışır. Yani büyük listelerde bile çok hızlıdır ve performans kaygısı olmadan kullanılabilir.
🧪 LREM Komutunu İnceleyelim
Listeden, verilen değere eşit olan eleman(lar)ı silmek için kullanılır.
Silinen eleman sayısı döndürülür Komutun çıktısı, kaç elemanın silindiğini gösterir. Bu bilgi, işlemin doğruluğunu test etmek için mutlaka kontrol edilmelidir.
Liste yoksa veya eşleşen değer bulunmazsa 0 döner Bu durum hata değildir, ama hiçbir şey silinmediği anlamına gelir
Listede birden fazla aynı değer varsa dikkatli olunmalıdır count değeri doğru belirlenmezse, istenenden fazla ya da yanlış sırada silme yapılabilir. Özellikle tekrarlayan verilerde count = 0 tehlikelidir çünkü hepsini siler.
LREM sadece List veri türü ile çalışır. Eğer key başka bir türdeyse (örneğin string), hata alırsınız:
🧪 LSET Komutunu İnceleyelim
Redis'te bir listenin belirli bir index'ine denk gelen elemanı güncellemek için kullanılır.
Bu komut, listedeki var olan bir değeri başka bir değerle değiştirmenizi sağlar.
LSET Komutunun Doğru Söz Dizimi: LSET key index new_value
key: Liste adı (örneğin: urunler)
index: Güncellenecek öğenin sırası
new_value: Yeni değer
text
RPUSH SEPET ELMA ARMUT SEKER CAY KAHVE // SEPET listesine beş eleman ekliyoruz.
(integer) 5 // Listede toplam 5 eleman olduğu döndürülüyor.
127.0.0.1:6379> LRANGE SEPET 0 -1 // SEPET listesinin tüm elemanlarını görüntülüyoruz.
1) "ELMA" // Listenin 1. elemanı.
2) "ARMUT" // Listenin 2. elemanı.
3) "SEKER" // Listenin 3. elemanı.
4) "CAY" // Listenin 4. elemanı.
5) "KAHVE" // Listenin 5. elemanı.
127.0.0.1:6379> LSET SEPET 0 ANANAS // 0. indeksteki elemanı "ANANAS" ile değiştiriyoruz.
OK // İşlem başarılı olduğunu gösterir.
127.0.0.1:6379> LRANGE SEPET 0 -1 // Değişiklik sonrası listeyi görüntülüyoruz.
1) "ANANAS" // İlk eleman "ELMA"dan "ANANAS"a değişti.
2) "ARMUT" // Diğer elemanlar değişmedi.
3) "SEKER" // Listenin 3. elemanı.
4) "CAY" // Listenin 4. elemanı.
5) "KAHVE" // Listenin 5. elemanı.
127.0.0.1:6379>
📌 Dikkat Edilmesi Gereken Noktalar
Negatif index kullanılabilir -1: Son eleman
-2: Sondan bir önceki eleman
text
127.0.0.1:6379> LSET SEPET -1 "MADEN SUYU" // Son elemanı "MADEN SUYU" ile değiştiriyoruz.
OK // İşlem başarılı olduğunu gösterir.
127.0.0.1:6379> LRANGE SEPET 0 -1 // Değişiklik sonrası listeyi görüntülüyoruz.
1) "ANANAS" // Listenin 1. elemanı.
2) "ARMUT" // Listenin 2. elemanı.
3) "SEKER" // Listenin 3. elemanı.
4) "CAY" // Listenin 4. elemanı.
5) "MADEN SUYU" // Son eleman "KAHVE"den "MADEN SUYU"ya değişti.
127.0.0.1:6379>
Index geçerli değilse hata alırsınız Liste içinde olmayan bir index verilirse:
text
127.0.0.1:6379> LSET SEPET -10 "MADEN SUYU" // Geçersiz index kullanıyoruz.
(error) ERR index out of range // Index aralık dışında hatası.
127.0.0.1:6379>
Performans açısından dikkatli olunmalı
Büyük listelerde yüksek index'li değişiklikler, performans maliyeti doğurabilir.
🧪 LINDEX Komutunu İnceleyelim
LINDEX komutu, Redis listesi içinde belirli bir index'teki öğeyi okumak (getirmek) için kullanılır.
Liste üzerinde değeri değiştirmez, sadece okuma işlemi yapar.
LINDEX key index LINDEX Komutunun Doğru Söz Dizimi:
key: Liste adı (örneğin: urunler)
index: Okunmak istenen öğenin sırası
Evet şimdiye kadar ilk ve en geniş kavramlarımız olan List ve String kavramlarını Redis’in temel yapı taşları olan String ve List veri tipleri, veritabanı ile çalışma sürecinde karşılaşacağımız en sık kullanılan ve en güçlü veri modellerinin başında gelir.
Bu bölümde önce SET, GET, INCR, APPEND, SETRANGE gibi String komutları ile veri yazma, güncelleme ve okuma işlemlerini öğrendik. Ardından RPUSH, LPOP, LSET, LINDEX, LREM gibi List komutlarıyla sıralı veri yapıları üzerinde ekleme, silme ve erişim işlemlerini adım adım inceledik. Her komutun kullanım şekli, söz dizimi ve dikkat edilmesi gereken özel noktalarla birlikte örnekler üzerinden uygulamalı olarak aktarıldı. Böylece Redis ile çalışırken key isimlendirme duyarlılığından, negatif index kullanımına kadar birçok kritik detaya da hakim olmuş olduk. Bu temeli sağlam kurmak, ileride Redis’in Set, Hash, Sorted Set gibi daha gelişmiş veri tiplerini kullanırken de ciddi bir avantaj sağlayacaktır.
Artık String ve List yapılarına güvenle hâkimsin! Hazırsan bir sonraki paylaşımda Set veri tipine geçebiliriz.