Redis Array, Redis 8.8 ile gelen yeni bir veri tipidir: tamsayı indeksleri (0 ile 2 üzeri 64 eksi 1 arasında) metin değerlerine eşleyen, seyrek ve indeksle adreslenen bir yapıdır. ARSET anahtar indeks değer ile yazar, ARGET anahtar indeks ile okursunuz; aradaki boş indeksler için bellek ayrılmaz. Sıralı ekleme için ARINSERT, sabit boyutlu halka tampon için ARRING, aralık okumak için ARGETRANGE ve ARSCAN, toplama için AROP, metin araması için ARGREP kullanılır.
Bu komutlar yalnızca Redis 8.8 ve sonrasında vardır; daha eski bir sunucuda ARSET bilinmeyen komut hatası verir. Sürümünüzü INFO server ile kontrol edebilirsiniz. Redis 8.8'in diğer yeniliklerine Redis 8 yenilikleri yazısında, serinin tamamına Redis öğrenme rehberinde ulaşabilirsiniz.
Array neden var? List ile farkı

Belge Array tipini, öğelere bir dizideki konumlarıyla değil doğrudan indeksleriyle erişilen bir yapı olarak tanımlar. Liste iki uçtan ekleme ve çıkarma için tasarlanmıştır; ortadaki bir öğeye konumla ulaşmak, listenin o noktaya kadar gezilmesini gerektirir. Array ise herhangi bir indekse doğrudan yazmanıza izin verir ve dolu yuvalar arasındaki boşlukları ayırmaz. Yani 0 ve 1.000.000 indekslerine yazdığınızda arada bir milyon boş yuva için bellek harcanmaz.
Belgenin saydığı kullanım alanları şunlardır: zaman damgalı olay günlükleri, akan ölçümler üzerinde halka tamponlar, kayan pencere analizleri ve seyrek ya da yüksek indeksli erişim gerektiren diğer işler. Belge ayrıca Array tipinin diğer koleksiyonların yerini almadığını, onları tamamladığını vurgular:
| İhtiyaç | Uygun tip |
|---|---|
| İki uçtan push/pop, mevcut öğelerin arasına ekleme | List |
| Değerlere sayısal indeks yerine alan adıyla erişim | Hash |
| Tüketici grupları ve onaylı, yalnızca sona eklenen olay günlüğü | Stream |
| Sayısal indeksle doğrudan, seyrek erişim; halka tampon | Array |
Bu ayrımın ayrıntıları için list yazısına, hash yazısına ve Streams yazısına bakabilirsiniz.
Temel yazma ve okuma
ARSET key index value [value ...], verilen indeksten başlayarak ardışık indekslere yazar. Yanıt, toplam yazılan değer sayısı değil, daha önce boş olup yeni doldurulan yuva sayısıdır. ARGET tek bir indeksi okur; boş indeks ya da olmayan anahtar için boş yanıt döner:
> ARSET events:1 0 "login" "click" "purchase"
(integer) 3
> ARGET events:1 0
"login"
> ARGET events:1 999
(nil)Ardışık olmayan indekslere tek komutla yazmak için ARMSET key index value [index value ...], birden çok indeksi tek gidiş dönüşte okumak için ARMGET kullanılır. ARMGET yanıtı istediğiniz indekslerin sırasını korur ve boş olanlar için boş değer koyar:
> ARMSET metrics 0 "10" 5 "20" 100 "30"
(integer) 3
> ARMGET metrics 0 5 100 999
1) "10"
2) "20"
3) "30"
4) (nil)Değerler metin olarak saklanır. Sayısal toplama işlemleri (aşağıda AROP) bu metinleri sayı olarak yorumlar; bu yüzden örneklerde sayıların tırnak içinde yazılması bir hata değildir.
Uzunluk ile eleman sayısı farkı
Seyrek bir yapıda "boyut" iki farklı şey olabilir ve Array ikisini ayrı komutlarla verir. ARLEN mantıksal uzunluğu, yani en yüksek dolu indeksin bir fazlasını döndürür. ARCOUNT ise boş olmayan eleman sayısıdır. Belgedeki örnekte fark çarpıcıdır:
> ARSET sparse 0 "a"
(integer) 1
> ARSET sparse 1000000 "b"
(integer) 1
> ARLEN sparse
(integer) 1000001
> ARCOUNT sparse
(integer) 2Uygulamanızda "kaç kayıt var" sorusunun cevabı genellikle ARCOUNT olur. ARLEN ise bir sonraki boş indeksi tahmin etmek ya da aralık sorgusunun üst sınırını belirlemek için işe yarar. İki komut da olmayan anahtar için 0 döndürür.
Aralık okumak: ARGETRANGE ve ARSCAN
ARGETRANGE key start end aralıktaki her konumu, boş yuvalar dahil, indeks sırasıyla döndürür; boş yuvalar boş değer olarak gelir. start değeri end değerinden büyükse sıra tersine döner:
> ARMSET seq 0 "a" 1 "b" 3 "d"
(integer) 3
> ARGETRANGE seq 0 3
1) "a"
2) "b"
3) (nil)
4) "d"
> ARGETRANGE seq 3 0
1) "d"
2) (nil)
3) "b"
4) "a"Seyrek bir dizide bu yaklaşım çok sayıda boş değer üretir. Yalnızca dolu öğeleri, indeksleriyle birlikte almak için ARSCAN key start end [LIMIT n] kullanılır. Yanıt indeks-değer çiftlerinden oluşur ve LIMIT, boş yuvalar sayılmadığı için doğrudan dönen dolu öğe sayısını sınırlar:
> ARSCAN seq 0 3
1) 1) (integer) 0
2) "a"
2) 1) (integer) 1
2) "b"
3) 1) (integer) 3
2) "d"Sıralı ekleme: ARINSERT, ARNEXT ve ARSEEK
Her seferinde indeks hesaplamak istemiyorsanız ARINSERT key value [value ...] iç bir imleç kullanır: değeri imlecin gösterdiği indekse yazar ve imleci her değer için bir ilerletir. Yanıt, değerin yazıldığı son indekstir. ARNEXT bir sonraki eklemenin nereye düşeceğini, ARSEEK ise imleci başka bir indekse taşımayı sağlar:
> ARINSERT log "event1"
(integer) 0
> ARINSERT log "event2"
(integer) 1
> ARNEXT log
(integer) 2
> ARSEEK log 10
(integer) 1
> ARINSERT log "event3"
(integer) 10ARSEEK imleç ayarlandığında 1, anahtar yoksa 0 döndürür. ARNEXT, olmayan anahtar ya da henüz ekleme yapılmamış bir dizi için 0 verir; imleç tükendiğinde, yani bir sonraki ekleme taşma yaratacaksa boş yanıt döner.
Burada belgedeki bir örnek önemli bir tuzağı gösterir. ARINFO sayfasında önce ARMSET ile 0, 1 ve 100 indekslerine yazılır, ardından ARINSERT çağrılır ve yanıt 0 olur; eleman sayısı da 3 olarak kalır. Yani ekleme imleci ARSET ve ARMSET yazmalarını izlemez; kendi konumundan devam eder ve o konum doluysa üzerine yazar. Aynı anahtarda indeksli yazma ile imleçli eklemeyi karıştıracaksanız imleci önce ARSEEK ile güvenli bir konuma taşıyın.
Halka tampon: ARRING ve ARLASTITEMS
ARRING key size value [value ...] diziyi sabit boyutlu bir dairesel tampona çevirir. Her değer ekleme_indeksi % size konumuna yazılır; pencere dolunca 0 indeksine döner ve en eski kaydın üzerine yazar. Belgedeki örnekte boyut 3 iken dört değer eklenir ve dördüncü değer 0 indeksine düşer:
> ARRING readings 3 "v0"
(integer) 0
> ARRING readings 3 "v1"
(integer) 1
> ARRING readings 3 "v2"
(integer) 2
> ARRING readings 3 "v3"
(integer) 0
> ARGET readings 0
"v3"
> ARCOUNT readings
(integer) 3Halka tamponda indeks sırası, ekleme sırası anlamına gelmez: 0 indeksinde en yeni değer, 1 ve 2 indekslerinde daha eskiler durur. Kronolojik sırayı almak için ARLASTITEMS key count [REV] kullanılır; varsayılan olarak eskiden yeniye, REV ile yeniden eskiye döner. Dizide count değerinden az eleman varsa hepsi döner:
> ARLASTITEMS readings 3
1) "v1"
2) "v2"
3) "v3"
> ARLASTITEMS readings 3 REV
1) "v3"
2) "v2"
3) "v1"Komut sayfasına göre size değeri mevcut pencereden küçük verilirse dizi yeni boyuta sığacak şekilde kırpılır. Bu, aynı anahtar için farklı kod yollarının farklı boyut gönderdiği durumlarda veri kaybına yol açabilir; boyutu tek bir sabitte tutun. Liste ile LPUSH ve LTRIM birlikteliğinden kurulan sınırlı listeler de benzer bir iş görür; o desen list yazısında anlatılıyor. Halka tamponun farkı, tek komutla yazıp kırpması ve konuma doğrudan erişim sunmasıdır.
Toplama: AROP

AROP key start end operation bir aralığın boş olmayan elemanları üzerinde tek geçişte toplama yapar. Komut, argüman sırası ne olursa olsun düşük indeksten yükseğe tarar. İşlemler şunlardır:
| İşlem | Sonuç | Yanıt tipi |
|---|---|---|
| SUM, MIN, MAX | Sayısal değerlerin toplamı, en küçüğü, en büyüğü | Metin (bulk string) |
| AND, OR, XOR | Değerleri tamsayı sayarak bit işlemi; ondalıklar sıfıra doğru kesilir | Tamsayı |
| MATCH value | Değeri value ile aynı olan eleman sayısı | Tamsayı |
| USED | Aralıktaki boş olmayan eleman sayısı | Tamsayı |
> ARMSET scores 0 "10" 1 "20" 2 "30"
(integer) 3
> AROP scores 0 2 SUM
"60"
> AROP scores 0 2 MAX
"30"
> AROP scores 0 2 MATCH "10"
(integer) 1SUM, MIN ve MAX aralıkta sayısal eleman yoksa boş yanıt döndürür; bit işlemleri ise aralık boşsa boş döner. Toplamın metin olarak gelmesi, istemci kodunda sayıya çevirmeniz gerektiği anlamına gelir. Halka tamponla birleştiğinde, son N ölçümün toplamını ya da en büyüğünü sunucu tarafında tek komutla hesaplamak mümkündür.
Metin araması: ARGREP
ARGREP key start end predicate [predicate ...] [AND|OR] [LIMIT n] [WITHVALUES] [NOCASE], aralıktaki boş olmayan elemanları metin koşullarına göre süzer ve eşleşen indeksleri döndürür. Dört koşul biçimi vardır: EXACT tam eşitlik, MATCH alt metin, GLOB SCAN MATCH ile aynı joker sözdizimi, RE düzenli ifade. Birden çok koşul varsayılan olarak OR ile birleşir. - ve + dizinin ilk ve son indeksini gösterir:
> ARMSET log 0 "boot: ok" 1 "warn: disk" 2 "ERROR: cpu" 3 "info: ready" 4 "error: net"
(integer) 5
> ARGREP log - + MATCH "error" NOCASE
1) (integer) 2
2) (integer) 4
> ARGREP log 0 4 GLOB "warn:*" OR GLOB "error:*" WITHVALUES
1) 1) (integer) 1
2) "warn: disk"
2) 1) (integer) 4
2) "error: net"Dikkat edin: NOCASE olmadan MATCH "error" yalnızca küçük harfli satırı bulurdu; ikinci örnekteki GLOB "error:*" de büyük harfli ERROR: cpu satırını bu yüzden yakalamaz. Belge, halka tampon ile birleştirildiğinde sabit boyutlu bir dizinin son N günlük satırını tutup yerinde aranabileceğini belirtir. Anahtar yoksa ya da eşleşme yoksa yanıt boş dizidir.
Silme ve inceleme
ARDEL key index [index ...] verilen indeksleri siler ve gerçekten silinen eleman sayısını döndürür; boş bir indeksi silmek sıfır sayılır. ARDELRANGE key start end [start end ...] bir ya da daha fazla kapsayıcı aralığı siler; çakışan aralıklarda her eleman en fazla bir kez sayılır. Son kalan eleman silindiğinde anahtar da tamamen kaldırılır:
> ARDEL scores 1
(integer) 1
> ARDELRANGE scores 0 2
(integer) 2Bu örnekte ARDELRANGE 0 ile 2 arasını silmek istemiş ama yalnızca 2 döndürmüştür, çünkü 1 indeksi bir önceki komutla zaten silinmişti ve boş yuvalar sayılmaz. Ardından dizi boşaldığı için scores anahtarı artık yoktur.
ARINFO key [FULL], dizinin iç yapısıyla ilgili meta veriyi alan adı-değer çiftleri olarak döndürür: count, len, next-insert-index, dilim sayısı ve dilim boyutu gibi. FULL ile yoğun ve seyrek dilimlerin doluluk oranları da gelir, ancak karmaşıklık O(1) yerine dilim sayısına bağlı O(N) olur.
Performans ve ayarlar
Belgeye göre ARSET, ARGET, ARDEL, ARINSERT, ARNEXT, ARSEEK, ARCOUNT ve ARLEN gibi komutların çoğu O(1) karmaşıklıktadır. N elemana dokunan ARGETRANGE, ARSCAN, ARDELRANGE, AROP ve ARLASTITEMS ise O(N) karmaşıklıktadır. Alttaki dilimli dizi kodlaması hem yoğun hem seyrek erişimi verimli karşılar; büyük indeks boşlukları çok az bellek tüketir.
Davranışı etkileyen yapılandırma parametreleri olarak array-slice-size, array-sparse-kmax ve array-sparse-kmin belirtilir. Bu ayarların ayrıntısı yapılandırma sayfasındadır; çalışırken ayar okumak ve değiştirmek için CONFIG GET ve CONFIG SET yazısına bakabilirsiniz. Ayrıca belge, Array tipinin Active-Active veritabanlarında desteklenmediğini not eder.
Uygulamalı mini örnek: son 60 sıcaklık ölçümü
Bir sensörün her dakika gönderdiği sıcaklığı son bir saat için tutmak istediğinizi düşünün. Komutlar belgelerdeki sözdizimine göre yazıldı; yanıtlar ölçümlere göre değişeceği için gösterilmiyor.
> ARRING sensor:7:sicaklik 60 "21.4"
> ARLASTITEMS sensor:7:sicaklik 5 REV
> AROP sensor:7:sicaklik 0 59 MAX
> AROP sensor:7:sicaklik 0 59 USED
> ARGREP sensor:7:sicaklik - + GLOB "3?.*"İlk komut her dakika çağrılır; 60 değerlik pencere dolunca en eski ölçümün üzerine yazar ve yanıt olarak yazdığı indeksi döndürür. İkinci komut panelde gösterilecek son beş ölçümü yeniden eskiye getirir. Üçüncü komut son bir saatin en yüksek değerini metin olarak verir. Dördüncü komut pencerede kaç ölçüm olduğunu sayar; sensör yeni çalışmaya başladıysa 60'tan küçük olabilir. Son komut 30 ile 39 arasında başlayan değerlerin indekslerini bulur. Aynı işi bir sorted set ya da liste ile de yapabilirsiniz; ancak boyut sınırını, toplamayı ve aramayı ayrı komutlarla ya da uygulama tarafında yönetmeniz gerekir. Zaman damgası, etiketler ve zaman aralığına göre toplama gerekiyorsa Time Series yazısındaki veri tipi daha uygundur.
Sık yapılan hatalar

