Redis ile etkileşim kurmak için istemci API'sini keşfedin

Tamamlandı

Daha önce belirtildiği gibi Redis, birden çok sunucu arasında çoğaltılabilir bellek içi bir NoSQL veritabanıdır. Genellikle önbellek olarak kullanılır, ancak resmi bir veritabanı veya hatta ileti aracısı olarak kullanılabilir.

Redis çeşitli veri türlerini ve yapılarını depolayabilir. Önbelleğe alınmış verileri almak veya önbelleğin kendisi hakkındaki bilgileri sorgulamak için verebileceğiniz çeşitli komutları destekler. Çalıştığınız veriler her zaman anahtar/değer çiftleri olarak depolanır.

Redis önbelleğinde komut yürütme

Bir istemci uygulama, Redis önbelleğinde istek biçimlendirmek ve komut yürütmek için genellikle bir istemci kitaplığı kullanır. İstemci kitaplığı listesine Redis istemcileri sayfasından ulaşabilirsiniz. .NET platformu için yüksek performanslı popüler Redis istemcilerinden biri StackExchange.Redis'dir. Paket NuGet aracılığıyla kullanılabilir ve komut satırını veya IDE'yi kullanarak .NET kodunuza ekleyebilirsiniz.

StackExchange.Redis ile Redis önbelleğinize Bağlan

Hatırlarsanız bir Redis sunucusuna bağlanmak için ana bilgisayar adresini, bağlantı noktası numarasını ve bir erişim anahtarını kullanıyorduk. Azure ayrıca bazı Redis istemcileri için bu verileri tek bir dizede bir araya getiren bir bağlantı dizesi sunar.

Bağlantı dizesi nedir?

Bağlantı dizesi, Azure'da Redis önbelleğine bağlanmak ve kimlik doğrulamasından geçmek için gerekli olan tüm bilgileri içeren tek satırlı bir metindir. Bu dize şuna benzer (cache-name ve password-here yerine gerçek değerler yazılır):

[cache-name].redis.cache.windows.net:6380,password=[password-here],ssl=True,abortConnect=False

İpucu

Bağlantı dizesinin uygulamanızda korunması gerekir. Uygulama Azure'da barındırılıyorsa bu dizeyi Azure Key Vault'ta depolayabilirsiniz.

Sunucuya bağlantı oluşturmak için bu dizeyi StackExchange.Redis'e geçirebilirsiniz.

Sonunda iki parametre daha olduğuna dikkat edin:

  • ssl: İletişimin şifrelenmesini sağlar
  • abort Bağlan ion: Sunucu o anda kullanılamıyor olsa bile bağlantı oluşturulmasına izin verir

İstemci kitaplığını yapılandırmak için dizeye ekleyebileceğiniz farklı birçok isteğe bağlı parametre vardır.

Bağlantı oluştur

StackExchange.Redis istemcisindeki ana bağlantı nesnesi StackExchange.Redis.ConnectionMultiplexer sınıfıdır. Bu nesne Redis sunucusuna (veya sunucu grubuna) bağlanma işlemini soyutlar. Bağlantıları verimli bir şekilde yönetmek için iyileştirilmiştir ve önbelleğe erişmeniz gerektiğinde elinizin altında olmasını sağlar.

ConnectionMultiplexer örneğini oluşturmak için statik ConnectionMultiplexer.Connect veya ConnectionMultiplexer.ConnectAsync metodunu kullanır ve bir bağlantı dizesi veya ConfigurationOptions nesnesi iletirsiniz.

İşte basit bir örnek:

using StackExchange.Redis;
...
var connectionString = "[cache-name].redis.cache.windows.net:6380,password=[password-here],ssl=True,abortConnect=False";
var redisConnection = ConnectionMultiplexer.Connect(connectionString);
    // ^^^ store and re-use this!!!

