redis-cli, Redis sunucusuna komut gönderip yanıtını okumanızı sağlayan resmî komut satırı aracıdır. İki temel kullanım şekli vardır: komutu doğrudan kabuk satırına argüman olarak yazıp tek seferlik çalıştırmak ya da argümansız açıp etkileşimli bir istemde (REPL) komut yazmak. Bunlara ek olarak sunucu istatistiklerini izleme, büyük anahtarları bulma, gecikme ölçme ve uzaktan yedek alma gibi işler için özel modları da bulunur.

Bu yazıda bağlantı seçeneklerini (-h, -p, -a, -u, -n), TLS ayarlarını, tırnak ve kaçış kurallarını, başka programlardan girdi almayı, komut tekrarlamayı, çıktı biçimlerini ve etkileşimli modun özelliklerini resmî belgedeki örneklerle anlatıyoruz. Özel modları ise kısaca tanıtıp her birinin ayrıntılı anlatıldığı yazıya bağlantı veriyoruz. Serinin genel planı için Redis öğrenme rehberine bakabilirsiniz.

redis-cli nasıl kurulur?

redis-cli nasıl kurulur?

Belgeye göre en kolay yol, Linux veya macOS için hazırlanmış bağımsız redis-cli ikili dosyasını kurmaktır. Başlangıç sayfası bunun için aşağıdaki betiği verir; Redis 8.10 sürüm notları da bağımsız redis-cli kurulum desteğini yenilikler arasında sayar:

bash
curl -fsSL https://packages.redis.io/redis-cli/install.sh | sh

Redis Open Source’u herhangi bir yöntemle kurduğunuzda redis-cli de onunla birlikte gelir. Kaynaktan derliyorsanız her şeyi derlemek yerine yalnızca make redis-cli çalıştırabilirsiniz; araç kaynak klasöründeki src dizinine yazılır. Redis’i Docker kapsayıcısında çalıştırıyorsanız hiçbir şey kurmadan kapsayıcının içindeki aracı kullanabilirsiniz:

bash
docker exec -it redis redis-cli

Sunucunun kendisini kurmak bu yazının konusu değil; kurulum adımları için Redis nedir, nasıl kurulur yazısına bakın.

Komut satırından tek komut çalıştırma

Bir komutu çalıştırıp sonucunu terminalde görmek için komutu ve argümanlarını redis-cli sonrasına ayrı argümanlar olarak yazarsınız. Belgedeki örnekte bir sayaç artırılıyor:

bash
$ redis-cli INCR mycounter
(integer) 7

Redis yanıtları türlüdür; tamsayı, string, dizi, boş değer veya hata olabilir. Bu yüzden araç, yanıtın türünü parantez içinde gösterir. Bu bilgi insan için faydalıdır ama çıktıyı bir dosyaya yazarken ya da başka bir komuta aktarırken sorun çıkarır. redis-cli bunu kendisi çözer: standart çıktının bir terminal (tty) olmadığını fark ettiğinde ham çıktı moduna geçer ve tür etiketlerini yazmaz.

bash
$ redis-cli INCR mycounter > /tmp/output.txt
$ cat /tmp/output.txt
8

Ham çıktıyı terminalde de görmek isterseniz --raw, tam tersine dosyaya veya boruya yazarken bile biçimli çıktı isterseniz --no-raw seçeneğini kullanın:

bash
$ redis-cli --raw INCR mycounter
9

Betiklerde işe yarayan bir seçenek daha var: -e, komut başarısız olduğunda aracın hata koduyla çıkmasını sağlar. Böylece kabuk betiğiniz bir Redis hatasını sessizce geçmez.

Sunucu, port, parola ve veritabanı seçimi

redis-cli varsayılan olarak 127.0.0.1 adresindeki 6379 portuna bağlanır. Başka bir sunucu için -h, başka bir port için -p kullanırsınız:

bash
$ redis-cli -h redis15.localnet.org -p 6390 PING
PONG

Sunucu parola istiyorsa -a seçeneği bağlantıdan sonra kimlik doğrulamayı sizin yerinize yapar; ayrıca AUTH yazmanız gerekmez. ACL kullanıcılarıyla çalışıyorsanız --user ile kullanıcı adını verirsiniz; bu seçenek -a ile birlikte kullanılır. --pass, -a seçeneğinin diğer adıdır.

