最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis存儲經(jīng)緯度信息的實現(xiàn)

 更新時間:2025年10月30日 11:16:29   作者:it碼嘍  
在一些向用戶提供天氣信息的業(yè)務(wù)場景中,我們通常會通過前端獲取用戶經(jīng)緯度信息,傳遞給后端作為參數(shù)進(jìn)行外部天氣接口調(diào)用,本文就來詳細(xì)的介紹一下Redis存儲經(jīng)緯度信息的實現(xiàn),感興趣的可以了解一下

適應(yīng)場景

在一些向用戶提供天氣信息的業(yè)務(wù)場景中,我們通常會通過前端獲取用戶經(jīng)緯度信息,傳遞給后端作為參數(shù)進(jìn)行外部天氣接口調(diào)用,從而獲取用戶所在位置的天氣信息。

但是一旦用戶量級上來了或者該功能被頻繁觸發(fā)時,調(diào)用外部天氣接口的成本會變得非常高昂。但是對于天氣信息來說,并不需要每次都實時調(diào)用外部接口獲取最新的天氣信息,因為天氣信息的變化頻率并不是特別高,甚至相近位置的天氣信息也會非常相似。

因此我們可以通過在Redis中存儲經(jīng)緯度信息和對應(yīng)的天氣信息,在每次請求時,先查詢Redis中是否存在相近位置的天氣信息,如果存在則直接返回緩存的天氣信息,如果不存在則調(diào)用外部天氣接口獲取最新的天氣信息,并將其存儲在Redis中以備下次使用。

設(shè)計思路

  1. 經(jīng)緯度信息存儲:使用Redis的地理位置(GEO)數(shù)據(jù)結(jié)構(gòu)來存儲用戶的經(jīng)緯度信息。通過GEOADD命令將經(jīng)緯度信息添加到Redis中。
  2. 天氣信息存儲:將天氣信息存儲在Redis的字符串(STRING)數(shù)據(jù)結(jié)構(gòu)中,使用經(jīng)緯度信息作為鍵,天氣信息作為值。
  3. 查詢邏輯
    • 當(dāng)用戶請求天氣信息時,首先使用GEORADIUS命令查詢Redis中是否存在相近位置的經(jīng)緯度信息。
    • 如果存在,則使用GET命令獲取對應(yīng)的天氣信息。
      • 若天氣信息存在且未過期,則直接返回該信息。
      • 若天氣信息不存在或已過期,則調(diào)用外部天氣接口獲取最新的天氣信息,并刪除舊的經(jīng)緯度信息,然后重新存儲新的經(jīng)緯度和天氣信息。
    • 如果不存在,則調(diào)用外部天氣接口獲取最新的天氣信息,并使用SET命令將其存儲在Redis中,同時使用GEOADD命令將經(jīng)緯度信息添加到Redis中。
  4. 過期策略:為了確保天氣信息的時效性,可以為存儲的天氣信息設(shè)置過期時間(TTL),例如30分鐘或1小時,超過該時間后需要重新調(diào)用外部接口獲取最新的天氣信息。由于Redis的GEO數(shù)據(jù)結(jié)構(gòu)不支持直接設(shè)置過期時間,可以在發(fā)現(xiàn)天氣信息過期時,刪除對應(yīng)的經(jīng)緯度信息。

代碼實現(xiàn)

示例代碼選用Java語言實現(xiàn),使用Spring Boot框架。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>3.2.5</version>
</dependency>
spring:
  redis:
    host: localhost
    port: 6379

引入Spring Data Redis依賴,并在application.yml中配置Redis連接信息。

@Service
public class WeatherService {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    private static final String WEATHER_GEO_KEY = "weather:locations";
    private static final String WEATHER_KEY_PREFIX = "weather:";
    private static final long WEATHER_TTL = 3600; // 天氣信息過期時間,單位秒

    public String getWeather(String latitude, String longitude) {
        // 查詢8公里內(nèi)最近的經(jīng)緯度信息
        double lon = Double.parseDouble(longitude);
        double lat = Double.parseDouble(latitude);
        Point point = new Point(lon, lat);
        Distance distance = new Distance(8, Metrics.KILOMETERS);
        Circle circle = new Circle(point, distance);

        var geoResults = redisTemplate.opsForGeo().radius(WEATHER_GEO_KEY, circle,
                RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().sortAscending().limit(1));

        if (geoResults != null && !geoResults.getContent().isEmpty()) {
            var nearestLocation = geoResults.getContent().get(0);
            String locationKey = nearestLocation.getContent().getName();

            // 獲取對應(yīng)的天氣信息
            String weatherKey = WEATHER_KEY_PREFIX + locationKey;
            String cachedWeather = redisTemplate.opsForValue().get(weatherKey);
            if (cachedWeather != null) {
                return cachedWeather; // 返回緩存的天氣信息
            } else {
                // 天氣信息過期,刪除舊的經(jīng)緯度信息
                redisTemplate.opsForGeo().remove(WEATHER_GEO_KEY, locationKey);
            }
        }

        // 調(diào)用外部天氣接口獲取最新的天氣信息
        String newWeatherInfo = fetchWeatherFromExternalApi(latitude, longitude);

        // 存儲新的經(jīng)緯度和天氣信息
        String locationKey = latitude + ":" + longitude;
        redisTemplate.opsForGeo().add(WEATHER_GEO_KEY, new Point(lon, lat), locationKey);
        String weatherKey = WEATHER_KEY_PREFIX + locationKey;
        redisTemplate.opsForValue().set(weatherKey, newWeatherInfo, Duration.ofSeconds(WEATHER_TTL));

        return newWeatherInfo;
    }

