Ruby on rails 基于位置创建缓存密钥

Ruby on rails 基于位置创建缓存密钥,ruby-on-rails,ruby,caching,redis,Ruby On Rails,Ruby,Caching,Redis,全部, 我试图使用缓存来避免在特定区域发出请求时通过http进行请求 例如,你在洛杉矶,你周围的3个人(大约1英里)在谷歌上搜索附近的加油站 与每次请求不同,允许与您关系密切并进行相同搜索的人更快地获取已缓存的结果 在前面的方法中,我使用Redis缓存并使用参数构建密钥,但要重复使用它,需要精确匹配,因为创建的密钥基于“加油站” 现在我已经使用了Ruby Gem地理代码api,当给出坐标和距离时,它会返回一个lat/lon范围 Geocoder::Calculations.bounding_

全部,

我试图使用缓存来避免在特定区域发出请求时通过http进行请求

例如,你在洛杉矶,你周围的3个人(大约1英里)在谷歌上搜索附近的加油站

与每次请求不同,允许与您关系密切并进行相同搜索的人更快地获取已缓存的结果

在前面的方法中,我使用Redis缓存并使用参数构建密钥,但要重复使用它,需要精确匹配,因为创建的密钥基于“加油站”

现在我已经使用了Ruby Gem地理代码api,当给出坐标和距离时,它会返回一个lat/lon范围

  Geocoder::Calculations.bounding_box(location, distance)
并使用以下api:

def isLocationInRange(location, area)
  if location[0].between?(area[0], area[2]) && location[1].between?(area[1], area[3])
    return true
  end
  false
end
我能够知道IsLocationRange中给出的位置是否在“区域”内

现在的问题是将此逻辑连接到Redis并使用它重新使用缓存

最好是生成一个Redis密钥并查找它,但这并不容易,因为我不想解析存储的每个密钥,并逐个检查定义的lat/lon参数,以查看它是否匹配已知的位置范围。

Gemfile 运行包安装

config/redis.yml 现在REDIS变量在整个应用程序中都可用,因为初始化器文件是在应用程序加载时加载的

REDIS.set("gas_station__#{some_location}", latitude_values here)
REDIS.get("gas_station_#{some_location}")

参考资料:

另一个选项是,当收到的lat/long在同一区域时,生成唯一的lat,long。距离中心半径内的任何位置总是报告相同的lat/long。完全不同的解决方案(更好的imho)是在地球上绘制网格。您的解决方案由两个步骤组成:1)给定lat/long确定网格单元的标识符(以特定分辨率)。可能是8个相邻的单元格2)在redis中按网格单元格id存储您的资料,以便快速查找。在地球上创建栅格的一个好方法是。ruby中可能有一些lib可供使用。虽然我不知道最后一个是否有用,但很明显,我甚至得到了一些支持。嗯。
gem 'redis'
default: &default
  host: localhost
  port: 6379
  db: 15

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default
redis_config = HashWithIndifferentAccess.new(Rails.application.config_for(:redis))
REDIS = Redis.new(host: redis_config[:host], port: redis_config[:port], db: redis_config[:db])
REDIS.set("gas_station__#{some_location}", latitude_values here)
REDIS.get("gas_station_#{some_location}")