Skip to content

Redis

Redis, ANSI C programlama dili ile yazılmış, BSD lisansına tabi, ağ destekli, bellek tabanlı, dağıtık, isteğe bağlı kalıcılık sunan anahtar-değer (Key-Value) depolama veritabanıdır. Birçok programlama dili için API sağlar. Redis hem bir NoSQL veritabanı olarak hem de yüksek hızlı önbellek depolama olarak kullanılabilir. Ayrıca basit mesaj kuyruğunu da destekler.

Bu makale sadece Go dili sürücüsü kullanılarak Redis veritabanının nasıl kullanılacağını anlatır. Redis'in kendisi hakkında herhangi bir açıklama yapılmaz.

Resmi dokümantasyon: Golang Redis client (uptrace.dev)

Resmi depo: go-redis/redis: Type-safe Redis client for Golang (github.com)

Kurulum

Redis için birçok sürücü bulunmaktadır. Bu makalede github.com/go-redis/redis kullanılmaktadır.

Eğer Redis sürümünüz 6 ise:

go get github.com/go-redis/redis/v8

Eğer Redis sürümünüz 7 ise:

go get github.com/go-redis/redis/v9

Hızlı Başlangıç

go
import (
   "fmt"
   "log"
   "testing"

   "github.com/go-redis/redis"
)

func TestQuickStart(t *testing.T) {
   // Redis bağlantı istemcisini oluştur
   redisClient := redis.NewClient(&redis.Options{
      Addr:     "192.168.48.134:6379",
      Password: "123456",
      DB:       0, // Varsayılan DB'yi kullan
   })

   // Anahtar-değer çiftini ayarla, 0 sonsuza kadar geçerli demektir
   redisClient.Set("hello", "world", 0)

   // Değeri oku
   result, err := redisClient.Get("hello").Result()
   if err == redis.Nil {
      fmt.Println("anahtar mevcut değil")
   } else if err != nil {
      log.Panic(err)
   }
   fmt.Println(result)
}

Bağlantı Yapılandırması

go
type Options struct {
  // Ağ türü tcp veya unix.
  // Varsayılan tcp'dir.
  Network string
  // redis adresi, format host:port
  Addr string

    // Dialer yeni bir ağ bağlantısı oluşturur ve Network ve Addr seçeneklerinden daha yüksek önceliğe sahiptir
  // Network and Addr options.
  Dialer func() (net.Conn, error)

  // Yeni bir redis bağlantısı oluşturulduğunda bu fonksiyon çağrılır
  OnConnect func(*Conn) error

  // redis şifresi, redis sunucusunda ayarlanmamışsa boş olabilir.
  Password string

  // redis veritabanı, 0'dan başlayan sıra numarası, varsayılan 0'dır, ayarlanmayabilir
  DB int

  // redis işlemi başarısız olduğunda maksimum yeniden deneme sayısı, varsayılan 0.
  MaxRetries int

  // Minimum yeniden deneme aralığı.
  // Varsayılan 8ms; -1 kapatmak içindir.
  MinRetryBackoff time.Duration

  // Maksimum yeniden deneme aralığı
  // Varsayılan 512ms; -1 kapatmak içindir.
  MaxRetryBackoff time.Duration

  // redis yeni bağlantı zaman aşımı.
  // Varsayılan 5 saniye.
  DialTimeout time.Duration

  // socket okuma zaman aşımı
  // Varsayılan 3 saniye.
  ReadTimeout time.Duration

  // socket yazma zaman aşımı
  WriteTimeout time.Duration

  // redis bağlantı havuzundaki maksimum bağlantı sayısı.
  // Varsayılan bağlantı havuzu boyutu cpu çekirdek sayısı * 10'dur
  PoolSize int

  // redis bağlantı havuzundaki minimum boş bağlantı sayısı.
  MinIdleConns int

  // redis bağlantısının maksimum yaşam süresi, varsayılan olarak eski bağlantılar kapatılmaz.
  MaxConnAge time.Duration

  // redis bağlantı havuzundan bir bağlantı aldıktan sonra, bağlantı havuzunun bu alınan bağlantı için ne kadar bekleyeceği.
  // Varsayılan olarak ReadTimeout + 1 saniye bekler.
  PoolTimeout time.Duration

  // redis bağlantı havuzunun bir boş bağlantıyı ne kadar süre sonra kapatacağı.
  // Varsayılan 5 dakikadır. -1 bu yapılandırma öğesini kapatır
  IdleTimeout time.Duration

  // Boş bağlantıların ne sıklıkla kontrol edileceği
  // Varsayılan 1 dakikadır. -1 boş bağlantı kontrolünü kapatır
  IdleCheckFrequency time.Duration

  // Salt okunur ayarı, true olarak ayarlanırsa, mevcut düğüm örneğinde redis sadece önbelleği sorgulayabilir, güncelleme yapamaz.
  readOnly bool

    // TLS yapılandırması
  TLSConfig *tls.Config
}

Bağlantı Kurma

go
// Redis bağlantı istemcisini oluştur
redisClient := redis.NewClient(&redis.Options{
    Addr:     "192.168.48.134:6379",
    Password: "123456",
    DB:       0, // Varsayılan DB'yi kullan
})

Bağlantıyı Kapatma

Sürücü dahili olarak bir bağlantı havuzu yönetir. Her işlem için bağlantıyı kapatmaya gerek yoktur.

go
defer redisClient.Close()

Bu Redis sürücüsü neredeyse tüm işlemleri hazır hale getirmiştir. Redis komutları ve metod adları birebir eşleşir. Temel olarak Redis komutlarının nasıl kullanılacağını biliyorsanız, sürücünün ilgili metodlarını da kullanabilirsiniz.

Redis komutları: redis komut kılavuzu

Temel İşlemler

Anahtar Silme

go
redisClient.Set("name", "jack", 0)
fmt.Println(redisClient.Del("name").Result())

Son Kullanma Süresi

go
redisClient.Set("name", "jack", 0)
// Son kullanma süresini ayarla
redisClient.Expire("name", time.Second*2)
fmt.Println(redisClient.Get("name").Val())
time.Sleep(time.Second * 3)
fmt.Println(redisClient.Get("name").Val())

Son Kullanma Süresini İptal Et

go
redisClient.Set("name", "jack", 2)
// Son kullanma süresini iptal et
redisClient.Persist("name")
time.Sleep(time.Second * 2)
fmt.Println(redisClient.Get("name"))

Son Kullanma Süresini Sorgula

go
fmt.Println(redisClient.TTL("name"))
fmt.Println(redisClient.PTTL("name"))

Yeniden Adlandırma

go
redisClient.Rename("name", "newName")

Türü Sorgula

go
redisClient.Type("name")

Tarama

go
fmt.Println(redisClient.Scan(0, "", 4))

String (Dize)

Basit Saklama ve Erişim

go
redisClient.Set("token", "abcefghijklmn", 0)
fmt.Println(redisClient.Get("token").Val())

Toplu Saklama ve Erişim

go
redisClient.MSet("cookie", "12345", "token", "abcefg")
fmt.Println(redisClient.MGet("cookie", "token").Val())

Sayı Artırma ve Azaltma

go
redisClient.Set("age", "1", 0)
// Kendiliğinden artır
redisClient.Incr("age")
fmt.Println(redisClient.Get("age").Val())
// Kendiliğinden azalt
redisClient.Decr("age")
fmt.Println(redisClient.Get("age").Val())

Hash (Karma Tablo)

Okuma ve Yazma İşlemleri

go
// Tekli ayarlama
redisClient.HSet("map", "name", "jack")
// Toplu ayarlama
redisClient.HMSet("map", map[string]interface{}{"a": "b", "c": "d", "e": "f"})
// Tekli erişim
fmt.Println(redisClient.HGet("map", "a").Val())
// Toplu erişim
fmt.Println(redisClient.HMGet("map", "a", "b").Val())
// Tüm map'i al
fmt.Println(redisClient.HGetAll("map").Val())

Çıktı

b
[b <nil>]
map[a:b c:d e:f name:jack]

Anahtar Silme

go
// map'in bir alanını sil
redisClient.HDel("map", "a")

Anahtarın Var Olup Olmadığını Kontrol Et

go
// Alanın var olup olmadığını kontrol et
redisClient.HExists("map", "a")

Tüm Anahtarları Al

go
// map'in tüm anahtarlarını al
redisClient.HKeys("map")

Hash Tablosu Uzunluğunu Al

go
// map'in uzunluğunu al
redisClient.HLen("map")

Hash Tablosu Anahtar-Değer Çiftlerini Tara

go
// map'teki anahtar-değer çiftlerini tara
redisClient.HScan("map", 0, "", 1)

List (Liste)

Eleman Değiştirme

go
// Sola ekle
redisClient.LPush("list", "a", "b", "c", "d", "e")
// Sağa ekle
redisClient.RPush("list", "g", "i", "a")
// Referans değerin önüne değer ekle
redisClient.LInsertBefore("list", "a", "aa")
// Referans değerin arkasına değer ekle
redisClient.LInsertAfter("list", "a", "gg")
// Belirli indeksteki elemanın değerini ayarla
redisClient.LSet("list", 0, "head")

Uzunluğa Erişim

go
// Liste uzunluğuna eriş
redisClient.LLen("list")

Elemanlara Erişim

go
// Soldan eleman çıkar
redisClient.LPop("list")
// Sağdan eleman çıkar
redisClient.RPop("list")
// Belirli indeksteki elemana eriş
redisClient.LIndex("list", 1)
// Belirli aralıktaki elemanlara eriş
redisClient.LRange("list", 0, 1)