bir ConnectionMultiplexersahip olduktan sonra, yapmak isteyebileceğiniz üç birincil şey vardır:

  1. Redis Veritabanı'na erişin (bu modülün odağı).
  2. Redis'in yayımcı/alt simge özelliklerini kullanın (bu modülün kapsamı dışında).
  3. Bakım veya izleme amacıyla bir sunucuya erişme.

Redis veritabanına erişme

Redis veritabanı IDatabase türüyle gösterilir. Almak için GetDatabase() yöntemini kullanabilirsiniz:

IDatabase db = redisConnection.GetDatabase();

İpucu

öğesinden GetDatabase döndürülen nesne basit bir nesnedir ve depolanması gerekmez. Yalnızca ConnectionMultiplexer nesnesinin canlı tutulması gerekir.

IDatabase nesnesine sahip olduğunuzda önbellekle etkileşim kurmak için gerekli yöntemleri yürütebilirsiniz. Tüm yöntemlerin ve anahtar sözcükleriyle async uyumlu hale getirmek için nesneleri döndüren Task zaman uyumlu ve await zaman uyumsuz sürümleri vardır.

Önbellekte anahtar/değer depolama örneği aşağıda verilmişti:

bool wasSet = db.StringSet("favorite:flavor", "i-love-rocky-road");

StringSet yöntemi değerin ayarlanıp (true) ayarlanmadığını (false) belirten bir bool döndürür. Ardından değeri StringGet metoduyla alabiliriz:

string value = db.StringGet("favorite:flavor");
Console.WriteLine(value); // displays: ""i-love-rocky-road""

İkili değerleri alma ve ayarlama

Redis anahtarlarının ve değerlerinin güvenli ikili olduğunu hatırlayın. İkili verileri depolamak için aynı yöntemleri kullanabilirsiniz. byte[] türleriyle çalışmak için örtük dönüştürme işleçleri olduğundan verilerle normal bir şekilde çalışabilirsiniz:

byte[] key = ...;
byte[] value = ...;

db.StringSet(key, value);
byte[] key = ...;
byte[] value = db.StringGet(key);

İpucu

StackExchange.Redis, anahtarları RedisKey türünü kullanarak temsil eder. Bu sınıf string ve byte[] için örtük dönüştürmelere sahiptir ve bu sayede hem metin hem de ikili anahtarların sorunsuz bir şekilde kullanılmasını sağlar. Değerler RedisValue türüyle gösterilir. RedisKey örneğinde olduğu gibi string veya byte[] iletmenizi sağlayan örtük dönüştürmeler vardır.

Diğer yaygın işlemler

IDatabase arabiriminde Redis önbelleğiyle çalışırken kullanabileceğiniz farklı birçok yöntem vardır. Bu metotları kullanarak karmalar, listeler, kümeler ve sıralı kümelerle çalışabilirsiniz.

Tek anahtarlarla çalışan daha yaygın işlemlerden bazıları şunlardır: tam listeyi görmek için arabirimin kaynak kodunu okuyabilirsiniz.

Metot Açıklama
CreateBatch Sunucuya tek bir birim olarak gönderilen ancak birim olarak işlenmeyen bir işlem grubu oluşturur.
CreateTransaction Sunucuya tek bir birim olarak gönderilen ve tek bir birim olarak işlenen bir işlem grubu oluşturur.
KeyDelete Anahtarı/değeri siler.
KeyExists Verilen anahtarın önbellekte olup olmadığını döndürür.
KeyExpire Anahtar için bir yaşam süresi (TTL) belirler.
KeyRename Bir anahtarı yeniden adlandırır.
KeyTimeToLive Bir anahtarın TTL değerini döndürür.
KeyType Anahtarda depolanan değer türünün dize temsilini döndürür. Döndürülebilecek farklı türler şunlardır: dize, liste, küme, zset ve karma.

Diğer komutları yürütme

IDatabase nesnesi, Redis sunucusuna metin komutlarını geçirmek için kullanılabilen bir Execute ve ExecuteAsync yöntemine sahiptir. Örneğin:

