Redis Nedir?

redis

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 KEYKEY ile belirtilen değeri getirir.
SET KEY VALUEKEY ve VALUE ile belirtilen öğeyi ekler.
GETRANGE KEY START ENDKEY ile belirtilen değerin START ve END ile belirtilen index aralığındaki değeri getirir.
INCR KEYKEY ile belirtilen nümerik veriyi bir arttırır.
INCRBY KEY VALUEKEY ile belirtien nümerik veriyi VALUE kadar arttırır.
DECR KEYKEY ile belirtilen nümerik veriyi bir azaltır.
DECRBY KEY VALUEKEY ile belirtilen nümerik veriyi VALUE kadar azaltır.
APPEND KEY VALUEKEY 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 VALUEKEY ve VALUE ile belirtilen öğeyi listenin başına ekler.
RPUSH KEY VALUEKEY ve VALUE ile belirtilen öğeyi listenin sonuna ekler.
LRANGE KEY START ENDKEY ile belirtilen listeden START ve END ile belirtilen index aralığındaki öğeleri getirir.
LPOP KEYKEY ile belirtilen listeden ilk öğeyi silerek getirir.
RPOP KEYKEY ile belirtilen listeden son öğeyi silerek getirir.
LINDEX KEY INDEXKEY 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 KEYKEY 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 VALUEKEY ile belirtilen koleksiyona VALUE ile belirtilen değeri SCORE numarasına göre ekler.
ZRANGE KEY START ENDKEY 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 VALUEKEY ile belirtilen koleksiyondan VALUE ile belirtilen değeri siler.

Hash

Hash veri tipi key-value pair olarak tutulan koleksiyonlardır.

HMSET KEY FIELD VALUEKEY ile belirtilen koleksiyona FIELD ve VALUE key-value çiftini öge olarak ekler.
HGET KEY FIELDKEY ile belirtilen koleksiyondan FIELD key değerine sahip değeri getirir.
HDEL KEY FIELDKEY ile belirtilen koleksiyondan FIELD key değerine sahip öğeyi siler.
HGETALL KEYKEY 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.

You may also like...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir