geospatial
介紹
在Redis最新的3.2版本中加入了地理空間(geospatial)以及索引半徑查詢的功能,這在需要地理位置的應(yīng)用上或許可以一展身手
語法
geoadd
添加經(jīng)緯度
語法
geoadd key 經(jīng)度 緯度 名稱
示例
redis-test:0>geoadd china:chongqing 108.40869 30.80788 wanzhouqu
"1"
redis-test:0>geoadd china:chongqing 106.56901 29.55279 yuzhongqu
"1"
redis-test:0>geoadd china:chongqing 106.57434 29.60658 jiangbeiqu
"1"
redis-test:0>geoadd china:chongqing 106.45752 29.54113 shapingbeiqu
"1"

geopos
從key里返回所有給定位置元素的位置(經(jīng)緯度)
語法
geopos key 名稱,...
示例
redis-test:0>geopos china:chongqing yuzhongqu wanzhouqu
1) 1) "106.56901091337203979"
2) "29.55278925695020575"
2) 1) "108.40868979692459106"
2) "30.80787925148732143"
geodist
返回兩個(gè)給定位置之間的距離,可選單位有m,km,mi,ft
語法
geodist key 名稱1 名稱2 km
示例
redis-test:0>geodist china:chongqing yuzhongqu wanzhouqu km
"225.3277"
georadius
以給定的經(jīng)緯度為中心,找出某一半徑內(nèi)的元素,可選單位有m,km,mi,ft
語法
georadius key 經(jīng)度 緯度 距離 單位 [withcoord] [withdist] [withhash] [count num] [asc/desc] [store key] [storedist key]
==store 和 storedist 什么意思還不太清楚==
示例
redis-test:0>georadius china:chongqing 110 30 1000 km withcoord withdist withhash count 2 asc
1) 1) "wanzhouqu"
2) "177.1347"
3) "4027928638780644"
4) 1) "108.40868979692459106"
2) "30.80787925148732143"
2) 1) "jiangbeiqu"
2) "333.4982"
3) "4026059618403137"
4) 1) "106.57433778047561646"
2) "29.60658110939369436"
georadiusbymember
找出位于指定范圍內(nèi)的元素,中心點(diǎn)是由給定的位置元素決定
語法
跟上面的 georadius 一樣。georadius 是根據(jù)給定的經(jīng)緯度來查詢,georadiusbymember 是根據(jù)key里面的元素的地理位置來查詢
示例
redis-test:0>georadiusbymember china:chongqing shapingbeiqu 1000 km withcoord withdist withhash count 2 asc
1) 1) "shapingbeiqu"
2) "0.0000"
3) "4026041996756293"
4) 1) "106.45752221345901489"
2) "29.54112953961725196"
2) 1) "yuzhongqu"
2) "10.8655"
3) "4026048053726639"
4) 1) "106.56901091337203979"
2) "29.55278925695020575"
geohash
返回一個(gè)或多個(gè)位置元素的geohash表示
hyperloglog
介紹
Redis HyperLogLog 是用來做基數(shù)統(tǒng)計(jì)的算法,HyperLogLog 的優(yōu)點(diǎn)是,在輸入元素的數(shù)量或者體積非常非常大時(shí),計(jì)算基數(shù)所需的空間總是固定 的、并且是很小的。
在 Redis 里面,每個(gè) HyperLogLog 鍵只需要花費(fèi) 12 KB 內(nèi)存,就可以計(jì)算接近 264 個(gè)不同元素的基 數(shù)。這和計(jì)算基數(shù)時(shí),元素越多耗費(fèi)內(nèi)存就越多的集合形成鮮明對比。
因?yàn)?HyperLogLog 只會(huì)根據(jù)輸入元素來計(jì)算基數(shù),而不會(huì)儲(chǔ)存輸入元素本身,所以 HyperLogLog 不能像集合那樣,返回輸入的各個(gè)元素。
- HyperLogLog是一種算法,并非redis獨(dú)有
- 核心是基數(shù)估算算法,主要表現(xiàn)為計(jì)算時(shí)內(nèi)存的使用和數(shù)據(jù)合并的處理。最終數(shù)值存在一定誤差
- redis中每個(gè)hyperloglog key占用了12K的內(nèi)存用于標(biāo)記基數(shù)(官方文檔)
- pfadd命令并不會(huì)一次性分配12k內(nèi)存,而是隨著基數(shù)的增加而逐漸增加內(nèi)存分配;而pfmerge操作則會(huì)將sourcekey合并后存儲(chǔ)在12k大小的key中,這由hyperloglog合并操作的原理(兩個(gè)hyperloglog合并時(shí)需要單獨(dú)比較每個(gè)桶的值)可以很容易理解。
- 誤差說明:基數(shù)估計(jì)的結(jié)果是一個(gè)帶有 0.81% 標(biāo)準(zhǔn)錯(cuò)誤(standard error)的近似值。是可接受的范圍
- Redis 對 HyperLogLog 的存儲(chǔ)進(jìn)行了優(yōu)化,在計(jì)數(shù)比較小時(shí),它的存儲(chǔ)空間采用稀疏矩陣存儲(chǔ),空間占用很小,僅僅在計(jì)數(shù)慢慢變大,稀疏矩陣占用空間漸漸超過了閾值時(shí)才會(huì)一次性轉(zhuǎn)變成稠密矩陣,才會(huì)占用 12k 的空間
語法
pfadd 添加
影響基數(shù)估值則返回1否則返回0.若key不存在則創(chuàng)建
127.0.0.1:6379> pfadd m1 1 2 3 4 1 2 3 2 2 2 2
(integer) 1
pfcount 獲得基數(shù)值
返回值是一個(gè)帶有 0.81% 標(biāo)準(zhǔn)錯(cuò)誤(standard error)的近似值.
127.0.0.1:6379> pfadd m1 1 2 3 4 1 2 3 2 2 2 2
(integer) 1
127.0.0.1:6379> pfcount m1
(integer) 4
pfmerge 合并多個(gè)key
127.0.0.1:6379> pfadd m1 1 2 3 4 1 2 3 2 2 2 2
(integer) 1
127.0.0.1:6379> pfcount m1
(integer) 4
127.0.0.1:6379> pfadd m2 3 3 3 4 4 4 5 5 5 6 6 6 1
(integer) 1
127.0.0.1:6379> pfcount m2
(integer) 5
127.0.0.1:6379> pfmerge mergeDes m1 m2
OK
127.0.0.1:6379> pfcount mergeDes
(integer) 6
應(yīng)用場景
- 基數(shù)不大,數(shù)據(jù)量不大就用不上,會(huì)有點(diǎn)大材小用浪費(fèi)空間
- 有局限性,就是只能統(tǒng)計(jì)基數(shù)數(shù)量,而沒辦法去知道具體的內(nèi)容是什么
- 和bitmap相比,屬于兩種特定統(tǒng)計(jì)情況,簡單來說,HyperLogLog 去重比 bitmap 方便很多
- 一般可以bitmap和hyperloglog配合使用,bitmap標(biāo)識(shí)哪些用戶活躍,hyperloglog計(jì)數(shù)
- 一般使用:
- 統(tǒng)計(jì)注冊 IP 數(shù)
- 統(tǒng)計(jì)每日訪問 IP 數(shù)
- 統(tǒng)計(jì)頁面實(shí)時(shí) UV 數(shù)
- 統(tǒng)計(jì)在線用戶數(shù)
- 統(tǒng)計(jì)用戶每天搜索不同詞條的個(gè)數(shù)
bitmaps
介紹
就是通過一個(gè)bit位來表示某個(gè)元素對應(yīng)的值或者狀態(tài),其中的key就是對應(yīng)元素本身。我們知道8個(gè)bit可以組成一個(gè)Byte,所以bitmap本身會(huì)極大的節(jié)省儲(chǔ)存空間。
語法
setbit
setbit key offset value # offset是數(shù)字,value是0或者1
getbit
getbit key offset
bitcount
返回某個(gè)key的value為1的offset的總數(shù)
bitcount key
使用場景
- 用戶簽到
- 統(tǒng)計(jì)活躍用戶