Eleman Silme

go
// Belirli elemanı sil
redisClient.LRem("list", 0, "a")
// Belirli aralıktaki elemanları sil
redisClient.LTrim("list", 0, 1)
// Belirli aralıktaki elemanları koru
redisClient.LTrim("list", 0, 1)

Set (Küme)

Eleman Ekleme

go
// Bir kümeye eleman ekle
redisClient.SAdd("set", "a", "b", "c")
redisClient.SAdd("set2", "c", "d", "e")

Küme Elemanlarına Erişim

go
// Kümedeki tüm üyeleri al
redisClient.SMembers("set")
// Bir elemanın bu kümeye ait olup olmadığını kontrol et
redisClient.SIsMember("set", "a")
// Rastgele count tane eleman döndür
redisClient.SRandMemberN("set", 1)
// Bir kümenin eleman sayısını al
redisClient.SCard("set")

Küme İşlemleri

go
// Verilen kümelerin farkını döndür
redisClient.SDiff("set", "set2")
// Verilen kümelerin farkını sonuç kümesinde sakla, sonuç kümesinin uzunluğunu döndür
redisClient.SDiffStore("store", "set", "se2")
// Verilen kümelerin kesişimini döndür
redisClient.SInter("set", "set2")
// Verilen kümelerin kesişimini sonuç kümesinde sakla, sonuç kümesinin uzunluğunu döndür
redisClient.SInterStore("store", "set", "set2")
// Verilen kümelerin birleşimini döndür
redisClient.SUnion("set", "set2")
// Verilen kümelerin birleşimini sonuç kümesinde sakla, sonuç kümesinin uzunluğunu döndür
redisClient.SUnionStore("store", "set", "store")

Eleman Silme

go
// Elemanı çıkar ve sil
redisClient.SPop("set")
// N tane elemanı çıkar ve sil
redisClient.SPopN("set", 2)

Eleman Taşıma

go
// Kaynak kümeden belirli elemanı hedef kümeye taşı
redisClient.SMove("set", "set2", "a")

Eleman Silme

go
// Belirli elemanı sil
redisClient.SRem("set", "a", "b")

Tarama

go
// Kümeyi tara
redisClient.SScan("set", 0, "", 2)

Sorted Set (Sıralı Küme)

Eleman Ekleme

go
// Sıralı kümeye eleman ekle
redisClient.ZAdd("ss", redis.Z{
   Score:  1,
   Member: "a",
}, redis.Z{
   Score:  2,
   Member: "b",
})

Eleman Sıralaması

go
// Sıralı kümede elemanın sıralamasını döndür, düşükten yükseğe sıralama
redisClient.ZRank("ss", "1")
// Sıralı kümede elemanın sıralamasını döndür, yüksekten düşüğe sıralama
redisClient.ZRevRank("ss", "1")

Elemanlara Erişim

go
// min ve max arasında kalan üye sayısını döndür
redisClient.ZCount("ss", "1", "2")

// Elemanın ağırlık değerini döndür
redisClient.ZScore("ss", "a")

// Belirli aralıktaki elemanları döndür
redisClient.ZRange("ss", 1, 2)
// min ve max arasında kalan tüm üye listesini döndür
redisClient.ZRangeByScore("ss", redis.ZRangeBy{
   Min:    "1",
   Max:    "2",
   Offset: 0,
   Count:  1,
})

Ağırlık Değiştirme

go
// Belirli bir elemana karşılık gelen ağırlık değerini artır
redisClient.ZIncr("ss", redis.Z{
   Score:  2,
   Member: "b",
})

Eleman Silme

go
// Belirli elemanı sil
redisClient.ZRem("ss", "a")
// Belirli sıralama aralığındaki elemanları sil
redisClient.ZRemRangeByRank("ss", 1, 2)
// min ve max aralığındaki ağırlık değerine sahip elemanları sil
redisClient.ZRemRangeByScore("ss", "1", "2")

Script (Betik)

go
// Betiği yükle, sha değerini döndür
redisClient.ScriptLoad("return 0")
// sha değerine göre betiği çalıştır
redisClient.EvalSha("sha", []string{}, "")
// Betiği doğrudan çalıştır
redisClient.Eval("return 0", []string{}, "")
// Betik önbelleğini temizle
redisClient.ScriptFlush()
// Şu anda çalışan betiği durdur
redisClient.ScriptKill()
// İlgili hash değerine sahip betiğin var olup olmadığını doğrula
redisClient.ScriptExists("")

Yayın Abonelik (Pub/Sub)

go
// Belirli kanala mesaj gönder
redisClient.Publish("channel", "message")
// Belirli kanala abone ol
redisClient.Subscribe("channel")
// Abonelik durumunu görüntüle
redisClient.PubSubNumSub("channel")

Golang by www.golangdev.cn edit