Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Redis 7'den Redis 8.x'e ve Valkey 9'a: Yenilikler, Ayrışma Noktaları ve StackExchange.Redis 2→3 Geçişi
Redis 8'in yazdığı RDB dosyasını ne Redis 7.4 ne de Valkey 9 açabiliyor; Redis ile Valkey'in ortak noktası 7.2 ve yükseltme tek yönlü. Gerçek ölçümlerle RDB ve replication uyumluluğu, Redis 8.0–8.10 sürüm özeti, iki sunucuya COMMAND DOCS ile sorulmuş uyumluluk tablosu, StackExchange.Redis 3.x'te derleme hatasına dönen eski API'ler ve bir sürüm yükseltme planı.
Redis'i Production'da İşletmek: ACL, TLS, Tehlikeli Komutlar, Latency Teşhisi, OpenTelemetry ve Testcontainers
Production'daki Redis'te her uygulama yalnız ihtiyaç duyduğu komut, key ve kanallara izinli kendi ACL kullanıcısıyla bağlanmalı; FLUSHALL, KEYS ve EVAL'a yetkisi olmayan bir kullanıcı Lua açıklarına ve sızan şifreye karşı ilk savunma. Gerçek çıktılarla ACL LOG'un ortaya çıkardıkları, Functions'a geçiş, TLS, SLOWLOG ve StackExchange.Redis timeout mesajını okumak, OpenTelemetry span'leri ve Testcontainers ile integration testi.
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ı.
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 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 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 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'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.
Ö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 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.
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 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ığı.