日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis 特殊数据类型 :Geospatial、Hyperloglog、Bitmap

發(fā)布時間:2024/4/11 数据库 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis 特殊数据类型 :Geospatial、Hyperloglog、Bitmap 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • Geospatial(地理空間)
    • 介紹
    • 用法
  • Hyperloglog(基數(shù)統(tǒng)計)
    • 介紹
    • 用法
  • Bitmap(位圖)
    • 介紹
    • 用法


Geospatial(地理空間)

在使用一些小程序的時候,里面通常都會通過定位使用者的位置,來顯示附近的人、外賣距離、剩余路徑等功能,在Redis3.2中也引入了推算地理信息的數(shù)據(jù)結(jié)構,即Geospatial

介紹

把某個具體的位置信息(經(jīng)度,緯度,名稱)添加到指定的key中,數(shù)據(jù)將會用一個sorted set存儲,以便稍后能使用 GEORADIUS和 GEORADIUSBYMEMBER命令來根據(jù)半徑來查詢位置信息。

這個命令(指GEOADD)的參數(shù)使用標準的x,y形式,所以經(jīng)度(longitude)必須放在緯度(latitude)之前,對于可被索引的坐標位置是有一定限制條件的:非常靠近極點的位置是不能被索引的, 在EPSG:900913 / EPSG:3785 / OSGEO:41001指定如下:

  • 有效的經(jīng)度是-180度到180度
  • 有效的緯度是-85.05112878度到85.05112878度

上面是官方文檔的描述,其實Geo并沒有我們想象中的復雜,它的本質(zhì)就是一個Zset,通過將坐標以Geohash的方式進行處理,將經(jīng)度緯度錯位后形成一個52位整數(shù),所以我們同樣能夠使用Zset提供的接口來操作Geo

用法

命令作用
GEOADD key 經(jīng)度 緯度 地點名稱將指定的地理空間位置(經(jīng)度、緯度、名稱)添加到指定的key中
GEODIST key 地點1 地點2返回兩個給定位置之間的距離
GEOPOS key 地點從key里返回所有給定位置元素的位置(經(jīng)度和緯度)
GEOHASH key 地點返回一個或多個位置元素的 Geohash 表示
GEORADIUS key 經(jīng)度 緯度 半徑以給定的經(jīng)緯度為中心, 找出某一半徑內(nèi)的元素
GEORADIUSBYMEMBER key 地點 半徑找出位于指定范圍內(nèi)的元素,中心點是由給定的位置元素決定

Zset的接口同樣適用于Geo,因此需要刪除、查詢?nèi)繒r就可以使用Zset的接口。

下面示范一下這些命令的使用方式

# 為了方便示范,下面加入一些城市的地理信息——GEOADD 127.0.0.1:6379> GEOADD CHINA 108.94683 34.29296 "xian" (integer) 1 127.0.0.1:6379> GEOADD CHINA 116.405285 39.904989 "beijing" (integer) 1 127.0.0.1:6379> GEOADD CHINA 121.472644 31.231706 "shanghai" (integer) 1 127.0.0.1:6379> GEOADD CHINA 113.280637 23.125178 "guangzhou" (integer) 1 127.0.0.1:6379> GEOADD CHINA 114.085947 22.547 "shenzhen" (integer) 1 127.0.0.1:6379> GEOADD CHINA 110.33119 20.031971 "hainan" (integer) 1# 獲取北京和上海的距離——GEODIST 127.0.0.1:6379> GEODIST CHINA beijing shanghai km "1067.5980"# 獲取西安的坐標——GEOPOS 127.0.0.1:6379> GEOPOS CHINA xian 1) 1) "108.94683212041854858"2) "34.29296115814533863"# 以經(jīng)度120 緯度35位置為中心,獲取半徑1000千米內(nèi)的城市——GEORADIUS 127.0.0.1:6379> GEORADIUS CHINA 120 35 1000 km 1) "beijing" 2) "shanghai"# 獲取在廣州半徑500千米內(nèi)的城市——GEORADIUSBYMEMBER 127.0.0.1:6379> GEORADIUSBYMEMBER CHINA guangzhou 500 km 1) "shenzhen" 2) "guangzhou" 3) "hainan"# 將廣州和深圳的坐標轉(zhuǎn)換為11為的GEO哈希值——GEOHASH 127.0.0.1:6379> GEOHASH CHINA guangzhou shenzhen 1) "ws0e9cb3yj0" 2) "ws10k0dcg10"

