Bitmap
Bitmap
就是通過一個bit
位來表示某個元素對應的值或者狀態
其中的 key 就是對應元素本身,實際上底層也是通過對字符串的操作來實現
Redis
從 2.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
Redis
的 GEO
特性在 Redis 3.2
版本中推出
這個功能可以將用戶給定的地理位置信息儲存起來, 並對這些信息進行操作
GEO 的數據結構總共有六個命令
-
geoadd
-
geopos
-
geodist
-
georadius
-
georadiusbymember
-
geohash
GEOADD
GEOADD key longitude latitude member [longitude latitude member ...]
將給定的空間元素(緯度、經度、名字)添加到指定的鍵里面
這些數據會以zset
的結構被儲存在鍵里面
比如設置
key
為Sicily
(意大利亞西西里島嶼)
member1
為Palermo
(意大利西西里自治區首府 巴勒莫)
member2
為Catania
(意大利西西里大區卡塔尼亞省首府 卡塔尼亞)
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
返回Palermo
與Catania
的距離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
意思就是返回key
為Sicily
中處於
以經度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