GeoIP service with Redis caching