Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Redis Nedir, Cache'ten Fazlası mı? In-Memory Data Structure Server, Kullanım Alanları ve Lisans Durumu
Redis, key'lerin altında string'den stream'e kadar data structure'lar tutan ve komutları tek bir main thread'de sırayla çalıştıran bir in-memory sunucudur; her komutun atomik olması da, tek bir uzun komutun herkesi bekletmesi de buradan gelir. Gerçek ölçümlerle 105 ms'lik KEYS'in başka bir client'ın PING'ini bekletmesi, lock'suz 100.000 INCR, sunucu süresi ile round trip farkı, cache dışı kullanım haritası, iyi olmadığı yerler, lisans tarihçesi ve Valkey farkı.
Redis Lab'ı ve StackExchange.Redis: Docker, redis-cli, Redis Insight, ConnectionMultiplexer ve Key Tasarımı
StackExchange.Redis'te ConnectionMultiplexer uygulama başına bir tane olmalı: her multiplexer iki bağlantı açar ve istek başına oluşturulduğunda 200 istek 400 bağlantı ve 10 kat yavaş cevap demek. Gerçek çıktılarla Redis 8 ve Valkey 9'lu compose lab'ı, redis-cli latency modları, okunmayan MONITOR'ün 101 MB bellek tüketmesi, Redis Insight, RESP3 ve ayrı pub/sub bağlantısı, pipelining'in 300 kat farkı, sync-over-async ile 110 saniyelik timeout ve SCAN ile key listeleme.
Redis String'leri ve Expiration: SET Seçenekleri, Sayaçlar, Compare-and-Set ve TTL Semantiği
Redis'te bir key'in üzerine SET ile yazmak TTL'ini siler; doğrulama kodunu yeniden yazarken EX vermezsen kod hiç silinmez. Gerçek çıktılarla SET seçenekleri ve KEEPTTL, INCR ve EXPIRE NX ile günlük sayaç, GET + SET ile 10.000 artışın 9.617'sinin kaybolması, Redis 8.4'ün SET IFEQ, DELEX ve DIGEST komutlarıyla tek kullanımlık kod ve idempotency key, Valkey farkları ve expiration'ın lazy ve aktif silme ile içeride nasıl çalıştığı.
Redis Hash'leri: Object Saklamak, Field Expiration ve Bellek Verimliliği
Küçük bir Redis hash'i listpack encoding'inde durur ve aynı sepeti JSON string'in yarısı, ayrı key'lerin 2,4'te biri kadar bellekle tutar; 513. field ya da 65 byte'lık tek bir value ise hash'i hashtable'a çevirip belleği 3,4 katına çıkarır. Gerçek çıktılarla HashEntry ile Bookstore sepeti, hash ile JSON kararı, HEXPIRE ve HSETEX ile field bazında fiyat kilidi, Valkey'in encoding farkı, Redis 8.10'un HIMPORT ile compact hash'leri ve dev hash'te 44 ms'lik HGETALL.
Redis Sorted Set: Leaderboard, Zaman Pencereli Sıralama ve Sayfalama
Redis sorted set'i her member'ı bir skorla tutar ve her an sıralı durur; leaderboard'da rank ve sayfa sorguları bir milyon member'da bile mikrosaniyeler sürer, ama canlı listede rank'e göre sayfalama iki istek arasında kayar. Gerçek çıktılarla ZADD seçenekleri, ZRANGE ile sayfalama, günlük set'lerden ZUNIONSTORE ve Redis 8.8'in COUNT'uyla haftanın çok satanları, eşit skorların sırası, 2^53 hassasiyet sınırı ve zaman damgasını skor yapan kayan pencereler.
Özel Data Type'lar: Bitmap, HyperLogLog, Geospatial ve Probabilistic Yapılar (Bloom, Cuckoo, Top-K)
Tekil sayımda bitmap, kimlikler sıkıysa kesin sonucu set'in elli birde biri bellekle verir; HyperLogLog ise kimlik ne olursa olsun 12 KB'ta yaklaşık yüzde 1 hatayla sayar. Gerçek çıktılarla aynı ziyaretçi verisinde set, bitmap ve HLL karşılaştırması, seyrek bitmap'in 14 MB'lık tuzağı, BITFIELD, en yakın depo için Geo, Bloom filter'ın ölçülen belleği ve false positive oranı, Cuckoo, Top-K, Count-Min Sketch, t-digest, Redis 8.8'in Array'i ve Valkey farkları.
Redis'te Atomiklik: MULTI/EXEC, WATCH, Lua Script'leri ve Redis Functions
Redis'te MULTI/EXEC komutları araya kimse girmeden sırayla çalıştırır ama rollback yapmaz; okumaya göre karar veren çok adımlı işler için doğru araç çoğu zaman bir Lua script'idir. Gerçek çıktılarla 100 kopyalık stoğun 200 kez satılması, WATCH ile 14.620 retry, StackExchange.Redis condition'ları, LuaScript.Prepare ile stok rezervasyonu, script cache, restart'ta kaybolmayan Redis Functions, Redis 8.8'in INCREX'i ve sunucuyu kilitleyen uzun script.
Redis Pub/Sub ve Keyspace Notification'ları: Sharded Pub/Sub, At-Most-Once ve Cache Invalidation Sinyali
Redis pub/sub mesajı yalnız o an bağlı olan dinleyicilere iletir ve hiçbir yerde saklamaz; bağlantı koptuğu sırada yayınlanan mesaj sonradan da gelmez. Gerçek çıktılarla at-most-once teslimat, handler ile ChannelMessageQueue'nun mesaj sırası, paylaşılan bağlantıda 40 MB'lık GET'in kopması, iki API instance'ında fiyat değişince L1 invalidation, kuyruk için iş var sinyali, sharded pub/sub, gecikmeli expired olayları, Redis 8.8'in hash field notification'ları ve yavaş subscriber'ın 32 MB sınırı.
Redis Streams: Consumer Group, Pending Entry List, XAUTOCLAIM ve Idempotent XADD
Redis Streams'te consumer group, dağıttığı ama onaylanmamış her olayı pending entry list'te tutar; çöken worker'ın işi kaybolmaz, Redis 8.4'ün XREADGROUP CLAIM'iyle tek okumada başka bir worker'a geçer. Gerçek çıktılarla stream yapısı, iki bağımsız consumer group, XNACK ile hemen retry, Redis 8.6'nın IDMP'li idempotent XADD'i, BackgroundService worker'ı, poison message için dead-letter stream ve XTRIM'in 10.000 girdilik varsayılan sınırı.
Redis JSON ve Query Engine: JSON Document'lar, FT.CREATE, FT.SEARCH, FT.AGGREGATE ve NRedisStack
Redis 8'de JSON document'ları JSONPath ile kısmen güncelleyebilir ve FT.CREATE ile kurduğun index üzerinden FT.SEARCH ile filtreleyip sıralayabilirsin; yazma komutu döndüğünde arama yeni değeri görür. Gerçek çıktılarla NRedisStack ile katalog araması, tag escape'i, çok değerli alanlarda GROUPBY'ın ilk değeri sayması, Türkçe stemming ve büyük İ sınırları, 100.000 kitapta index maliyeti ve valkey-search farkları.
Redis Persistence ve Bellek Yönetimi: RDB, AOF, fsync, Fork Maliyeti, maxmemory ve Büyük/Sıcak Key'ler
Resmî redis:8 image'ı varsayılan olarak yalnız aralıklı RDB snapshot'ı alır; container SIGKILL ile ölürse son snapshot'tan sonraki her şey gider, AOF everysec ile ise ölçümde hiçbir sipariş kaybolmadı. Gerçek çıktılarla fork ve copy-on-write maliyeti, AOF'u veri kaybetmeden açmak, Redis 8.10'un BACKUP komutu, noeviction'ın stream'i koruması, OOMKilled, UNLINK, HOTKEYS ve activedefrag eşiği.
Redis'te Replication, Sentinel ve Cluster: Failover, Hash Slot'lar, Hash Tag ve CROSSSLOT
Redis replication asenkron olduğu için client'a onaylanmış bir yazma failover'da kaybolabilir; WAIT bunu önlemez, yalnız görünür yapar. Gerçek çıktılarla kaybolan sipariş numarası, Sentinel ve StackExchange.Redis ile failover süresi, Cluster'da 16384 hash slot, MOVED, CROSSSLOT ve hash tag, her primary'ye yüklenmesi gereken Functions, node'a özel keyspace notification'lar, Redis 8.4'ün atomic slot migration'ı ve Valkey 9 farkları.