三種特殊數(shù)據(jù)類型

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"
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末花盐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子圆米,更是在濱河造成了極大的恐慌卒暂,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娄帖,死亡現(xiàn)場離奇詭異也祠,居然都是意外死亡,警方通過查閱死者的電腦和手機近速,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門诈嘿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人削葱,你說我怎么就攤上這事奖亚。” “怎么了析砸?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵昔字,是天一觀的道長。 經(jīng)常有香客問我,道長作郭,這世上最難降的妖魔是什么陨囊? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮夹攒,結(jié)果婚禮上蜘醋,老公的妹妹穿的比我還像新娘。我一直安慰自己咏尝,他們只是感情好压语,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著编检,像睡著了一般胎食。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上允懂,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天斥季,我揣著相機與錄音,去河邊找鬼累驮。 笑死,一個胖子當(dāng)著我的面吹牛舵揭,可吹牛的內(nèi)容都是我干的谤专。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼午绳,長吁一口氣:“原來是場噩夢啊……” “哼置侍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拦焚,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤蜡坊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赎败,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秕衙,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年僵刮,在試婚紗的時候發(fā)現(xiàn)自己被綠了据忘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡搞糕,死狀恐怖勇吊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窍仰,我是刑警寧澤汉规,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站驹吮,受9級特大地震影響针史,放射性物質(zhì)發(fā)生泄漏晶伦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一悟民、第九天 我趴在偏房一處隱蔽的房頂上張望坝辫。 院中可真熱鬧,春花似錦射亏、人聲如沸近忙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽及舍。三九已至,卻和暖如春窟绷,著一層夾襖步出監(jiān)牢的瞬間锯玛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工兼蜈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留攘残,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓为狸,卻偏偏與公主長得像歼郭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辐棒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354