- Eski sunucuda denemek. Array komutları Redis 8.8 öncesinde yoktur.
ARSETyanıtını yazılan değer sayısı sanmak. Yanıt yalnızca daha önce boş olan yuvaları sayar; var olan bir değerin üzerine yazmak sayılmaz.ARLENile eleman saymak. Seyrek dizide bu değer gerçek eleman sayısından çok büyük olabilir;ARCOUNTkullanın.- İmleçli ekleme ile indeksli yazmayı karıştırmak.
ARINSERTimleciARSETyazmalarını izlemez ve dolu bir yuvanın üzerine yazabilir. - Halka tamponda indeks sırasını kronoloji sanmak. Ekleme sırası için
ARLASTITEMSkullanın. - Büyük aralıkları
ARGETRANGEile okumak. 1.000.000 sınırına takılırsınız ve boş yuvalar da gelir.
Sık Sorulan Sorular
Array hangi Redis sürümünde geldi?
Redis 8.8 sürüm notlarında yeni bir veri yapısı olarak duyuruldu. Daha eski sunucularda bu komutlar bulunmaz.
Array mi, List mi kullanmalıyım?
İki uçtan ekleme ve çıkarma ya da öğeler arasına ekleme gerekiyorsa List. Değerlere sayısal indeksle doğrudan erişmek, seyrek indeksler kullanmak ya da halka tampon kurmak istiyorsanız Array.
Boş indeksler bellek tüketir mi?
Belgeye göre dilimli kodlama sayesinde büyük indeks boşlukları çok az bellek tüketir; boş yuvalar için tek tek yer ayrılmaz.
Değerleri sayı olarak saklayabilir miyim?
Değerler metin olarak saklanır. AROP toplama işlemleri bu metinleri sayısal olarak yorumlar ve sonucu metin ya da tamsayı yanıt olarak döndürür.
Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.
İlgili içerikler: Redis öğrenme rehberi · List komutları · Redis Streams · Redis Time Series · Redis 8 yenilikleri