var result = db.Execute("ping");
Console.WriteLine(result.ToString()); // displays: "PONG"

Execute ve ExecuteAsync yöntemleri, iki özellik içeren bir veri sahibi olan bir RedisResult nesne döndürür:

  • Type, sonucun türünü belirten bir string döndürür: "STRING", "INTEGER", vb.
  • IsNull, sonucun ne zaman olduğunu algılamak için bir true/false değeridir null.

Ardından RedisResult üzerinde ToString() kullanarak döndürülen gerçek değeri alabilirsiniz.

Desteklenen komutları gerçekleştirmek için kullanabilirsiniz Execute . Örneğin, önbelleğe bağlı tüm istemcileri alacağız ("İsteMCİ LİSTESİ"):

var result = await db.ExecuteAsync("client", "list");
Console.WriteLine($"Type = {result.Type}\r\nResult = {result}");

Yukarıdaki komutlar tüm bağlı istemcilerin çıkışını oluşturur:

Type = BulkString
Result = id=9469 addr=16.183.122.154:54961 fd=18 name=DESKTOP-AAAAAA age=0 idle=0 flags=N db=0 sub=1 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 ow=0 owmem=0 events=r cmd=subscribe numops=5
id=9470 addr=16.183.122.155:54967 fd=13 name=DESKTOP-BBBBBB age=0 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 ow=0 owmem=0 events=r cmd=client numops=17

Daha karmaşık değerleri depolama

Redis, ikili güvenli dizeler etrafında yönlendirilir, ancak nesne grafiklerini metin biçiminde serileştirerek önbelleğe alabilirsiniz; genellikle XML veya JSON. Örneğin, istatistiklerimiz için şu şekilde görünen bir GameStat nesnemiz olabilir:

public class GameStat
{
    public string Id { get; set; }
    public string Sport { get; set; }
    public DateTimeOffset DatePlayed { get; set; }
    public string Game { get; set; }
    public IReadOnlyList<string> Teams { get; set; }
    public IReadOnlyList<(string team, int score)> Results { get; set; }

    public GameStat(string sport, DateTimeOffset datePlayed, string game, string[] teams, IEnumerable<(string team, int score)> results)
    {
        Id = Guid.NewGuid().ToString();
        Sport = sport;
        DatePlayed = datePlayed;
        Game = game;
        Teams = teams.ToList();
        Results = results.ToList();
    }

    public override string ToString()
    {
        return $"{Sport} {Game} played on {DatePlayed.Date.ToShortDateString()} - " +
               $"{String.Join(',', Teams)}\r\n\t" + 
               $"{String.Join('\t', Results.Select(r => $"{r.team } - {r.score}\r\n"))}";
    }
}

Newtonsoft.Json kitaplığını kullanarak bu nesnenin örneğini dizeye dönüştürebiliriz:

var stat = new GameStat("Soccer", new DateTime(1950, 7, 16), "FIFA World Cup", 
                new[] { "Uruguay", "Brazil" },
                new[] { ("Uruguay", 2), ("Brazil", 1) });

string serializedValue = Newtonsoft.Json.JsonConvert.SerializeObject(stat);
bool added = db.StringSet("event:1950-world-cup", serializedValue);

Tersine işlem uygulayarak bunu alıp tekrar bir nesneye dönüştürebiliriz:

var result = db.StringGet("event:1950-world-cup");
var stat = Newtonsoft.Json.JsonConvert.DeserializeObject<GameStat>(result.ToString());
Console.WriteLine(stat.Sport); // displays "Soccer"

Bağlantıyı temizleme

Redis bağlantısıyla işiniz bittiğinde, atabilirsiniz ConnectionMultiplexer. Bu komut tüm bağlantıları kapatır ve sunucuyla iletişimi kapatır:

redisConnection.Dispose();
redisConnection = null;

Şimdi bir uygulama oluşturalım ve Redis önbelleğimizle biraz çalışalım.