Hyperloglog(基數(shù)統(tǒng)計)

在我們?yōu)榫W(wǎng)站統(tǒng)計訪問量、日活量時,由于我們統(tǒng)計的是用戶數(shù)量而非訪問次數(shù),因此即使一個用戶多次訪問也只會統(tǒng)計一次,這種不重復的數(shù)據(jù)通常被稱為基數(shù)

在傳統(tǒng)的做法中,我們通常會采用set來保存用戶的ID來進行計數(shù),因為其本身存在著去重的功能,但是由于我們所需要的是對用戶進行計數(shù),如果通過將所有用戶的ID保存的方法來完成,當用戶量大的時候就會對內(nèi)存產(chǎn)生巨大的壓力,并且效率也大大降低。

為了解決這個問題,Redis在2.8.9版本添加了HyperLogLog結(jié)構。

介紹

Redis HyperLogLog是用來做基數(shù)統(tǒng)計的算法,HyperLogLog的優(yōu)點是,在輸入元素的數(shù)量或者體積非常非常大時,計算基數(shù)所需的空間總是固定的、并且是很小的

在Redis 里面,每個HyperLogLog鍵只需要花費12KB內(nèi)存,就可以計算接近2^64個不同元素的基數(shù)。這和計算基數(shù)時,元素越多耗費內(nèi)存就越多的集合形成鮮明對比。

但是,由于HyperLogLog使用的是概率算法,通過存儲元素的hash值的第一個1的位置,來計算元素數(shù)量,所以HyperLogLog 不會存儲元素本身,在數(shù)據(jù)量大的時候也可能會存在一定的誤差。但是在基數(shù)統(tǒng)計這一方面,它的效果是其他結(jié)構無法比擬的。

用法

命令作用
PFADD key value添加指定的值到Hyperloglog中
PFCONUT key返回給定Hyperloglog的基數(shù)估算值
PFMERGE destkey sourcekey將目標Hyperloglog合并到源Hyperloglog中

使用示范

127.0.0.1:6379> PFADD NUMS1 1 2 3 4 #向NUMS1插入1-4 (integer) 1 127.0.0.1:6379> PFADD NUMS1 1 #數(shù)據(jù)已存在,不再插入 (integer) 0 127.0.0.1:6379> PFCOUNT NUMS1 #查看當前基數(shù)數(shù)量 (integer) 4127.0.0.1:6379> PFADD NUMS2 3 4 5 6 #向NUMS2插入3-6 (integer) 1 127.0.0.1:6379> PFMERGE NUMS1 NUMS2 #將NUMS2合并到NUMS1中 OK 127.0.0.1:6379> PFCOUNT NUMS1 #此時NUMS1中記錄了1-6,六個元素 (integer) 6

Bitmap(位圖)

介紹

位圖其實就是哈希的變形,他通過哈希映射來處理數(shù)據(jù),位圖本身并不存儲數(shù)據(jù),而是存儲標記。通過一個比特位,即0/1來標記一個數(shù)據(jù)的兩種狀態(tài)

位圖通常情況下用在數(shù)據(jù)量龐大,且數(shù)據(jù)不重復的情景下標記某個數(shù)據(jù)的兩種狀態(tài)。 我們可以使用位圖來記錄當前用戶的登陸情況、或者實現(xiàn)打卡、簽到等功能。

用法

命令作用
GETBIT key offset value(0/1)設置Bitmap中偏移量為offset的位置的值
SETBIT key offset value返回Bitmap中偏移量為offset的位置的值
BITCOUNT key計算位圖中有多少個1
127.0.0.1:6379> SETBIT TEST 1 1 #將位圖中第1,3,5位設置為1 (integer) 0 127.0.0.1:6379> SETBIT TEST 3 1 (integer) 0 127.0.0.1:6379> SETBIT TEST 5 1 (integer) 0127.0.0.1:6379> GETBIT TEST 1 #查看位圖中1,2,3位的值 (integer) 1 127.0.0.1:6379> GETBIT TEST 2 (integer) 0 127.0.0.1:6379> GETBIT TEST 3 (integer) 1127.0.0.1:6379> BITCOUNT TET #統(tǒng)計位圖中1的數(shù)量,由于我們只設置了1,3,5位,因此為3 (integer) 3

總結(jié)

以上是生活随笔為你收集整理的Redis 特殊数据类型 :Geospatial、Hyperloglog、Bitmap的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。