Redis怎麼實現查找附近的人,請看特殊數據類型Geospatial

2020-12-17 程序工具人

前面我們已經把五大數據類型講完了,今天我開始講redis特殊數據類型Geospatial,地理位置的存儲,這個是數據類型可以實現朋友定位,兩個地方之間的距離,搜索附近的人等。具體操作就是將指定的地理空間位置(緯度、經度、名稱)添加到指定的key中,這些數據將會存儲到sorted set然後使用GEORADIUS或者GEORADIUSBYMEMBER命令對數據進行半徑查詢計算出範圍內的元素和元素之間的距離。

Geospatial數據類型只有六個命令

添加元素

Geoadd [key] [經度] [緯度] [元素]

操作這個命令之前我們需要去網上查找一些城市的經緯度坐標,因為經度和緯度是有範圍限制的,如果隨便添加有可能會報錯,官網顯示說明

· 有效的經度從-180度到180度。

· 有效的緯度從-85.05112878度到85.05112878度

所以添加的值不能超過這個範圍,網上找了北京、上海、廣州、深圳、杭州、南京的經緯度進行添加數據。

這裡我們只是測試當然是手動添加,實際中我們可以是程序進行批量添加城市位置信息。

取值

Geopos [key] [元素]:獲取指定元素的經度緯度

獲取兩地之間的距離

Geodist [key] [元素1] [元素2]:獲取元素1和元素2之間的距離

單位:

m:表示單位米

km:表示單位千米

Redis會根據兩個經緯度的值進行計算得出兩個地點間的距離。

獲取某個元素附近的元素

以給定元素為原點,找出半徑內的所有元素,這個功能是不是可以實現我們搜索附近的人,假如我當前位置經度緯度為 110 30 現在要找出記錄這個點周圍1000km內的城市

GEORADIUS [key] [當前位置經度] [當前位置緯度] [查找的範圍]

找查附近的城市並顯示與城市的距離,在原命令上增加 withdist參數

找查附近的城市並顯示附近城市的經緯度,在原命令上增加 withcoord參數

查找指定個數的附近的城市,在原命令上增加 count參數

查找某個元素周圍的元素

上面時通過我自定義的經緯度經查找,還可以換一種方式,以某個存在redis中的元素,查找這個元素附件的元素。

其實redis GEO底層原理是通過zsets實現的,所以一些zset命令也都可以使用,例如

查找key中的所有元素

------------------------------------------------END-----------------------------------------------------------------

你的一個讚一個關注是我創作的動力,是我持續輸出的能量源泉,老鐵關注一波吧!