Daha önce belirtildiği gibi Redis, birden çok sunucu arasında çoğaltılabilir bellek içi bir NoSQL veritabanıdır. Genellikle önbellek olarak kullanılır, ancak resmi bir veritabanı veya hatta ileti aracısı olarak kullanılabilir.

Redis çeşitli veri türlerini ve yapılarını depolayabilir. Önbelleğe alınmış verileri almak veya önbelleğin kendisi hakkındaki bilgileri sorgulamak için verebileceğiniz çeşitli komutları destekler. Çalıştığınız veriler her zaman anahtar/değer çiftleri olarak depolanır.

Redis önbelleğinde komut yürütme

Bir istemci uygulama, Redis önbelleğinde istek biçimlendirmek ve komut yürütmek için genellikle bir istemci kitaplığı kullanır. İstemci kitaplığı listesine Redis istemcileri sayfasından ulaşabilirsiniz. JavaScript için popüler bir Redis istemcisi, npm install redis ile projeye ekleyebileceğiniz redis paketidir.

Redis paketiyle Redis önbelleğinize Bağlan

Redis önbelleğiyle etkileşim kurmak için RedisClient sınıfı kullanılır. Çoğu senaryoda Azure'da Redis önbelleğine bağlanan bir RedisClient oluşturmak için en iyi yol aşağıdaki demirbaş koddur:

const client = redis.createClient(
  port,  // the port number, 6380 by default
  hostname,  // <resourceName>.redis.cache.windows.net
  {
    password: accessKey,  // the primary or secondary access key
    tls: { servername: hostname }
  }
);

Çoğu durumda birden çok RedisClient oluşturmaktan kaçınmalısınız. Tek bir RedisClient örneği çeşitli yerlere geçirilebilir ve kodunuzda Redis'in gerektiği her yerde kullanılabilir.

Redis veritabanıyla çalışma

Redis komutları, komutların kendileri olarak adlarla birlikte üzerinde RedisClient yöntemler olarak temsil edilir. Aşağıda önbellekte yeni değer depolama örneği gösterilir:

client.set("myKey", "myValue"); // executes "set myKey myValue" on the cache

RedisClient üzerindeki tüm komut yöntemleri zaman uyumsuzdur ve sonucu sağlayan isteğe bağlı bir geri arama bağımsız değişkenini destekler. Paket, redis Promises'i (ve bu nedenleawaitasync/veya ile .then()zincirle) kutudan çıkarma işlemini desteklemez. RedisClient ile async/await veya .then() kullanmanın en kolay yolu, bluebird paketinin promisifyAll işleviyle istemcinin tamamına bir kerede Promise desteği eklemektir:

var redis = require("redis");
var Promise = require("bluebird");

Promise.promsifyAll(redis);

promisifyAll işlevi örneklere RedisClient tüm komut yöntemlerinin sürümlerini ekler XXXAsync ve aşağıdaki örnekte olduğu gibi zaman uyumsuz yöntemleri kullanmanıza olanak tanır:

var result = await client.setAsync("myKey", "myValue");

Komutları dinamik olarak yürütme

Herhangi bir dizeyi önbelleğe komut olarak göndermek için komutunu kullanarak sendCommand() (veya sendCommandAsync() bluebird ile) komutları dinamik olarak gönderebilirsiniz. Örneğin, uygulamanız doğrudan önbelleğe komut göndermek için bir istem sunabilir veya Redis paketin redis desteklemediği yeni komutlar sunabilir. Komut bağımsız değişkenleri dizi olarak gönderilmelidir.

// Add a key/value pair
var result = await client.sendCommandAsync("set", ["myKey", "myValue"]);

Bağlantıyı temizleme

Redis bağlantısıyla işiniz bittiğinde, bunu (veya quitAsync() bluebird kullanırken) kapatmalısınız quit() :

await client.quitAsync();

Şimdi bir uygulama oluşturalım ve Redis önbelleğimizle biraz çalışalım.