bitmap
官方說明
bitmap 事實上不是數(shù)據(jù)類型育灸,而是一組 定義在 string 類型上、面向二進制位** **的操作昵宇。string 數(shù)據(jù)類型是二進制安全的磅崭,并且它最大可存儲 512MB 的值,因此 bitmap 可以存儲 2^32 個不同的二進制位
bitmap 最大的優(yōu)勢之一是存儲信息時瓦哎,它經(jīng)吃矣鳎可以極大的節(jié)省空間。例如蒋譬,一個用戶的系統(tǒng)中割岛,使用遞增的 id 來表示不同的用戶,這時候 bitmap 使用 512MB 內(nèi)存就可以記錄 40 億用戶的一個比特信息(例如犯助,1是男生癣漆,0是女生,一個男生的id為19剂买,那么這個 bitmap 的第 19 位就是 1)惠爽。
通常 bitmap 的使用例子是:
- 各種實時分析
- 存儲于對象 id 相關(guān)聯(lián)的癌蓖、節(jié)省空間的、高性能的布爾信息
setbit
向 key 中設(shè)置一個 bit
127.0.0.1:6379> setbit mybit 0 1
(integer) 0
127.0.0.1:6379> setbit mybit 10 1
(integer) 0
127.0.0.1:6379> setbit mybit 15 0
(integer) 0
復(fù)制代碼
第一個參數(shù)是 key 的名稱婚肆,第二個是 bit 在第幾位租副,第三個是 bit 的值(0或1)
getbit
獲取 bitmap 中指定位置的 bit 值,沒有設(shè)置過值的位默認為0
127.0.0.1:6379> setbit mybit 0 1
(integer) 0
127.0.0.1:6379> setbit mybit 10 1
(integer) 0
127.0.0.1:6379> setbit mybit 15 0
(integer) 0
127.0.0.1:6379> getbit mybit 0
(integer) 1
127.0.0.1:6379> getbit mybit 10
(integer) 1
127.0.0.1:6379> getbit mybit 15
(integer) 0
127.0.0.1:6379> getbit mybit 16 # 沒有設(shè)置過值的位默認為0
(integer) 0
復(fù)制代碼
bitcount
計算 bitmap 中存儲的 1 的個數(shù)
127.0.0.1:6379> setbit mybit 0 1
(integer) 0
127.0.0.1:6379> setbit mybit 10 1
(integer) 0
127.0.0.1:6379> setbit mybit 15 0
(integer) 0
127.0.0.1:6379> bitcount mybit
(integer) 2
復(fù)制代碼
bitpos
找出 bitmap 中指定范圍內(nèi)第一個 0 或 1 的位置
127.0.0.1:6379> setbit mybit 3 0
(integer) 0
127.0.0.1:6379> setbit mybit 5 1
(integer) 0
127.0.0.1:6379> setbit mybit 7 1
(integer) 0
127.0.0.1:6379> bitpos mybit 1 0 -1 # 最后兩個參數(shù)設(shè)置檢索范圍旬痹, 0 -1 表示所有的數(shù)
(integer) 5
127.0.0.1:6379> bitpos mybit 0 0 -1
(integer) 0
復(fù)制代碼
bitop
對多個 bitmap 進行 and(與)附井、or(或)、xor(異或)操作两残,還有針對一個 bitmap 的 not(非) 這里只對 or 操作進行演示
127.0.0.1:6379> setbit mybit1 0 1
(integer) 0
127.0.0.1:6379> setbit mybit1 1 0
(integer) 0
127.0.0.1:6379> setbit mybit2 0 0
(integer) 0
127.0.0.1:6379> setbit mybit2 1 1
(integer) 0
127.0.0.1:6379> bitop or mybit3 mybit1 mybit2
(integer) 1
127.0.0.1:6379> getbit mybit3 0
(integer) 1
127.0.0.1:6379> getbit mybit3 1
(integer) 1
復(fù)制代碼
HyperLogLogs
什么是基數(shù)
基數(shù)是一個集合中不重復(fù)的元素,例如 A{1把跨,1人弓,2,3着逐,4崔赌,4,5} 這個集合的基數(shù)是 5
官方說明
超日志(HyperLogLog)是一種概率數(shù)據(jù)結(jié)構(gòu)耸别,用于統(tǒng)計唯一的事物(從技術(shù)上講健芭,這是指估計集合的基數(shù))。通常秀姐,計算唯一項目需要使用與要計數(shù)的項目數(shù)成比例的內(nèi)存量慈迈,因為您需要記住您在過去看到的元素,以避免多次計數(shù)省有。但是痒留,有一組算法會以內(nèi)存換取精度:您最終會得到帶有標準誤差的估計量,在Redis實現(xiàn)的情況下蠢沿,該誤差小于1%伸头。該算法的神奇之處在于,您不再需要使用與所計數(shù)項目數(shù)成正比的內(nèi)存量舷蟀,而是可以使用固定的內(nèi)存空間恤磷!在最壞的情況下為12k字節(jié),如果您的HyperLogLog(從現(xiàn)在開始將它們稱為HLL)的元素很少野宜,則使用內(nèi)存更少扫步。
Redis中的HLL盡管在技術(shù)上是不同的數(shù)據(jù)結(jié)構(gòu),但被編碼為Redis String速缨,因此您可以調(diào)用GET來序列化HLL锌妻,然后調(diào)用SET來將其反序列化回服務(wù)器。
然而您并沒有真正將項添加到HLL中旬牲,因為它的數(shù)據(jù)結(jié)構(gòu)只存儲不含實際元素的狀態(tài)
使用場景 一個人訪問一個網(wǎng)站多次仿粹,但是還是算作一個人
傳統(tǒng)方式:使用 set 來存儲訪問的人的 id搁吓,但是這樣 set 集合中會存儲大量的用戶 id,我們的目的是計數(shù)吭历,不是存儲 id堕仔。
現(xiàn)在解決方案:使用 hyperloglog 數(shù)據(jù)類型,因為它不是真正的添加元素到 HLL 中晌区,占用內(nèi)存很小
pfadd
把一個或多個值添加到數(shù)據(jù)類型為 hyperLogLogs 的 key 中
127.0.0.1:6379> pfadd hyper a b c d
(integer) 1
復(fù)制代碼
pfcount
計算一個或多個key中存儲的元素的個數(shù)
127.0.0.1:6379> pfadd hyper a b c d
(integer) 1
127.0.0.1:6379> pfadd info d g h
(integer) 1
127.0.0.1:6379> pfcount hyper info
(integer) 6
127.0.0.1:6379> pfcount hyper
(integer) 4
復(fù)制代碼
pfmerge
合并多個 key 中的數(shù)據(jù)到一個 key
127.0.0.1:6379> pfadd hyper a b c d
(integer) 1
127.0.0.1:6379> pfadd info d g h
(integer) 1
127.0.0.1:6379> pfmerge test hyper info
OK
127.0.0.1:6379> pfcount test
(integer) 6
復(fù)制代碼
geospatial
官方說明
這個數(shù)據(jù)類型可以存儲地球上地理位置的經(jīng)緯度信息摩骨,能夠通過經(jīng)緯度信息計算出兩地之間的距離,能夠通過坐標和半徑的方式找出范圍內(nèi)的其他地理位置
如果你的程序需要使用 附近的人 的功能朗若,使用 geospatial 數(shù)據(jù)類型就能做到恼五。
geoadd
添加一個或多個帶有經(jīng)緯度的地理位置
# 格式:geoadd key 經(jīng)度 維度 地點名稱 [經(jīng)度 維度 地點名稱 ...]
127.0.0.1:6379> geoadd geo 120.21201 30.2084 hangzhou 121.48941 31.40527 shanghai
(integer) 2
復(fù)制代碼
geodist
返回兩地之間的距離
127.0.0.1:6379> geoadd geo 120.21201 30.2084 hangzhou 121.48941 31.40527 shanghai
(integer) 2
127.0.0.1:6379> geodist geo hangzhou shanghai km # 最后一個參數(shù)指定單位
"180.5896"
復(fù)制代碼
[圖片上傳失敗...(image-5ae9a6-1602473117944)]
geohash
獲取一個或多個地點的 geohash 值,這個 geohash 其實就是地點的經(jīng)緯度信息經(jīng)過編碼形成的哭懈,每個字符串代表唯一的坐標
127.0.0.1:6379> geoadd geo 120.21201 30.2084 hangzhou 121.48941 31.40527 shanghai
(integer) 2
127.0.0.1:6379> geohash geo hangzhou shanghai
1) "wtm7z7r8wv0"
2) "wtw6st1uuq0"
復(fù)制代碼
geopos
返回一個或多個地理位置的經(jīng)緯度坐標
127.0.0.1:6379> geoadd geo 120.21201 30.2084 hangzhou 121.48941 31.40527 shanghai
(integer) 2
127.0.0.1:6379> geopos geo hangzhou shanghai
1) 1) "120.21200805902481079"
2) "30.20839995425554747"
2) 1) "121.48941010236740112"
2) "31.40526993848380499"
復(fù)制代碼
georadius
給定一個坐標作為圓心灾馒,給定一個距離作為半徑,掃描這個圓范圍內(nèi)的地點(前提是redis中存在)
127.0.0.1:6379> geoadd geo 120.21201 30.2084 hangzhou 121.48941 31.40527 shanghai
(integer) 2
127.0.0.1:6379> geoadd geo 113.27324 23.15792 guangzhou 91.13775 29.65262 xizang
(integer) 2
# 格式:georadius key 經(jīng)度 維度 半徑 單位 [可選項遣总,見官網(wǎng)]
127.0.0.1:6379> georadius geo 120.21201 30.2084 200 km # 以杭州為中心200km為半徑掃描
1) "hangzhou"
2) "shanghai"
127.0.0.1:6379> georadius geo 120.21201 30.2084 5000 km # 杭州為中心睬罗,5000km為半徑掃描
1) "xizang"
2) "guangzhou"
3) "hangzhou"
4) "shanghai"
復(fù)制代碼
georadiusbymember
這個命令和 georadius
命令一樣, 都可以找出位于指定范圍內(nèi)的元素旭斥, 但是 georadiusbymember
的中心點是由給定的位置元素決定的容达, 而不是像 georadius
那樣, 需要輸入的經(jīng)度和緯度來決定中心點垂券。
127.0.0.1:6379> geoadd geo 120.21201 30.2084 hangzhou 121.48941 31.40527 shanghai
(integer) 2
127.0.0.1:6379> geoadd geo 113.27324 23.15792 guangzhou 91.13775 29.65262 xizang
(integer) 2
127.0.0.1:6379> georadiusbymember geo hangzhou 200 km
1) "hangzhou"
2) "shanghai"