Redis Geospatial ile location-based services, proximity search ve geographic data storage. GEOADD, GEORADIUS komutları ile spatial queries.
Redis
Geo
Geospatial
Location
GIS
Redis'in sunduğu en specialized geospatial veri yapılarından biri olan Geo, GPS coordinates ve location-based applications için tasarlanmış advanced bir veri türüdür. Geo veri türü, longitude/latitude coordinates'leri Redis'in sorted set yapısı üzerinde geohash algoritması kullanarak saklar ve proximity searches, radius queries, distance calculations gibi location-aware operations'ları milisaniyeler içinde gerçekleştirir. Bu özelliği sayesinde location-based services, nearby search, delivery routing, geo-fencing ve real-time tracking gibi modern mobile applications'ların temel gereksinimlerini native olarak destekler. Geo commands'lar spherical earth model kullanarak gerçek dünya mesafelerini accurate şekilde hesaplar.
Coordinates'ler compressed geohash olarak saklanır
Space-efficient coordinate storage
🎯 Redis Geo Kullanım Senaryoları
Kullanım Alanı
Açıklama
Redis Komutu Örneği
Nearby search
Yakındaki restoran, mağaza, servis bulma
GEORADIUS restaurants 13.36 38.11 5 km
Delivery tracking
Kurye, araç konumları ve rota optimizasyonu
GEOADD couriers 13.361 38.115 "courier1"
Ride sharing
Driver-passenger matching ve distance calc
GEORADIUSBYMEMBER drivers passenger 2 km
Real estate search
Belirli area'daki property'leri bulma
GEORADIUS properties 13.36 38.11 10 km
Fleet management
Araç filosu tracking ve monitoring
GEOADD fleet 13.361 38.115 "truck1"
Social networking
Yakındaki arkadaşlar, check-in locations
GEORADIUS users 13.36 38.11 1 km
IoT sensor networks
Geographical sensor deployment ve monitoring
GEOADD sensors 13.361 38.115 "temp_01"
Emergency services
En yakın hastane, polis, itfaiye bulma
GEORADIUS hospitals 13.36 38.11 50 km
Gaming applications
Location-based gaming, AR/VR experiences
GEORADIUS players 13.36 38.11 100 m
Retail analytics
Customer location analysis ve store coverage
GEORADIUS customers 13.36 38.11 25 km
Geo veri türünün en büyük gücü, real-world distance calculations performansındadır. Haversine formula kullanarak spherical earth model üzerinde accurate distance hesaplamaları yapabilir ve proximity searches'i O(log(N)+M) time complexity'sinde gerçekleştirebilir. Bu özellik, location-based services, real-time tracking ve geo-analytics uygulamaları için muazzam performans avantajı sağlar. Özellikle mobile applications'larda "5km çevredeki restoranları bul" gibi queries'ler milisaniyeler içinde çözülür.
Geo'nun bir diğer kritik özelliği ise geohash integration'dır. Redis, coordinate'leri internally base32 geohash formatında saklar, bu da memory efficiency ve spatial indexing açısından optimal sonuçlar verir. Geohash'ler aynı zamanda proximity approximation için de kullanılabilir - benzer geohash prefix'leri olan location'lar genellikle birbirine coğrafi olarak yakındır. Bu özellik, distributed systems ve caching strategies için büyük avantaj sağlar.
🧩 1. Geo Veri Türü Temelleri
Redis'teki Geo, aslında sorted set data structure'ının üzerine kurulan specialized bir layer'dır. Longitude ve latitude coordinate'leri geohash algoritması ile encode edilerek sorted set'in score'u olarak saklanır. Bu yaklaşım sayesinde hem geospatial queries hem de traditional sorted set operations aynı data üzerinde çalışabilir.
🔧 Temel Özellikler
Longitude/Latitude storage: WGS84 coordinate system desteği
Duplicate members
Aynı member name ile ekleme yaparsanız, coordinate güncellenir:
text
127.0.0.1:6379> GEOADD Sicily 14.0 39.0 "Palermo" // Palermo'nun coordinate'leri güncelleniyor.
(integer) 0 // Mevcut member güncellendi.
127.0.0.1:6379>
Geo set yoksa otomatik oluşturulur
İlk GEOADD komutu ile yeni geo set oluşturulur.
🧪 GEOPOS Komutunu İnceleyelim
Location'ların coordinates'lerini getirir.
text
127.0.0.1:6379> GEOPOS Sicily Palermo // Palermo'nun coordinates'lerini getir.
1) 1) "13.36138933897018433" // Longitude.
2) "38.11555639549629859" // Latitude.
127.0.0.1:6379> GEOPOS Sicily Catania Agrigento // Birden fazla location'ın coordinates'leri.
1) 1) "15.08726984262466431" // Catania longitude.
2) "37.50266842333162032" // Catania latitude.
2) 1) "13.58333557844161987" // Agrigento longitude.
2) "37.31666804893235718" // Agrigento latitude.
127.0.0.1:6379> GEOPOS Sicily NonExistent // Var olmayan location sorgulanıyor.
1) (nil) // Location bulunamadı.
127.0.0.1:6379> GEOPOS restaurants Restaurant_A Restaurant_D // Var olan ve olmayan karışık.
1) 1) "29.01039898395538330" // Restaurant_A coordinates.
2) "41.00820008959414748"
2) (nil) // Restaurant_D bulunamadı.
📌 Dikkat Edilmesi Gereken Noktalar
Precision
Döndürülen coordinates'ler high precision'da gelir (16+ decimal places).
Multiple queries
Tek komutla birden fazla location'ın coordinates'lerini alabilirsiniz.
Return format
Her location için [longitude, latitude] array döner.
Missing members
Var olmayan member'lar için (nil) döner.
🧪 GEODIST Komutunu İnceleyelim
İki location arasındaki mesafeyi hesaplar.
text
127.0.0.1:6379> GEODIST Sicily Palermo Catania // Palermo-Catania arası mesafe (meter).
"166274.1516" // 166.27 km (meter cinsinden).
127.0.0.1:6379> GEODIST Sicily Palermo Catania km // Kilometer cinsinden mesafe.
"166.2742" // 166.27 km.
127.0.0.1:6379> GEODIST Sicily Palermo Catania mi // Mil cinsinden mesafe.
"103.3182" // 103.32 mil.
127.0.0.1:6379> GEODIST Sicily Palermo Agrigento ft // Feet cinsinden mesafe.
"217296.6166" // 217,296 feet.
127.0.0.1:6379> GEODIST restaurants Restaurant_A Restaurant_B km // Restaurant'lar arası mesafe.
"1.7033" // 1.70 km.
127.0.0.1:6379> GEODIST Sicily Palermo NonExistent // Var olmayan location ile mesafe.
(nil) // Hesaplanamadı.
📌 Dikkat Edilmesi Gereken Noktalar
Distance unitsm (meter), km (kilometer), mi (mile), ft (feet) - default: meter.
Spherical earth calculations
Gerçek dünya geometrisi kullanılarak accurate mesafe hesaplanır.
Return type
String olarak döner (decimal format).
Missing members
Herhangi bir member yoksa (nil) döner.
🧪 GEORADIUS Komutunu İnceleyelim
Belirli coordinate çevresindeki locations'ı bulur.
text
127.0.0.1:6379> GEORADIUS Sicily 15 37 200 km // Sicily'de 15,37 coordinate'i çevresinde 200km'deki şehirler.
1) "Agrigento" // 200km içindeki şehir.
2) "Catania" // 200km içindeki şehir.
3) "Palermo" // 200km içindeki şehir.
127.0.0.1:6379> GEORADIUS Sicily 15 37 100 km WITHDIST // Distance bilgisi ile birlikte.
1) 1) "Catania" // Şehir adı.
2) "56.4413" // Mesafe (km).
2) 1) "Agrigento"
2) "90.9778"
127.0.0.1:6379> GEORADIUS Sicily 15 37 200 km WITHCOORD WITHDIST ASC // Coordinates ve distance ile, ascending order.
1) 1) "Catania"
2) "56.4413" // Distance.
3) 1) "15.08726984262466431" // Longitude.
2) "37.50266842333162032" // Latitude.
2) 1) "Agrigento"
2) "90.9778"
3) 1) "13.58333557844161987"
2) "37.31666804893235718"
3) 1) "Palermo"
2) "190.4424"
3) 1) "13.36138933897018433"
2) "38.11555639549629859"
127.0.0.1:6379> GEORADIUS restaurants 29.01 41.01 2 km COUNT 2 // En yakın 2 restaurant'ı bul.
1) "Restaurant_A"
2) "Restaurant_B"
127.0.0.1:6379> GEORADIUS Sicily 15 37 100 km WITHCOORD WITHDIST WITHHASH DESC // Tüm ek bilgiler ile, descending order.
1) 1) "Agrigento"
2) "90.9778" // Distance.
3) (integer) 3479447370796909 // Geohash.
4) 1) "13.58333557844161987" // Coordinates.
2) "37.31666804893235718"
2) 1) "Catania"
2) "56.4413"
3) (integer) 3479447158516539
4) 1) "15.08726984262466431"
2) "37.50266842333162032"
Count limitationCOUNT N ile result limit belirleyebilirsiniz.
Store results
text
127.0.0.1:6379>
127.0.0.1:6379> GEORADIUS Sicily 15 37 200 km STORE nearby_cities // Sonuçları başka key'e kaydet.
127.0.0.1:6379>
🧪 GEORADIUSBYMEMBER Komutunu İnceleyelim
Mevcut bir member çevresindeki locations'ı bulur.
text
127.0.0.1:6379> GEORADIUSBYMEMBER Sicily Palermo 100 km // Palermo çevresinde 100km'deki şehirler.
1) "Palermo" // Kendisi de dahil.
2) "Agrigento" // 100km içindeki şehir.
127.0.0.1:6379> GEORADIUSBYMEMBER Sicily Catania 200 km WITHDIST ASC // Catania çevresinde 200km, distance ile.
1) 1) "Catania"
2) "0.0000" // Kendisine mesafe 0.
2) 1) "Agrigento"
2) "147.4133" // 147.41 km uzaklıkta.
3) 1) "Palermo"
2) "166.2742" // 166.27 km uzaklıkta.
127.0.0.1:6379> GEORADIUSBYMEMBER restaurants Restaurant_A 5 km COUNT 3 WITHDIST // Restaurant_A çevresinde 5km'de en yakın 3 restaurant.
1) 1) "Restaurant_A"
2) "0.0000"
2) 1) "Restaurant_B"
2) "1.7033"
3) 1) "Restaurant_C"
2) "1.8456"
127.0.0.1:6379> GEORADIUSBYMEMBER Sicily NonExistent 100 km // Var olmayan member çevresi.
(error) ERR could not decode requested zset member // Hata: member bulunamadı.
📌 Dikkat Edilmesi Gereken Noktalar
Self-inclusion
Sorgulan member kendisi de result'ta yer alır (distance 0 ile).
Same options as GEORADIUSWITHDIST, WITHCOORD, WITHHASH, ASC, DESC, COUNT aynı şekilde çalışır.
Member existence
Sorgulan member geo set'te var olmalıdır, yoksa hata verir.
Performance advantage
Member'ın coordinate'leri önceden bilindiği için GEORADIUS'tan daha hızlı çalışır.
Base32 encoding
Geohash'ler base32 character set kullanır: 0-9 ve a-z (i,l,o,u hariç).
Precision
Redis default olarak 11-character geohash kullanır (~1 meter precision).
Proximity indication
Benzer geohash prefix'leri olan location'lar genellikle birbirine yakındır:
# Palermo: sqc8b49rny0
# Agrigento: sqc8b36ue20
# Ortak prefix: sqc8b (aynı genel bölgede)
External usage
Geohash'ler external systems ile coordinate sharing için kullanılabilir.
🔄 Geo ile Gerçek Dünya Senaryoları
🚗 Senaryo 1: Ride Sharing Application
markdown
127.0.0.1:6379> GEOADD drivers 29.0104 41.0082 "driver_001" 29.0234 41.0156 "driver_002" 29.0067 40.9923 "driver_003" // Şoför lokasyonları.
(integer) 3
127.0.0.1:6379> GEOADD passengers 29.0180 41.0112 "passenger_123" // Yolcu lokasyonu.
(integer) 1
127.0.0.1:6379> GEORADIUSBYMEMBER drivers driver_001 5 km WITHDIST // driver_001 çevresindeki diğer şoförler.
1) 1) "driver_001"
2) "0.0000"
2) 1) "driver_002"
2) "1.7033" // 1.7 km uzaklıkta.
3) 1) "driver_003"
2) "2.1456" // 2.1 km uzaklıkta.
127.0.0.1:6379> GEORADIUS drivers 29.0180 41.0112 3 km WITHDIST ASC COUNT 2 // Yolcuya en yakın 2 şoför.
1) 1) "driver_001"
2) "0.8547" // En yakın şoför: 0.85 km.
2) 1) "driver_002"
2) "1.2334" // İkinci en yakın: 1.23 km.
127.0.0.1:6379> GEODIST drivers driver_001 "29.0180,41.0112" // Şoför ile yolcu arası exact mesafe hesaplama.
# Not: GEODIST member'lar arasında çalışır, coordinate ile direkt mesafe için GEORADIUS kullanın.# Şoför location update (real-time tracking):127.0.0.1:6379> GEOADD drivers 29.0190 41.0125 "driver_001" // driver_001 yeni pozisyona hareket etti.
(integer) 0 // Mevcut member güncellendi.
127.0.0.1:6379> GEOPOS drivers driver_001 // Güncel pozisyon kontrol.
1) 1) "29.01899814605712890"
2) "41.01249994710670746"
🍕 Senaryo 2: Food Delivery Service
markdown
127.0.0.1:6379> GEOADD restaurants 29.0104 41.0082 "Pizza_Palace" 29.0234 41.0156 "Burger_King" 29.0067 40.9923 "Sushi_Bar" // Restaurant lokasyonları.
(integer) 3
127.0.0.1:6379> GEOADD customers 29.0180 41.0112 "customer_456" // Müşteri lokasyonu.
(integer) 1
127.0.0.1:6379> GEORADIUS restaurants 29.0180 41.0112 5 km WITHDIST ASC // Müşteriye 5km çevresindeki restoranlar.
1) 1) "Pizza_Palace"
2) "0.8547" // En yakın: Pizza Palace (0.85 km).
2) 1) "Burger_King"
2) "1.2334" // Burger King (1.23 km).
3) 1) "Sushi_Bar"
2) "2.1891" // Sushi Bar (2.19 km).
127.0.0.1:6379> GEOADD couriers 29.0150 41.0095 "courier_A" 29.0200 41.0140 "courier_B" // Kurye lokasyonları.
(integer) 2
# Pizza Palace'den teslimat için en yakın kurye:127.0.0.1:6379> GEORADIUSBYMEMBER couriers "29.0104,41.0082" 10 km WITHDIST ASC COUNT 1
# Not: Coordinate-based query için GEORADIUS kullanmak gerekir.127.0.0.1:6379> GEORADIUS couriers 29.0104 41.0082 10 km WITHDIST ASC COUNT 1 // Pizza Palace'ye en yakın kurye.
1) 1) "courier_A"
2) "0.6234" // courier_A en yakın (0.62 km).
# Delivery route optimization:127.0.0.1:6379> GEODIST restaurants Pizza_Palace "29.0150,41.0095" // Restaurant'tan kurye'ye mesafe.
# Coordinate-based distance için alternative yaklaşım gerekir.127.0.0.1:6379> GEOADD temp_location 29.0150 41.0095 "courier_A_pos" // Geçici location oluştur.
127.0.0.1:6379> GEODIST restaurants Pizza_Palace "courier_A_pos" // Şimdi mesafe hesaplanabilir.
🏥 Senaryo 3: Emergency Services Locator
markdown
127.0.0.1:6379> GEOADD hospitals 29.0104 41.0082 "City_Hospital" 29.0534 41.0256 "General_Hospital" 29.0367 40.9823 "Emergency_Center" // Hastane lokasyonları.
(integer) 3
127.0.0.1:6379> GEOADD police_stations 29.0184 41.0142 "Police_Station_1" 29.0067 40.9923 "Police_Station_2" // Polis karakolu lokasyonları.
(integer) 2
127.0.0.1:6379> GEOADD fire_stations 29.0204 41.0172 "Fire_Station_A" 29.0344 41.0089 "Fire_Station_B" // İtfaiye lokasyonları.
(integer) 2
# Acil durum lokasyonu:127.0.0.1:6379> GEOADD emergency_call 29.0180 41.0112 "emergency_location"
(integer) 1
# En yakın hastane:127.0.0.1:6379> GEORADIUSBYMEMBER hospitals "29.0180,41.0112" 50 km WITHDIST ASC COUNT 1
# Coordinate-based query için:127.0.0.1:6379> GEORADIUS hospitals 29.0180 41.0112 50 km WITHDIST ASC COUNT 1
1) 1) "City_Hospital"
2) "0.8547" // En yakın hastane: 0.85 km.
# En yakın polis karakolu:127.0.0.1:6379> GEORADIUS police_stations 29.0180 41.0112 50 km WITHDIST ASC COUNT 1
1) 1) "Police_Station_1"
2) "0.3421" // En yakın polis: 0.34 km.
# En yakın itfaiye:127.0.0.1:6379> GEORADIUS fire_stations 29.0180 41.0112 50 km WITHDIST ASC COUNT 1
1) 1) "Fire_Station_A"
2) "0.6789" // En yakın itfaiye: 0.68 km.
# Tüm emergency services overview:127.0.0.1:6379> GEORADIUS hospitals 29.0180 41.0112 10 km WITHDIST COUNT 3
127.0.0.1:6379> GEORADIUS police_stations 29.0180 41.0112 10 km WITHDIST COUNT 3
127.0.0.1:6379> GEORADIUS fire_stations 29.0180 41.0112 10 km WITHDIST COUNT 3
127.0.0.1:6379> GEORADIUS hospitals 29.0180 41.0112 5 km WITHDIST ASC // 5km çevresindeki tüm hastaneler.
1) 1) "City_Hospital"
2) "0.8547"
2) 1) "Emergency_Center"
2) "3.2891" // Backup option.
🏪 Senaryo 4: Retail Store Finder ve Analytics
markdown
127.0.0.1:6379> GEOADD stores 29.0104 41.0082 "Store_Downtown" 29.0534 41.0256 "Store_Mall" 29.0367 40.9823 "Store_Suburbs" // Mağaza lokasyonları.
(integer) 3
127.0.0.1:6379> GEOADD competitors 29.0184 41.0142 "Competitor_A" 29.0267 40.9923 "Competitor_B" // Rakip mağaza lokasyonları.
(integer) 2
# Customer'ın en yakın mağaza bulması:127.0.0.1:6379> GEORADIUS stores 29.0180 41.0112 25 km WITHDIST ASC
1) 1) "Store_Downtown"
2) "0.8547" // En yakın mağaza.
2) 1) "Store_Suburbs"
2) "3.2891" // İkinci seçenek.
3) 1) "Store_Mall"
2) "4.1234" // En uzak mağaza.
# Competitive analysis - her mağazanın çevresindeki rakipler:127.0.0.1:6379> GEORADIUSBYMEMBER stores Store_Downtown 5 km
1) "Store_Downtown"
127.0.0.1:6379> GEORADIUS competitors 29.0104 41.0082 5 km WITHDIST // Store_Downtown çevresindeki rakipler.
1) 1) "Competitor_A"
2) "0.9876" // Yakın rakip: 0.99 km.
# Coverage area analysis:127.0.0.1:6379> GEORADIUS stores 29.0250 41.0150 10 km // Belirli area'da coverage kontrol.
1) "Store_Downtown"
2) "Store_Mall" // Bu area'yı 2 mağaza cover ediyor.
# Store density analysis:127.0.0.1:6379> GEORADIUS stores 29.0200 41.0100 20 km COUNT 10 // 20km çevresindeki tüm mağazalar.
1) "Store_Downtown"
2) "Store_Suburbs"
3) "Store_Mall" // Toplam 3 mağaza.
# Geohash-based regional analysis:127.0.0.1:6379> GEOHASH stores Store_Downtown Store_Mall Store_Suburbs
1) "sxj7dy4y2k0" // Downtown geohash.
2) "sxj7fgbr8q0" // Mall geohash.
3) "sxj7dpp3st0" // Suburbs geohash.
Redis Geo veri türü, geospatial applications ve location-based services konusunda Redis'in en specialized ve powerful araçlarından biridir. Longitude/latitude coordinates'leri efficient storage, proximity searches ve accurate distance calculations ile modern mobile applications'ların temel gereksinimlerini karşılar.
Bu bölümde GEOADD, GEOPOS, GEODIST, GEORADIUS, GEORADIUSBYMEMBER gibi temel komutları ve gerçek dünya senaryolarında Geo kullanımını detaylı örneklerle öğrendik.
Geo'nun geospatial indexing, proximity search, distance calculations ve spherical earth model özellikleri özellikle:
Location-based services ve nearby search
Ride sharing ve delivery applications
Fleet management ve real-time tracking
Emergency services ve route optimization
Retail analytics ve coverage analysis
IoT sensor networks ve geofencing
Social networking ve check-in systems
gibi senaryolarda vazgeçilmez bir araçtır.
Geo veri türü, location-aware applications ihtiyaçlarınız için Redis'te en optimize çözümü sunar. Geospatial indexing, proximity performance ve accurate calculations üçlüsü, modern mobile applications'ların complex location requirements'larını karşılamak için mükemmel bir kombinasyon oluşturur.
Bu bölümde öğrendiğiniz komutlar ve senaryolar ile artık:
Location-based service applications geliştirebilir
Proximity search ve nearby finder sistemleri tasarlayabilir
Real-time tracking ve fleet management solutions oluşturabilir
Geofencing ve location analytics implementasyonları yapabilir
Emergency services ve route optimization sistemleri geliştirebilirsiniz
Geo commands'larını projelerinizde etkin kullanarak, kullanıcılarınıza location-aware, proximity-based ve geographically-intelligent deneyimler sunabilirsiniz.
Redis'in Geo veri türü ile geospatial programming journey'niz tamamlandı! Bu comprehensive guide ile modern location-based applications'ların tüm temel requirements'larını Redis native commands ile efficient şekilde implement edebilirsiniz. Happy geo-coding!
#
Response time estimation (distance-based):
#
Prefix analysis: sxj7d ile başlayanlar aynı genel bölgede