bash
$ redis-cli -a myUnguessablePazzzzzword123 PING
PONG

Redis’te varsayılan veritabanı sıfır numaralıdır. Başka bir numaralı veritabanında komut çalıştırmak için -n kullanılır. Belgedeki örnekte aynı a anahtarı farklı veritabanlarında birbirinden bağımsız sayaçlar olarak davranır:

bash
$ redis-cli FLUSHALL
OK
$ redis-cli -n 1 INCR a
(integer) 1
$ redis-cli -n 1 INCR a
(integer) 2
$ redis-cli -n 2 INCR a
(integer) 1

Bu bilgilerin bir kısmını veya tamamını tek bir adresle de verebilirsiniz. -u seçeneği redis://user:password@host:port/dbnum biçimindeki bir URI alır. Kullanıcı, parola ve veritabanı numarası isteğe bağlıdır; kullanıcı adı olmadan kimlik doğrulamak için kullanıcı adı olarak default yazılır, TLS için şema rediss olur. Örnekteki parolada bulunan @ karakterinin %40 olarak kodlandığına dikkat edin:

bash
$ redis-cli -u redis://LJenkins:p%40ssw0rd@redis-16379.hosted.com:16379/0 PING
PONG

Diğer bağlantı seçenekleri şunlardır: -s bir Unix soketi yolu alır ve adres ile portu geçersiz kılar; -t saniye cinsinden bağlantı zaman aşımıdır (ondalık değer verilebilir, varsayılan 0 yani sınırsızdır); -4 ve -6 DNS çözümlemesinde IPv4 veya IPv6 tercihini belirler; --name bağlantıya bir istemci adı verir; -2 ve -3 oturumu RESP2 veya RESP3 protokolüyle başlatır. Bağlantı adreslerinin uygulama kodundaki kullanımı için bağlantı URL ve connection pool yazısına bakın.

SSL/TLS ile bağlanma

redis-cli varsayılan olarak düz bir TCP bağlantısı kurar. Şifreli bağlantı için --tls seçeneğini, güvenilen kök sertifika paketi için --cacert veya bir sertifika dizini için --cacertdir seçeneğini eklersiniz. Sunucu istemci sertifikasıyla kimlik doğrulama istiyorsa sertifikayı --cert, karşılık gelen özel anahtarı --key ile verirsiniz. -u ile bağlanıyorsanız şemayı rediss yapmanız da TLS kullanılacağını belirtir.

Tırnak ve kaçış kuralları

Tırnak ve kaçış kuralları: \" çift tırnak, \\ ters eğik çizgi, \n yeni satır, \r satır başı, \t yatay sekme, \b geri silme, \a uyarı karakteri, \xhh onaltılık sayıyla verilen...

