Redis中3種特殊的數據類型


Redis中3種特殊的數據類型

Bitmap

Bitmap就是通過一個bit位來表示某個元素對應的值或者狀態

其中的 key 就是對應元素本身,實際上底層也是通過對字符串的操作來實現

Redis2.2 版本之后新增了setbit, getbit, bitcount 等幾個 bitmap 相關命令

雖然是新命令,但是本身都是對字符串的操作

SETBIT key offset value

其中 offset 必須是數字,value 只能是 0 或者 1

這個命令的返回值是修改前的值

比如調用

setbit byte0 0 1;
setbit byte0 2 1;
setbit byte0 5 1;
​
setbit byte1 1 1;
setbit byte1 4 1;

對應內存中的值就是這樣

byte bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7
byte0 1 0 1 0 0 1 0 0
byte1 0 1 0 0 1 0 0 0

 

可以看出 bit 的默認值是 0,那么 Bitmap 在實際開發的運用呢?

這里舉一個例子:儲存用戶在線狀態

這里只需要一個 key,然后把用戶 ID 作為 offset,如果在線就設置為 1,不在線就設置為 0

//設置在線狀態
$redis->setBit online 0 1;
​
//設置離線狀態
$redis->setBit online 0 0;
​
//獲取狀態
$redis->getBit online 0;
​
//獲取在線人數
$redis->bitCount online;

Geo

RedisGEO 特性在 Redis 3.2 版本中推出

這個功能可以將用戶給定的地理位置信息儲存起來, 並對這些信息進行操作

GEO 的數據結構總共有六個命令

  • geoadd

  • geopos

  • geodist

  • georadius

  • georadiusbymember

  • geohash

GEOADD

GEOADD key longitude latitude member [longitude latitude member ...]

將給定的空間元素(緯度、經度、名字)添加到指定的鍵里面

這些數據會以zset的結構被儲存在鍵里面

比如設置

keySicily(意大利亞西西里島嶼)

member1Palermo(意大利西西里自治區首府 巴勒莫)

member2Catania(意大利西西里大區卡塔尼亞省首府 卡塔尼亞)

redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2

GEOPOS

GEOPOS key member [member ...]

從鍵里面返回所有給定位置元素的位置(經度和緯度)

比如調用GEOPOS Sicily Palermo

返回Palermo的經緯度

redis> GEOPOS Sicily Palermo
1) 1) "13.361389338970184"
2) "38.115556395496299"

GEODIST

GEODIST key member1 member2 [unit]

返回兩個給定位置之間的距離

如果兩個位置之間的其中一個不存在, 那么返回null

指定單位的參數 unit 必須是以下單位的其中一個:(默認為m)

  • m

  • km 千米

  • mi 英里

  • ft 英尺

比如調用GEODIST Sicily Palermo Catania

返回PalermoCatania的距離166274.15米

redis> GEODIST Sicily Palermo Catania
"166274.15156960039"

GEORADIUS

GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]

以給定的經緯度為中心, 返回鍵包含的位置元素當中, 與中心的距離不超過給定最大距離的所有位置元素

距離單位和上面的一致,其中后面的選項:

  • WITHDIST

    在返回位置元素的同時, 將位置元素與中心之間的距離也一並返回

    距離的單位和用戶給定的范圍單位保持一致

  • WITHCOORD

    將位置元素的經度和維度也一並返回

  • WITHHASH

    52 位有符號整數的形式, 返回位置元素經過原始 geohash 編碼的有序集合分值

    這個選項主要用於底層應用或者調試, 實際中的作用並不大

比如調用GEORADIUS Sicily 15 37 200 km WITHDIST

意思就是返回keySicily中處於

經度15緯度37為圓心,半徑200km的圓形范圍內的元素,以及元素到圓心的距離

redis> GEORADIUS Sicily 15 37 200 km WITHDIST
1) 1) "Palermo"
 2) "190.4424"
2) 1) "Catania"
 2) "56.4413"

HyperLogLog

Redis 的基數統計

這個結構可以非常省內存的去統計各種計數,比如注冊 IP 數每日訪問 IP 數頁面實時UV在線用戶數

但是它也有局限性,就是只能統計數量,而沒辦法去知道具體的內容是什么

PFADD

redis> PFADD databases "Redis" "MongoDB" "MySQL"
(integer) 1
​
redis> PFADD databases "Redis"  # Redis 已經存在,不必對估計數量進行更新
(integer) 0

PFCOUNT

redis> PFCOUNT databases
(integer) 3

PFMERGE

PFMERGE destkey sourcekey [sourcekey ...]

將多個 HyperLogLog 合並為一個 HyperLogLog

合並后的 HyperLogLog 的基數接近於所有輸入 HyperLogLog可見集合的並集

合並得出的 HyperLogLog 會被儲存在 destkey 鍵里面

如果該鍵並不存在,那么命令在執行之前, 會先為該鍵創建一個空的 HyperLogLog

redis> PFADD nosql "Redis" "MongoDB" "Memcached"
(integer) 1
redis> PFADD RDBMS "MySQL" "MSSQL" "PostgreSQL"
(integer) 1
redis> PFMERGE databases nosql RDBMS
OK
redis> PFCOUNT databases
(integer) 6

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM