Merhabalar ben saldırı timlerinden Bunjo, bu konuda Redis'in ne olduğundan ve nasıl basit bir Redis clienti kodlanacağını anlatacağım.
Redis pek fazla bilinmediği için bu konu biraz tanım ağırlıklı olacaktır fakat tanımları az tutmaya çalışacağım.
Redis (Remote Dictionary Server)
Redis, açık kaynaklı, anahtar-değer tabanlı bir veri deposu ve in-memory veritabanı sistemidir. Adı "Remote Dictionary Server"ın kısaltmasıdır.
Redis, NoSQL veritabanları kategorisine girer ve hızlı ve etkili bir şekilde veri saklamak, almak ve işlemek için tasarlanmıştır.
Redis, bir anahtar-değer deposu ve in-memory veritabanı olarak kullanılır ve birçok faydası olabilir. Redis'in temel kullanım alanları:
Önbellek (Cache) Sistemi: Redis, sık kullanılan verileri hızlı bir şekilde saklayarak, web uygulamalarında önbellekleme için yaygın olarak kullanılır.
Bu, veritabanı erişimini azaltır ve uygulamanın performansını artırır.
Sıralama ve Listeleme: Redis, listeleri ve sıralı küme veri yapılarını destekler. Bu özellik sayesinde, sıralı veriye ihtiyaç duyan uygulamalarda
(örneğin, zaman damgaları, puanlama sistemleri) kullanılabilir.
Oturum Yönetimi: Redis, kullanıcı oturumları gibi durum bilgilerini hızlı bir şekilde saklamak için kullanılabilir.
Bu, web uygulamalarında kullanıcı oturumlarını yönetmek için sıklıkla tercih edilen bir senaryodur.
Gerçek Zamanlı Analitikler: Redis, hızlı ve anlık veri erişimine olanak tanıdığından, gerçek zamanlı analitik ve raporlama sistemlerinde kullanılabilir.
Örneğin, bir canlı etkinlik akışını izlemek veya gerçek zamanlı veri analizi yapmak için kullanılabilir.
Yüksek Performanslı Veritabanı: Redis, bellekte veri sakladığı için çok hızlı okuma ve yazma işlemleri sunar. Bu özellik, yüksek performans gerektiren uygulamalarda kullanılmasını sağlar.
Mesaj Kuyrukları ve Pub/Sub Mekanizması: Redis, basit bir yayın/abone (Pub/Sub) sistemi ve mesaj kuyrukları oluşturmak için kullanılabilir.
Bu, asenkron işlemleri desteklemek ve farklı bileşenler arasında iletişim kurmak için kullanılır.
Geçici Veri Depolama: Redis, geçici veri depolamak ve bu verilere belirli bir süre sonra otomatik olarak son vermek için kullanılır. Bu özellik, örneğin bir belirleme süresi olan geçici veri ihtiyacı olan durumlar için uygundur.
Kısacası Redis neredeyse her konuda işinizi görebilir.
Redis Nasıl Çalışır?
İlgili şema:
Redis Sunucusunun Başlatılması: Redis istemcisini kullanmadan önce, bir Redis sunucusu başlatılmalıdır. Sunucu, redis-server komutu veya başka bir yöntemle başlatılabilir.
Redis bir istemci (client) tarafından Redis sunucusuna bağlandığında ve veri iletimi gerçekleştiğinde geçen adımları şu şekilde anlatabiliriz:
Redis İstemcisinin Başlatılması ve Sunucuya Bağlanma: Redis istemcisi, Redis sunucusuna bağlanmak için redis veya redis-rb gibi uygun bir Ruby kütüphanesini kullanır. İstemci,
sunucunun IP adresi ve port numarası gibi bağlantı bilgilerini kullanarak bağlantı kurar.
Bash:
gem install redis
Ruby:
require 'redis'
# Redis istemcisini başlatma ve sunucuya bağlanma
redis = Redis.new(host: '127.0.0.1', port: 6379)
Anahtar-Değer Çiftini Sunucuya Gönderme: İstemci, sunucuya bir anahtar-değer çiftini gönderir. Bu işlem, SET komutu gibi Redis komutları kullanılarak gerçekleştirilir.
Ruby:
# Anahtar-değer çiftini sunucuya gönderme
redis.set('bunjo_key', 'Bunjo, Redis!')
Veri Alma: İstemci, sunucudan bir anahtara karşılık gelen değeri alabilir. Bu işlem, GET komutu gibi Redis komutları kullanılarak gerçekleştirilir.
Ruby:
# Belirli bir anahtara karşılık gelen değeri alma
value = redis.get('bunjo_key')
puts value
Redis için basit bir iletişim bu şekilde gerçekleşir.
Redis İçin Veri Tipleri
Redis içerisinde çokça veri tipi bulunur, en çok kullanılan veri tipleri:
String (Metin): Redis içinde en basit veri tipidir.
Hash (Hash): Anahtar-değer çiftlerini içeren bir veri yapısıdır.
List (Liste): Sıralı bir liste içerir ve elemanlar eklenme sırasına göre sıralanır.
Set (Küme): Kısacası sırasız ve benzersiz elemanlara sahip bir küme.
Sorted Set (Sıralı Küme): Küme veri tipinden elemanlarının sıralı olması dışında bir farkı farkı yoktur.
Redis içerisinde çokça veri tipi bulunur, en çok kullanılan veri tipleri:
String (Metin): Redis içinde en basit veri tipidir.
Ruby:
SET bunjo_key "Hello, Bunjo!"
GET bunjo_key
Hash (Hash): Anahtar-değer çiftlerini içeren bir veri yapısıdır.
Ruby:
HSET user:1000 username "bunjowtf"
HSET user:1000 email "[email protected]"
HGET user:1000 username
List (Liste): Sıralı bir liste içerir ve elemanlar eklenme sırasına göre sıralanır.
Ruby:
LPUSH mylist "item1"
LPUSH mylist "item2"
LRANGE mylist 0 -1
Set (Küme): Kısacası sırasız ve benzersiz elemanlara sahip bir küme.
Ruby:
SADD myset "member1"
SADD myset "member2"
SMEMBERS myset
Sorted Set (Sıralı Küme): Küme veri tipinden elemanlarının sıralı olması dışında bir farkı farkı yoktur.
Ruby:
ZADD myscores 100 "player1"
ZADD myscores 200 "player2"
ZRANGE myscores 0 -1 WITHSCORES
Redis İçin Client Kodlamak
Evet sonunda tanımlar bittiğine göre artık bir client kodlayabiliriz.
Eğer bir Redis sunucunuz yoksa bu kodu sadece okumanız sizin için yeterli olabilir çünkü kurması uzun bir süreçtir.
Kodlar:
İlk öncelikle kullanacağımız "redis" gemini yüklememiz gerekiyor.
Şimdi ise içeriye aktaralım.
Kullanıcının gireceği IP adresi ve Port üzerinden redis'e bağlantı kuralım.
Kullanıcı yapmak istediği seçenekleri seçmesi için ekran.
Kodun bir işlem yapıp kapanmaması için döngüye alalım ve seçenekleri yansıtalım.
Case-when ile seçenek kontrolü yapıyoruz ve seçeneğe göre sunucuda komutu çalıştırıyoruz.
Kodun devamı bu şekilde metodları inceleyebilirsiniz.
Eğer 1-6 arası değer girilmeze.
Tüm Kod:
Siz kendi istemcinizi geliştirip daha detaylandırabilirsiniz.
Okuyan herkese teşekkür ediyorum.
Ekstra olarak bilgi edinmek isterseniz bir doküman bıraktım.
Evet sonunda tanımlar bittiğine göre artık bir client kodlayabiliriz.
Eğer bir Redis sunucunuz yoksa bu kodu sadece okumanız sizin için yeterli olabilir çünkü kurması uzun bir süreçtir.
Kodlar:
İlk öncelikle kullanacağımız "redis" gemini yüklememiz gerekiyor.
Rich (BB code):
gem install redis
Şimdi ise içeriye aktaralım.
Ruby:
require 'redis'
Kullanıcının gireceği IP adresi ve Port üzerinden redis'e bağlantı kuralım.
Ruby:
# Kullanıcıdan Redis sunucu bilgilerini al
print "Redis sunucu IP adresi: "
redis_host = gets.chomp
print "Redis sunucu portu: "
redis_port = gets.chomp.to_i
# Redis istemcisini başlatma ve sunucuya bağlanma
redis = Redis.new(host: redis_host, port: redis_port)
Kullanıcı yapmak istediği seçenekleri seçmesi için ekran.
Ruby:
def display_menu
puts "1. String veri eklemek"
puts "2. List elemanı eklemek"
puts "3. Set üyesi eklemek"
puts "4. Hash alanı eklemek"
puts "5. ZSET üyesi eklemek"
puts "6. Çıkış"
end
Kodun bir işlem yapıp kapanmaması için döngüye alalım ve seçenekleri yansıtalım.
Ruby:
loop do
display_menu
print "Yapmak istediğiniz işlemi seçin (1-6): "
choice = gets.chomp.to_i
Case-when ile seçenek kontrolü yapıyoruz ve seçeneğe göre sunucuda komutu çalıştırıyoruz.
Ruby:
case choice
when 1
print "Anahtar için bir değer girin: "
key_value = gets.chomp
redis.set('mykey', key_value)
puts "GET mykey: #{redis.get('mykey')}"
Kodun devamı bu şekilde metodları inceleyebilirsiniz.
Ruby:
when 2
print "Liste elemanı eklemek için bir değer girin: "
list_item = gets.chomp
redis.rpush('mylist', list_item)
puts "LRANGE mylist: #{redis.lrange('mylist', 0, -1)}"
when 3
print "Set üyesi eklemek için bir değer girin: "
set_member = gets.chomp
redis.sadd('myset', set_member)
puts "SMEMBERS myset: #{redis.smembers('myset')}"
when 4
print "Hash alanı eklemek için bir değer girin (alan:değer): "
hash_input = gets.chomp.split(":")
redis.hset('myhash', hash_input[0], hash_input[1])
puts "HGETALL myhash: #{redis.hgetall('myhash')}"
when 5
print "ZSET üyesi eklemek için bir değer girin: "
zset_member = gets.chomp
print "ZSET üye puanını girin: "
zset_score = gets.chomp.to_i
redis.zadd('myscores', zset_score, zset_member)
puts "ZRANGE myscores: #{redis.zrange('myscores', 0, -1, with_scores: true)}"
when 6
puts "Çıkış yapılıyor..."
break
Eğer 1-6 arası değer girilmeze.
Ruby:
else
puts "Geçersiz seçim. Lütfen 1-6 arasında bir seçenek girin."
end
end
Tüm Kod:
Ruby:
require 'redis'
def display_menu
puts "1. String veri eklemek"
puts "2. List elemanı eklemek"
puts "3. Set üyesi eklemek"
puts "4. Hash alanı eklemek"
puts "5. ZSET üyesi eklemek"
puts "6. Çıkış"
end
# Kullanıcıdan Redis sunucu bilgilerini al
print "Redis sunucu IP adresi: "
redis_host = gets.chomp
print "Redis sunucu portu: "
redis_port = gets.chomp.to_i
# Redis istemcisini başlatma ve sunucuya bağlanma
redis = Redis.new(host: redis_host, port: redis_port)
loop do
display_menu
print "Yapmak istediğiniz işlemi seçin (1-6): "
choice = gets.chomp.to_i
case choice
when 1
print "Anahtar için bir değer girin: "
key_value = gets.chomp
redis.set('mykey', key_value)
puts "GET mykey: #{redis.get('mykey')}"
when 2
print "Liste elemanı eklemek için bir değer girin: "
list_item = gets.chomp
redis.rpush('mylist', list_item)
puts "LRANGE mylist: #{redis.lrange('mylist', 0, -1)}"
when 3
print "Set üyesi eklemek için bir değer girin: "
set_member = gets.chomp
redis.sadd('myset', set_member)
puts "SMEMBERS myset: #{redis.smembers('myset')}"
when 4
print "Hash alanı eklemek için bir değer girin (alan:değer): "
hash_input = gets.chomp.split(":")
redis.hset('myhash', hash_input[0], hash_input[1])
puts "HGETALL myhash: #{redis.hgetall('myhash')}"
when 5
print "ZSET üyesi eklemek için bir değer girin: "
zset_member = gets.chomp
print "ZSET üye puanını girin: "
zset_score = gets.chomp.to_i
redis.zadd('myscores', zset_score, zset_member)
puts "ZRANGE myscores: #{redis.zrange('myscores', 0, -1, with_scores: true)}"
when 6
puts "Çıkış yapılıyor..."
break
else
puts "Geçersiz seçim. Lütfen 1-6 arasında bir seçenek girin."
end
end
Siz kendi istemcinizi geliştirip daha detaylandırabilirsiniz.
Okuyan herkese teşekkür ediyorum.
Ekstra olarak bilgi edinmek isterseniz bir doküman bıraktım.
About - Redis
Introduction to Redis Redis is the world’s fastest in-memory database. It provides cloud and on-prem solutions for caching, vector search, and NoSQL databases that seamlessly fit into any tech stack—making it simple for digital customers to build, scale, and deploy the fast apps our world runs...
redis.io