Araç bir komutu ayrıştırırken boşluk karakterlerini argüman ayırıcı olarak kabul eder; etkileşimli modda Enter tuşu komutu gönderir. Boşluk veya yazdırılamayan karakter içeren bir değer girmek için değeri çift (") ya da tek (') tırnağa alırsınız. Çift tırnaklı stringlerde şu kaçış dizileri çalışır:

  • \" çift tırnak, \\ ters eğik çizgi
  • \n yeni satır, \r satır başı, \t yatay sekme
  • \b geri silme, \a uyarı karakteri
  • \xhh onaltılık sayıyla verilen herhangi bir ASCII karakter

Tek tırnaklı stringler ise içeriği olduğu gibi kabul eder ve yalnızca \' (tek tırnak) ile \\ (ters eğik çizgi) kaçışlarına izin verir. Aşağıdaki örnekte çift tırnak içindeki \n gerçek bir satır sonuna dönüşür ve değer iki satır olarak okunur:

text
127.0.0.1:6379> SET mykey "Hello\nWorld"
OK
127.0.0.1:6379> GET mykey
Hello
World

Parolalar gibi içinde tırnak işareti geçen değerlerde, içteki tırnağı ters eğik çizgiyle kaçırmanız gerekir. Komut satırından ikili güvenli olmayan bir değer, örneğin içinde sıfır baytı olan bir anahtar adı geçirmek istediğinizde --quoted-input seçeneği girdinin tırnaklı string olarak yorumlanmasını zorlar.

Başka programlardan girdi almak

Standart girdiden veri almanın iki yolu vardır. Birincisi -x seçeneğidir: araç son argümanı standart girdiden okur. Belgedeki örnekte bir dosyanın tamamı tek bir anahtara yazılıyor ve ardından ilk 51 baytı okunuyor:

bash
$ redis-cli -x SET net_services < /etc/services
OK
$ redis-cli GETRANGE net_services 0 50
"#\n# Network services, Internet style\n#\n# Note that "

İkinci yol, komutları satır satır bir metin dosyasına yazıp dosyayı araca borulamaktır. Komutlar, sanki etkileşimli modda tek tek yazılmış gibi sırayla çalışır:

bash
$ cat /tmp/commands.txt
SET item:3374 100
INCR item:3374
APPEND item:3374 xxx
GET item:3374
$ cat /tmp/commands.txt | redis-cli
OK
(integer) 101
(integer) 6
"101xxx"

Dosyadaki değerler tırnaklanabilir; böylece boşluk veya özel karakter içeren argümanlar tek parça kalır. Belgedeki ikinci örnekte "This is a single argument" tek argüman olarak yazılır ve STRLEN 25 döndürür. Çok büyük miktarda veriyi yüklemek içinse bu yöntem yerine Redis protokolünü doğrudan gönderen --pipe modu önerilir; bunu pipelining ve toplu yükleme yazısında anlatıyoruz.

Aynı komutu tekrar tekrar çalıştırma

-r seçeneği komutun kaç kez çalışacağını, -i seçeneği iki çalıştırma arasındaki bekleme süresini saniye cinsinden belirtir; 0.1 gibi ondalık değerler 100 milisaniye anlamına gelir. Bekleme varsayılan olarak sıfırdır:

bash
$ redis-cli -r 5 INCR counter_value
(integer) 1
(integer) 2
(integer) 3
(integer) 4
(integer) 5

Sayı olarak -1 verirseniz komut siz durdurana kadar çalışır. Belgedeki örnek, INFO çıktısındaki RSS bellek değerini her saniye bir satır olarak izler:

bash
$ redis-cli -r -1 -i 1 INFO | grep rss_human
used_memory_rss_human:2.71M
used_memory_rss_human:2.73M
used_memory_rss_human:2.73M
used_memory_rss_human:2.73M

Etkileşimli modda aynı işi komutun önüne bir sayı yazarak yaparsınız: 5 INCR mycounter komutu beş kez çalıştırır ve beş ayrı yanıt basar. INFO çıktısındaki alanların anlamı INFO komutu yazısında anlatılıyor.

Çıktı biçimleri: CSV, JSON ve ayraçlar

Çıktıyı başka bir programa aktarmak için birkaç biçim seçeneği vardır. --csv, tek bir komutun yanıtını virgülle ayrılmış değerler olarak yazar:

bash
$ redis-cli LPUSH mylist a b c d
(integer) 4
$ redis-cli --csv LRANGE mylist 0 -1
"d","c","b","a"

Belge, --csv seçeneğinin yalnızca tek bir komut için çalıştığını, bütün veritabanını dışa aktaran bir araç olmadığını özellikle belirtir. --json yanıtı JSON olarak yazar (varsayılan olarak RESP3 kullanır, RESP2 ile kullanmak için -2 eklenir); --quoted-json aynı işi Unicode yerine ASCII güvenli tırnaklı stringlerle yapar. Ham çıktıda yanıt parçaları arasındaki ayracı -d, yanıtlar arasındaki ayracı -D ile değiştirebilirsiniz; ikisinin de varsayılanı yeni satırdır.

Etkileşimli mod

Etkileşimli mod: Geçmiş, tamamlama, ipuçları ve tercihler, HELP ile komut yardımı

Çoğu kullanıcı zamanının büyük kısmını etkileşimli modda geçirir. Bu mod için hiçbir seçenek gerekmez; aracı argümansız çalıştırmanız yeterlidir. İstemdeki 127.0.0.1:6379> bağlı olduğunuz sunucunun adresini ve portunu gösterir. Sıfır dışındaki bir veritabanını SELECT ile seçtiğinizde istem de değişir:

text
127.0.0.1:6379> SELECT 2
OK
127.0.0.1:6379[2]> DBSIZE
(integer) 1
127.0.0.1:6379[2]> SELECT 0
OK
127.0.0.1:6379> DBSIZE
(integer) 503

CONNECT komutu, oturumu kapatmadan başka bir sunucuya geçmenizi sağlar. Ulaşılamayan bir sunucuya bağlanmaya çalışırsanız araç bağlantısız (not connected) duruma geçer ve her yeni komutta yeniden bağlanmayı dener. Bağlantı koptuğunda da araç sessizce yeniden bağlanmayı dener ve son seçtiğiniz veritabanı numarasını otomatik olarak yeniden seçer. Ancak bağlantıya ait diğer durumlar kaybolur. Belgedeki örnekte açık bir işlem, sunucu yeniden başlatıldıktan sonra kaybolmuştur:

text
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> PING
QUEUED

( here the server is manually restarted )

127.0.0.1:6379> EXEC
(error) ERR EXEC without MULTI

Bu durum test sırasında genellikle sorun değildir ama bilinmesi gerekir: yeniden bağlanma veritabanı seçimi dışındaki bağlantı durumlarını, örneğin açık bir MULTI bloğunu geri getirmez. İşlemlerin nasıl çalıştığı MULTI, EXEC ve WATCH yazısında anlatılıyor.

Geçmiş, tamamlama, ipuçları ve tercihler

Araç linenoise satır düzenleme kütüphanesini kullanır, bu yüzden ek bir kütüphaneye ihtiyaç duymadan satır düzenleme yapabilirsiniz. Yukarı ve aşağı ok tuşları komut geçmişinde dolaşır; geçmiş, ev dizinindeki .rediscli_history dosyasında saklanır ve araç kapanıp açılsa da korunur. Farklı bir dosya için REDISCLI_HISTFILE ortam değişkenini ayarlarsınız; değişkeni /dev/null yaparsanız geçmiş tutulmaz. Parola içeren komutları sık yazıyorsanız bu ayarı düşünmeye değer.

TAB tuşu komut adlarını tamamlar; komut adını yazdıktan sonra araç sözdizimi ipuçları gösterir. Terminallerdeki CTRL-R gibi geriye doğru geçmiş araması da desteklenir. Belgeye göre Redis 8.8 ile birlikte uzun komutları düzenlerken kelime kelime atlamak için Alt veya Ctrl ile ok tuşları da kullanılabilir. Tercihleri ev dizinindeki .redisclirc dosyasına yazarsınız (yerini REDISCLI_RCFILE ile değiştirebilirsiniz) ya da oturum içinde :set hints ve :set nohints ile ipuçlarını açıp kapatırsınız. CLEAR komutu ekranı temizler.

HELP ile komut yardımı

HELP komutunun iki biçimi vardır. HELP @kategori bir kategorideki bütün komutları listeler; belgedeki kategoriler @generic, @string, @list, @set, @sorted_set, @hash, @pubsub, @transactions, @connection, @server, @scripting, @hyperloglog, @cluster, @geo ve @stream olarak sayılır. HELP komutadı ise tek bir komutun sözdizimini ve kısa açıklamasını gösterir:

text
127.0.0.1:6379> HELP PFADD

PFADD key element [element ...]
summary: Adds the specified elements to the specified HyperLogLog.
since: 2.8.9

HELP da TAB ile tamamlanır. Sunucuya bağlanmadan aracın kendi seçeneklerini görmek için redis-cli --help, sürümünü görmek için redis-cli --version kullanılır.

Lua betiğini dosyadan çalıştırma

--eval seçeneği bir Lua dosyasını EVAL komutuyla gönderir. EVAL normalde anahtar sayısını ayrıca ister; --eval ile buna gerek kalmaz, anahtarlar ile diğer argümanlar arasına boşluklarla çevrili bir virgül koyarsınız. Aşağıdaki örnekte location:hastings:temp betikteki KEYS dizisine, 23 ise ARGV dizisine gider:

bash
$ cat /tmp/script.lua
return redis.call('SET',KEYS[1],ARGV[1])
$ redis-cli --eval /tmp/script.lua location:hastings:temp , 23
OK

Daha karmaşık betikler için belge Lua hata ayıklayıcısını (--ldb) önerir. Betik yazımının tamamı Lua script: EVAL ve EVALSHA yazısında anlatılıyor.

Özel modlara kısa bakış

Aşağıdaki tablo, redis-cli aracının özel modlarını ve her birinin ayrıntılı anlatıldığı yazıyı gösterir. Bu modların çoğu sunucuya ek yük bindirir; çalışan bir sunucuda kullanmadan önce ilgili yazıdaki uyarıları okuyun.

Seçenek veya komutNe yaparAyrıntı
--statHer saniye anahtar, bellek, istemci ve istek sayılarını basarINFO komutu yazısı
--bigkeys, --memkeys, --keystatsAnahtar uzayını SCAN ile tarayıp büyük anahtarları bulurBellek kullanımı yazısı
--scan --patternSCAN ile anahtar adlarını listelerSCAN ve KEYS yazısı
--latency, --latency-historyPING ile gecikmeyi ölçerSlowlog ve latency yazısı
--rdb dosyaUzak sunucudan RDB dökümünü yerel dosyaya aktarırYedek alma yazısı
--pipeStandart girdideki ham protokolü sunucuya gönderirPipelining yazısı
SUBSCRIBE, PSUBSCRIBEPub/Sub moduna girer ve mesajları beklerPub/Sub yazısı
MONITORSunucuya gelen her komutu basarSlowlog ve latency yazısı
-cCluster modunda MOVED ve ASK yönlendirmelerini izlerCluster yazısı

İlgili yazılar: INFO komutu, bellek kullanımı, SCAN ve KEYS farkı, slowlog ve latency, yedek alma, pipelining, Pub/Sub ve cluster ve hash slot.

Sık yapılan hatalar

  • Boşluklu değeri tırnaksız yazmak: SET mesaj merhaba dünya üç ayrı argüman olarak ayrıştırılır ve komut beklediğinizden farklı çalışır ya da sözdizimi hatası verir. Değeri tırnağa alın.
  • Tek ve çift tırnağı karıştırmak: \n yalnızca çift tırnak içinde satır sonuna dönüşür; tek tırnak içinde olduğu gibi kalır.
  • Parolayı -a ile yazıp geçmişte bırakmak: Mümkünse REDISCLI_AUTH veya --askpass kullanın.
  • Betikte etiketli çıktı beklemek: Çıktı yönlendirildiğinde (integer) gibi etiketler kaybolur. Betiğiniz bu etiketleri ayrıştırıyorsa --no-raw kullanın ya da daha iyisi ham çıktıya göre yazın.
  • Yeniden bağlanmanın durumu koruduğunu sanmak: Veritabanı numarası geri gelir ama açık bir MULTI bloğu gelmez.
  • Komut hatasını betikte kaçırmak: Kabuk betiğinde Redis hatasının çıkış koduna yansıması için -e ekleyin.

Sık Sorulan Sorular

redis-cli hangi sunucuya bağlanır?

Hiçbir seçenek vermezseniz 127.0.0.1 adresindeki 6379 portuna bağlanır. Adresi -h, portu -p, Unix soketini -s ile değiştirirsiniz ya da hepsini -u ile tek bir URI olarak verirsiniz.

Parolayı güvenli biçimde nasıl veririm?

Belge parolanın REDISCLI_AUTH ortam değişkeniyle verilmesini önerir. Parolayı her seferinde elle girmek isterseniz --askpass onu maskeli olarak sorar. ACL kullanıcıları ve parola kuralları için Redis ACL yazısına bakın.

Çıktıdaki (integer) gibi etiketlerden nasıl kurtulurum?

--raw seçeneğini ekleyin. Çıktıyı bir dosyaya veya boruya yönlendirdiğinizde araç bunu zaten kendiliğinden yapar.

Bir komutun sözdizimini unuttum, nereden bakarım?

Etkileşimli modda HELP komutadı yazın; bir kategorideki bütün komutlar için HELP @string gibi kategori adını kullanın. Komut adını yazdıktan sonra görünen ipuçları da argüman sırasını hatırlatı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 · Anahtar isimlendirme ve keyspace · String komutları · SCAN ve KEYS farkı · Redis nedir