数据类型_分享redis中除5种基础数据类型以外的高级数据类型
眾所周知,在redis中的數據類型有String(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)五種。但在這5種之外還有高級數據類型。
今天和大家介紹下常用的高級數據類型:
1、HyperLogLog。
Redis中的HyperLogLog是用來做基數(數據集中不重復元素的數量就是基數)統計的算法。因為HyperLogLog只會計算輸入元素的基數,不會存儲元素本身,所以不能像其他數據類型一樣,返回輸入的各個元素。(版本2.8.9加入的)
特點:在輸入元素的數量或體積非常大的時候,計算基數所需的空間總是固定的(空間很小)。
下面實際演示HyperLogLog
1)、PFADD
命令:PFADD key element[element ...] 添加指定元素到HyperLogLog中。有元素添加就返回1,沒有就返回0。如下圖:
2)、PFCOUNT
命令:PFCOUNT key[key ...]返回給定的HyperLogLog的基數估算值。如果多個HyperLogLog則返回基數估算值之和(注意多個HyperLogLog 在redis集群中的同一個solt上才能返回基數,不在同一個solt上會報錯)。如下圖:
3)、PFMERGE
命令:PFMERGE mergekey sourcekey[sourcekey ...]將多個HyperLogLog合并為一個HyperLogLog(mergekey 合并后的key,sourcekey需要合并的key),注意多個HyperLogLog 在redis集群中的同一個solt上才能合并,不在同一個solt上會報錯。如下圖:
解決這個異常(CROSSSLOT Keys in request don't hash to the same slot):只需要合并或同時返回的多個HyperLogLog在同一個solt上就能解決問題了。redis提供了一種特定的標簽{},這個{}內的字符串才參與計算hash solt。如下圖:
從上圖可以看出PFCOUNT 返回多個HyperLogLog和PFMERGE將多個HyperLogLog合并都可以了
應用場景:實現記錄網站每天訪問的獨立IP數量、系統的有多少用戶訪問、直播間的觀看人數等。
2、GEO
redis在3.2版本里面添加了一個對地理位置(GEO)的支持。
下面具體介紹下:
1)、GEOADD
命令:GEOADD key longitude latitude member [ longitude latitude member ...]添加指定的地理空間位置到指定的key中。如下圖:
2)、GEODIST
命令:GEODIST key member1 member2 [unit]返回給定兩個位置之間的距離。如果有一個位置不存在就返回空值,unit是單位參數,其值為 m(米)、km(千米)、mi(英里)、ft(英尺)中的一個。如下圖:
3)、GEOPOS
命令:GEOPOS key member [member ...] 從key里返回所有給定位置,返回一個有經度和緯度組成的一個二維數組。如下圖:
4)、GEOHASH
命令:GEOHASH key member [member ...]返回元素的經緯度編碼字符串。如下圖:
5)、GEOREDIUS
命令:GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]以給定經緯度為中心,返回與中心的距離不超過給定最大距離的所有位置元素。單位可以使用m(米)、km(千米)、mi(英里)、ft(英尺)中的一個。如下圖:
在給定以下可選項時,命令就會返回額外的信息:
WITHDIST:在返回位置元素的同時,將位置元素與中心之間的距離一起返回。如下圖:
WITHCOORD:將位置元素的經緯度一起返回。如下圖:
WITHHASH: 返回位置元素經過原始 GEOHASH編碼的有序集合分值。如下圖:
ASC/DESC:ASC按中心的位置,從近到遠的方式返回位置元素,DESC按中心的位置,從遠到近的方式返回位置元素,如下圖:
COUNT:默認情況時返回所有的位置元素,但使用了COUNT選項,獲取前X個匹配的元素。注意:使用COUNT選項獲取少量元素,但執行速度不會因減少獲取的元素而加快。如下圖:
6)、GEORADIUSBYMEMBER
命令:GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]和GEORADIUS命令一樣,都是返回指定范圍內的元素,有一點不同,這個命令是設置位置元素為中心點。如下圖:
3、Bitmaps
bitmaps嚴格來說并不是一種新的數據類型,而是基于字符串位操作的集合,由于字符串是二進制安全的,并且最長可支持512M,所以它們可以用來存儲2的32次方(512 * 1024 * 1024 * 8 )不同位的數據。
在介紹之前先了解下字母abc的二進制ASCII碼如下:
a---01100001
b---01100010
c---01100011
下面具體介紹下:
1)、SETBIT /GETBIT
命令:SETBIT key offset value 對key所存儲的字符串值,設置指定偏移量上的位(bit),value只能是1或者0。若key不存在時,自動生成一個新的字符串值,并返回0,否則指定偏移量原來存儲的位。
命令:GETBIT key offset 獲取key指定偏移量上的位(bit)。若offset比字符串值的長度大,或者key不存在時,返回0,否則返回字符串值偏移量上的位(bit)
實際操作下:給(bitkey)設置abc,從上面abc對應的二進制ASCII碼。可知道bitkey 一共有24位,具體如下:01100001 01100010 01100011。從左往右,偏移量從0開始到23。獲取偏移量為10,15,23的值 1,0,1,如下圖:
執行命令:setbit bitkey 6 1,將偏移量為6的位設置為1 ,那bitkey為01100011 01100010 01100011,轉成字符串就是cbc。如下圖:
執行命令:setbit bitkey 23 0,將偏移量為第23的位 設置為0 ,那bitkey為01100011 01100010 01100010,轉成字符串就是cbb。如下圖:
2)、BITCOUNT
命令:bitcount key [start] [end] 計算給定字符串中,被設置為1的比特位的數量(可通過start或end參數,讓計數只在特定的位上進行)。若key不存在,當成空字符串處理,返回0,否則返回被設置為1的位的數量。注:start和end是一個字節,一個字節為8位如下圖:
3)、BITOP
命令:bitop operation destkey key [key……]對一個或多個保存二進制位的字符串key進行位元操作(and(與)、or(或)、not(非)、xor(異或) 四種操作),并將結果保存到destkey上。除了not操作外,其他操作都可以接受一個或多個key作為輸入,not只能接受一個key作為輸入。
注意:(1)、當bitop處理不同長度的字符串時,較短的那個字符串所缺少的部分會被看做0,空的key也被看做是包含0的字符串序列。(2)、保存到destkey的字符串的長度,和輸入key中最長的字符串長度相等。
and(與)操作:先給{bit}:key1 和{bit}:key2 分別賦值a,b。然后執行命令:bitop and {bit}:keys {bit}:key1 {bit}:key2,看下執行結果。如下圖:
or(或)操作:執行命令bitop or {bit}:key3 {bit}:key1 {bit}:key2,看下執行結果。如下圖:
not(非)操作:執行命令bitop not {bit}:key4 {bit}:key1,看下執行結果。如下圖:
xor(異或)操作:執行命令bitop xor {bit}:key5 {bit}:key1 {bit}:key2,看下執行結果。如下圖:
4)、BITPOS
命令:bitpos key bit [start] [end] 返回字符串里面第一個被設置為1或者0的bit位。如key為空字符或者0字節的字符串,那么將返回-1。注:start和end是一個字節,一個字節為8位。如下圖:
應用場景:系統記錄用戶的登錄情況、用戶在線情況等。
注:在面試的時候,被問到redis的數據類型的時候,除了回答5種基礎數據類型外,這三種高級數據類型,也可以回答一下。說不定能增加面試官對你印象。
今天的內容就到這里了,有什么不對的,歡迎大家在評論區中指出!
總結
以上是生活随笔為你收集整理的数据类型_分享redis中除5种基础数据类型以外的高级数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 锐捷交换机配置snmp版本_【交换机】交
- 下一篇: python psycopg2_如何在P