Redis Nedir?
Redis (REmote DIctionary Server) açık kaynaklı popüler in-memory veri yapısı servisidir. Bir diğer tabirle C dili ile yazılmış ve bir çok programlama dili tarafından desteklenen bir NoSQL veritabanıdır. Database, Cache ve Message Broker olarak kullanılabilir ve String, Hash, List, Set, SortedSet gibi veri yapılarını destekler.
Veriler bellekte depolandığından yanıt süresi çok daha hızlıdır. Depolanacak veri miktarı sunucu belleğiyle doğru orantılıdır ve istenildiği takdirde depolama birimi olarak disk de kullanılabilir. Bu durumda Snapshotting veya Slave yaklaşımlarından biri kullanılmalıdır. Database içerisinde veriler ilişkisel olmayan key-value pair şeklinde tutulmaktadır. Kullanım alanlarına örnek olarak counter, session storage, caching, queues ve pub/sub örnek verilebilir.
Kurulum
Günümüzde containerization kullanımının yaygınlaşmasından dolayı kurulum Docker üzerinden yapılacaktır. Öncelikle gerekli Redis imajını çekerek redis-example
isminde bir container oluşturup Redis’i ayağa kaldıralım. Redis varsayılan olarak 6379
portunda çalışmaktadır.
docker pull redis
docker run --name redis-example -p 6379:6379 -d redis
docker exec -it redis-example redis-cli
Artık Docker üzerinden redis-cli ile haberleşmekteyiz.
PING //PONG
SET NAME "Hello World" //OK
GET NAME //"Hello World"
GET name //(nil)
Yukarıdaki komutları gönderdiğimizde ilgili yanıtları almamız gerekmektedir. Son satıra dikkat edilirse anahtarların case-sensitive olduğu görülecektir.
Veri Yapıları
Redis veri yapıları bakımından zengin bir servistir. Veri yapılarına ve kullanılabilecek belli başlı komutlara göz atalım.
String
String veri tipi 512 mb boyutunda veri depolayabilen bir byte dizisidir. Metin, serileştirilmiş nesneler ve binary dizilerini depolamak için kullanılır. String veri tipi komutlarına göz atalım.
GET KEY | KEY ile belirtilen değeri getirir. |
SET KEY VALUE | KEY ve VALUE ile belirtilen öğeyi ekler. |
GETRANGE KEY START END | KEY ile belirtilen değerin START ve END ile belirtilen index aralığındaki değeri getirir. |
INCR KEY | KEY ile belirtilen nümerik veriyi bir arttırır. |
INCRBY KEY VALUE | KEY ile belirtien nümerik veriyi VALUE kadar arttırır. |
DECR KEY | KEY ile belirtilen nümerik veriyi bir azaltır. |
DECRBY KEY VALUE | KEY ile belirtilen nümerik veriyi VALUE kadar azaltır. |
APPEND KEY VALUE | KEY ile belirtilen değere VALUE ile belirilen değeri ekler. |
List
List veri tipi string değerlerini taşıyan linked list’lerdir. Genellikle stack ve queue implementasyonunda ve background worker sistemlerinde queue yönetimi için kullanılır. List veri tipi komutlarından bazıları aşağıdaki gibidir.
LPUSH KEY VALUE | KEY ve VALUE ile belirtilen öğeyi listenin başına ekler. |
RPUSH KEY VALUE | KEY ve VALUE ile belirtilen öğeyi listenin sonuna ekler. |
LRANGE KEY START END | KEY ile belirtilen listeden START ve END ile belirtilen index aralığındaki öğeleri getirir. |
LPOP KEY | KEY ile belirtilen listeden ilk öğeyi silerek getirir. |
RPOP KEY | KEY ile belirtilen listeden son öğeyi silerek getirir. |
LINDEX KEY INDEX | KEY ile belirtilen listeden INDEX ile belirtilen öğeyi getirir. |
Set
Set veri tipi string değerlerin unique olarak sırasız şekilde tutulduğu programlama dillerindeki HashSet gibi davranan koleksiyonlardır. Koleksiyonlara yeni bir öğe ekleyebilir, silebilir ve varlıkları kontrol edilebilir. Set veri tipi komutlarına öz atalım.
SADD KEY [VALUE] | KEY ile belirtilen koleksiyona [VALUE] ile belirilen değerleri ekler. |
SMEMBERS KEY | KEY ile belirtilen koleksiyon öğelerini getirir. |
SREM KEY [VALUE] | KEY koleksiyonundan [VALUE] ile belirtilen değerleri siler. |
SortedSet
SortedSet veri tipi de unique string verilerin tutulduğu koleksiyonlardır. Set veri tipinden farklı olarak koleksiyona yeni bir öge eklenirken belirtilen SCORE
değerine göre sıralanmaktadır. Aynı skora sahip öğeler alfabetik olarak sıralanır.
ZADD KEY SCORE VALUE | KEY ile belirtilen koleksiyona VALUE ile belirtilen değeri SCORE numarasına göre ekler. |
ZRANGE KEY START END | KEY ile belirtilen koleksiyondan START ve END ile belirtilen index aralığındaki öğeleri getirir. WITHSCORES parametresi kullanılırsa öğeler skorlarıyla birlikte getirilir. |
ZREM KEY VALUE | KEY ile belirtilen koleksiyondan VALUE ile belirtilen değeri siler. |
Hash
Hash veri tipi key-value pair olarak tutulan koleksiyonlardır.
HMSET KEY FIELD VALUE | KEY ile belirtilen koleksiyona FIELD ve VALUE key-value çiftini öge olarak ekler. |
HGET KEY FIELD | KEY ile belirtilen koleksiyondan FIELD key değerine sahip değeri getirir. |
HDEL KEY FIELD | KEY ile belirtilen koleksiyondan FIELD key değerine sahip öğeyi siler. |
HGETALL KEY | KEY ile belirtilen koleksiyon öğelerini getirir. |
Redis’in bir .NET projesinde nasıl kullanılacağına göz atalım. Bunun için yeni bir proje oluşturarak gerekli StackExchange.Redis
NuGet paketini kuralım ve Redis Server ile iletişim sağlayacak servisi oluşturalım.
public class RedisService
{
private ConnectionMultiplexer _connectionMultiplexer = default!;
public RedisService(string configuration)
{
_connectionMultiplexer = ConnectionMultiplexer.Connect(configuration);
}
public IDatabase GetDatabase(int db = 0) => _connectionMultiplexer.GetDatabase(db);
}
Yukarıda Redis Server ile bağlantı kuracak ve kurulan bağlantıdaki veritabanlarına erişim sağlayacak methodlar tanımlanmıştır.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton(o => {
new RedisService(builder.Configuration["Redis:Configuration"]);
});
Yukarıda oluşturulan servis IoC Container bünyesine kaydedilerek Redis Server bağlantısı kurulmaktadır.
public class RedisController : ControllerBase
{
private readonly RedisService _redisService;
private readonly IDatabase _redisDatabase;
public RedisController(RedisService redisService)
{
_redisService = redisService;
_redisDatabase = _redisService.GetDatabase();
}
[HttpGet("LinkedList")]
public IActionResult GetLinkedList()
{
_redisDatabase.ListRightPush("names_list", "Jessica");
_redisDatabase.ListLeftPush("names_list", "Joey");
_redisDatabase.ListLeftPush("names_list", "Jennifer");
var names = new List<string>();
if (_redisDatabase.KeyExists("names_list"))
{
_redisDatabase.ListRange("names_list").ToList().ForEach(f => names.Add(f));
}
_redisDatabase.ListRemove("names_list", "Jennifer");
_redisDatabase.ListRightPop("names_list");
return Ok(names);
}
}
Yukarıda oluşturulan servis inject edildikten sonra LinkedList tipiyle ilgili bir kaç işlem yapılmıştır. Diğer veri tipi kullanımlarına göz atmak için GitHub üzerinden ilgili projeye erişebilirsiniz.