相關焦點

  • Redis詳解:sets數據類型及操作
    系列文章:  Redis詳解:strings數據類型及操作  Redis詳解:hashes數據類型及操作  Redis詳解:lists數據類型及操作  Redis的set是string類型的無序集合。set元素最大可以包含(2的32次方)個元素。
  • 二進位跳動帶你看Redis數據結構底層
    緊接著還有問題,String在redis底層是怎麼存儲的?這些數據類型在Redis中是怎麼存放的?Redis快的原因是不是只有單線程和基於內存處理?下面我們來一一梳理下這幾張數據類型的底層結構(redis3.x):Stringredis是自己定義的一種字符串格式,叫SDS中文譯名叫簡單動態字符串(Simple  Dynamic String)。
  • redis五大數據類型使用場景
    一 字符串字符串類型是Redis最基礎的數據結構,字符串類型可以是JSON、XML甚至是二進位的圖片等數據,但是最大值不能超過512MB。1.1 內部編碼Redis會根據當前值的類型和長度決定使用哪種內部編碼來實現。
  • Redis入門教程:特性及數據類型的操作
    【IT168 技術】雖然Redis已經很火了,相信還是有很多同學對Redis只是有所聽聞或者了解並不全面,下面是一個比較系統的Redis介紹,對Redis的特性及各種數據類型及操作進行了介紹。是一個很不錯的Redis入門教程。
  • Redis面試題,看這一篇就夠了
    它支持多種類型的數據結構,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 與範圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。
  • 《Redis入門指南》第1集:Redis的5種數據類型
    上面說完了持久化存儲,下面我們開始講redis的5個數據類型:字符型、散列型、列表型、集合型、有序集合型。這個功能可以用redis的字符型數據類型來實現。有的,是散列數據類型。實現起來就很簡單,該怎樣實現呢?
  • Redis系列-數據類型set
    先給大家提出一個新的存儲需求:存儲大量的數據,在查詢方面提供更高的效率 。來請出我們今天要說的主角set。 可能大家會有個疑問,難道list不能滿足嗎? list也可以存大量數據而且還有順序,還能使用索引訪問,但是list 的存儲結構是鍊表的存儲結構。
  • 一文搞定Redis五大數據類型及使用場景
    字符串字符串類型是Redis最基礎的數據結構,字符串類型可以是JSON、XML甚至是二進位的圖片等數據,但是最大值不能超過512MB。web端的大多數請求都是從Redis中獲取的數據,如果Redis中沒有需要的數據,則會從MySQL中去獲取,並將獲取到的數據寫入redis。
  • 利用Redis 實現「附近的人」功能!
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫針對「附近的人」這一位置服務領域的應用場景,常見的可使用 PG、MySQL 和 MongoDB 等多種 DB 的空間索引進行實現。
  • Redis的各項功能解決了哪些問題
    先看一下Redis是一個什麼東西。官方簡介解釋到:Redis是一個基於BSD開源的項目,是一個把結構化的數據放在內存中的一個存儲系統,你可以把它作為資料庫,緩存和消息中間件來使用。同時支持strings,lists,hashes,sets,sorted sets,bitmaps,hyperloglogs和geospatial indexes等數據類型。
  • 圖解redis五種數據結構底層實現(動圖哦)
    redis中所有場景中出現的字符串,基本都是由SDS來實現的所有非數字的key。例如 setmsg"hello world" 中的key msg.字符串數據類型的值。例如`` set msg "hello world"中的msg的值"hello wolrd"非字符串數據類型中的「字符串值」。
  • Redis面試突擊專用
    單線程的redis為什麼這麼快 redis的數據類型,以及每種數據類型的使用場景,Redis 內部結構 redis的過期策略以及內存淘汰機制【~】 Redis 為什麼是單線程的,優點 如何解決redis的並發競爭key問題 Redis 集群方案應該怎麼做?都有哪些方案?有沒有嘗試進行多機redis 的部署?如何保證數據一致的?對於大量的請求怎麼樣處理 Redis 常見性能問題和解決方案?
  • 總結一波 Redis 面試題
    單線程的redis為什麼這麼快redis的數據類型,以及每種數據類型的使用場景,Redis 內部結構redis的過期策略以及內存淘汰機制【~】Redis 為什麼是單線程的,優點如何解決redis的並發競爭key問題Redis 集群方案應該怎麼做?都有哪些方案?有沒有嘗試進行多機redis 的部署?
  • Redis 內部數據結構詳解(1):dict
    如有好文章投稿,請點擊 → 這裡了解詳情本系列基於 Redis 3.2 分支如果你使用過Redis,一定會像我一樣對它的內部實現產生興趣。本文的重點在於討論第二個層面,Redis數據結構的內部實現,以及這兩個層面的數據結構之間的關係:Redis如何通過組合第二個層面的各種基礎數據結構來實現第一個層面的更高層的數據結構。在討論任何一個系統的內部實現的時候,我們都要先明確它的設計原則,這樣我們才能更深刻地理解它為什麼會進行如此設計的真正意圖。
  • Redis是如何實現點讚、取消點讚的?
    get個新技能:redis實現自動補全利用 Redis 實現「附近的人」功能!>一、Redis 緩存設計及實現1.1 Redis 安裝及運行Redis 安裝請自行查閱相關教程。1.3 Redis 的數據結構類型Redis 可以存儲鍵與5種不同數據結構類型之間的映射,這5種數據結構類型分別為String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。
  • 總結一波 Redis 面試題,收藏起來.
    單線程的redis為什麼這麼快redis的數據類型,以及每種數據類型的使用場景,Redis 內部結構redis的過期策略以及內存淘汰機制【~】Redis 為什麼是單線程的,優點如何解決redis的並發競爭key問題Redis 集群方案應該怎麼做?都有哪些方案?有沒有嘗試進行多機redis 的部署?
  • IM裡「附近的人」功能實現原理是什麼?如何高效率地實現它?
    1、引言基本上以陌生人社交為主的IM產品裡,都會增加「附近的人」、「附近的xxx」這種以LBS(地理位置)為導向的產品特色(微信這個熟人社交產品裡為啥也有「附近的人」?這當然是歷史原因了,微信當初還不是想藉此引流嘛。。。)
  • 【187期】出現機率比較大的Redis面試題(含答案)
    本文的面試題如下:緩存雪崩、緩存穿透、緩存預熱、緩存更新、緩存降級等問題redis的數據類型,以及每種數據類型的使用場景,Redis 內部結構有沒有嘗試進行多機redis 的部署?如何保證數據一致的?為什麼Redis的操作是原子性的,怎麼保證原子性的?
  • 電腦如何實現查找「附近的人」?
    當我們打開微信的附近的人可以看到附近的朋友,當我們打開美團附近的商家可以查找附近的飯店、影院等等。所有這一切都離不開一個功能:基於LBS的「附近的」功能,那計算機是如何實現這種功能的?本文討論一下其原理。
  • 【深入學習Redis】Redis內存模型
    在客戶端通過redis-cli連接伺服器後(後面如無特殊說明,客戶端一律使用redis-cli),通過info命令可以查看內存使用情況:其中,info命令可以顯示redis伺服器的許多信息,包括伺服器基本信息、CPU、內存、持久化、客戶端連接信息等等;memory是參數,表示只顯示內存相關的信息。