    private String fetchWeatherFromExternalApi(String latitude, String longitude) {
        // 這里實現(xiàn)調(diào)用外部天氣接口的邏輯
    }

}

在上述代碼中,我們定義了一個WeatherService類,包含了獲取天氣信息的邏輯。首先通過GEORADIUS命令查詢8公里內(nèi)最近的經(jīng)緯度信息,如果找到則嘗試獲取對應(yīng)的天氣信息;如果天氣信息不存在或已過期,則調(diào)用外部天氣接口獲取最新的天氣信息,并將其存儲在Redis中,同時更新經(jīng)緯度信息。

通過這種方式,我們可以有效地減少對外部天氣接口的調(diào)用頻率,提高系統(tǒng)的響應(yīng)速度和穩(wěn)定性。

到此這篇關(guān)于Redis存儲經(jīng)緯度信息的實現(xiàn)的文章就介紹到這了,更多相關(guān)Redis存儲經(jīng)緯度信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis客戶端連接遠(yuǎn)程Redis服務(wù)器方式

    Redis客戶端連接遠(yuǎn)程Redis服務(wù)器方式

    這篇文章主要介紹了Redis客戶端連接遠(yuǎn)程Redis服務(wù)器方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • redis命令行查看中文不亂碼的方法(十六進(jìn)制字符串處理)

    redis命令行查看中文不亂碼的方法(十六進(jìn)制字符串處理)

    這篇文章主要給大家介紹了關(guān)于redis命令行查看中文不亂碼的方法,其中詳細(xì)介紹了十六進(jìn)制字符串處理的相關(guān)資料,文中給出了詳細(xì)的示例代碼,供大家參考學(xué)習(xí),下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • Redis生成全局唯一ID的實現(xiàn)方法

    Redis生成全局唯一ID的實現(xiàn)方法

    全局唯一ID生成器是一種在分布式系統(tǒng)下用來生成全局唯一ID的工具,本文主要介紹了Redis生成全局唯一ID的實現(xiàn)方法,具有一定的參考價值,感興趣的可以了解一下
    2022-06-06
  • 詳解Redis如何優(yōu)雅地實現(xiàn)接口防刷

    詳解Redis如何優(yōu)雅地實現(xiàn)接口防刷

    這篇文章主要為大家詳細(xì)介紹了Redis優(yōu)雅地實現(xiàn)接口防刷的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • 深入理解 Redis Template及4種序列化方式

    深入理解 Redis Template及4種序列化方式

    這篇文章主要介紹了深入理解 Redis Template及4種序列化方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Redis高可用的三種實現(xiàn)方式

    Redis高可用的三種實現(xiàn)方式

    在實際生產(chǎn)環(huán)境中為保證Redis的服務(wù)連續(xù)性和可靠性,需要設(shè)計一個高可用架構(gòu),本文就來介紹一下Redis高可用的三種實現(xiàn)方式,主要包括主從復(fù)制模式,Redis Sentinel模式和Redis Cluster模式,感興趣的可以了解一下
    2023-12-12
  • Redis 5.05 單獨模式安裝及配置方法

    Redis 5.05 單獨模式安裝及配置方法

    這篇文章主要介紹了Redis 5.05 單獨模式安裝,文中通過代碼給大家介紹了Redis 5.0.5 單節(jié)點 安裝配置方法,需要的朋友可以參考下
    2019-10-10
  • 淺談redis的maxmemory設(shè)置以及淘汰策略

    淺談redis的maxmemory設(shè)置以及淘汰策略

    下面小編就為大家?guī)硪黄獪\談redis的maxmemory設(shè)置以及淘汰策略。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Redis 實現(xiàn)“附近的人”功能

    Redis 實現(xiàn)“附近的人”功能

    Redis基于geohash和有序集合提供了地理位置相關(guān)功能。這篇文章主要介紹了Redis 實現(xiàn)“附近的人”功能,需要的朋友可以參考下
    2019-11-11
  • 深入理解Redis內(nèi)存淘汰策略

    深入理解Redis內(nèi)存淘汰策略

    本文主要介紹了深入理解Redis內(nèi)存淘汰策略,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評論

饶阳县| 电白县| 沁源县| 邹平县| 永修县| 景宁| 大方县| 恩施市| 南丰县| 囊谦县| 永和县| 蒙自县| 洛阳市| 稻城县| 萝北县| 定结县| 内丘县| 天台县| 惠安县| 玉溪市| 彩票| 虹口区| 富锦市| 高青县| 耿马| 临漳县| 邯郸市| 福泉市| 揭阳市| 历史| 萨迦县| 新安县| 塘沽区| 庆城县| 乌鲁木齐市| 资中县| 前郭尔| 莱州市| 苍溪县| 西宁市| 杨浦区|