Redis ile etkileşim kurmak için istemci API'sini keşfedin
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 ConnectionMultiplexer
sahip olduktan sonra, yapmak isteyebileceğiniz üç birincil şey vardır:
- Redis Veritabanı'na erişin (bu modülün odağı).
- Redis'in yayımcı/alt simge özelliklerini kullanın (bu modülün kapsamı dışında).
- 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 birstring
döndürür: "STRING", "INTEGER", vb.IsNull
, sonucun ne zaman olduğunu algılamak için bir true/false değeridirnull
.
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 nedenleawait
async
/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.