本篇文章給大家?guī)砹岁P(guān)于Redis的相關(guān)知識,其中主要介紹了bitmap問題,Redis 為我們提供了位圖這一數(shù)據(jù)結(jié)構(gòu),位圖數(shù)據(jù)結(jié)構(gòu)其實并不是一個全新的玩意,我們可以簡單的認(rèn)為就是個數(shù)組,只是里面的內(nèi)容只能為0或1而已,希望對大家有幫助。
推薦學(xué)習(xí):Redis視頻教程
1.位圖簡介
如果我們需要記錄某一用戶在一年中每天是否有登錄我們的系統(tǒng)這一需求該如何完成呢?如果使用KV存儲,每個用戶需要記錄365個,當(dāng)用戶量上億時,這所需要的存儲空間是驚人的。
Redis 為我們提供了位圖這一數(shù)據(jù)結(jié)構(gòu),每個用戶每天的登錄記錄只占據(jù)一位,365天就是365位,僅僅需要46字節(jié)就可存儲,極大地節(jié)約了存儲空間。
位圖數(shù)據(jù)結(jié)構(gòu)其實并不是一個全新的玩意,我們可以簡單的認(rèn)為就是個數(shù)組,只是里面的內(nèi)容只能為0或1而已(二進(jìn)制位數(shù)組)。
2.命令實戰(zhàn)
Redis提供了SETBIT
、GETBIT
、BITCOUNT
、BITOP
四個常用命令用于處理二進(jìn)制位數(shù)組。
SETBIT
:為位數(shù)組指定偏移量上的二進(jìn)制位設(shè)置值,偏移量從0開始計數(shù),二進(jìn)制位的值只能為0或1。返回原位置值。GETBIT
:獲取指定偏移量上二進(jìn)制位的值。BITCOUNT
:統(tǒng)計位數(shù)組中值為1的二進(jìn)制位數(shù)量。BITOP
:對多個位數(shù)組進(jìn)行按位與、或、異或運算。
127.0.0.1:6379> SETBIT first 0 1 # 0000 0001 (integer) 0 127.0.0.1:6379> SETBIT first 3 1 # 0000 1001 (integer) 0 127.0.0.1:6379> SETBIT first 0 0 # 0000 1000 (integer) 1 127.0.0.1:6379> GETBIT first 0 (integer) 0 127.0.0.1:6379> GETBIT first 3 (integer) 1 127.0.0.1:6379> BITCOUNT first # 0000 1000 (integer) 1 127.0.0.1:6379> SETBIT first 0 1 # 0000 1001 (integer) 0 127.0.0.1:6379> BITCOUNT first # 0000 1001 (integer) 2 127.0.0.1:6379> SETBIT first 1 1 # 0000 1011 (integer) 0 127.0.0.1:6379> BITCOUNT first # 0000 1011 (integer) 3 127.0.0.1:6379> SETBIT x 3 1 (integer) 0 127.0.0.1:6379> SETBIT x 1 1 (integer) 0 127.0.0.1:6379> SETBIT x 0 1 # 0000 1011 (integer) 0 127.0.0.1:6379> SETBIT y 2 1 (integer) 0 127.0.0.1:6379> SETBIT y 1 1 # 0000 0110 (integer) 0 127.0.0.1:6379> SETBIT z 2 1 (integer) 0 127.0.0.1:6379> SETBIT z 0 1 # 0000 0101 (integer) 0 127.0.0.1:6379> BITOP AND andRes x y z #0000 0000 (integer) 1 127.0.0.1:6379> BITOP OR orRes x y z #0000 1111 (integer) 1 127.0.0.1:6379> BITOP XOR x y z #0000 1000 (integer) 1 # 對給定的位數(shù)組進(jìn)行按位取反 127.0.0.1:6379> SETBIT value 0 1 (integer) 0 127.0.0.1:6379> SETBIT value 3 1 #0000 1001 (integer) 0 127.0.0.1:6379> BITOP NOT notValue value #1111 0110 (integer) 1
3.BitMap源碼分析
3.1 數(shù)據(jù)結(jié)構(gòu)
如下展示了一個用 SDS 表示的一字節(jié)(8位)長的位圖:
擴(kuò)展:Redis 中的每個對象都是有一個 redisObject 結(jié)構(gòu)表示的。
typedef struct redisObject { // 類型 unsigned type:4; // 編碼 unsigned encoding:4; unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */ // 引用計數(shù) int refcount; // 執(zhí)行底層實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)的指針 void *ptr; } robj;
type
的值為REDIS_STRING
表示這是一個字符串對象sdshdr.len
的值為1表示這個SDS保存了一個1字節(jié)大小的位數(shù)組- buf數(shù)組中的
buf[0]
實際保存了位數(shù)組 - buf數(shù)組中的
buf[1]
為自動追加的91精品久久久久久久久久 | 精品人妻va出轨中文字幕| 国产在线精品一区二区高清不卡| 日韩精品人妻一区二区三区四区| 国产精品扒开腿做爽爽爽的视频| 亚洲国产精品网站在线播放| 久久精品国产乱子伦| 日韩人妻精品无码一区二区三区| 久久最新精品国产| 亚洲精品无码成人片久久| 国产亚洲精品AA片在线观看不加载 | 亚洲国产精品综合久久久| 日韩人妻无码精品一专区| 亚洲精品乱码久久久久久蜜桃不卡 | 国产乱人伦偷精品视频免观看| 日韩欧美中文字幕公布| 亚洲日韩VA无码中文字幕| 国产成人精品免费视频大全五级| 国产精品制服丝袜| 国产精品电影网在线好看| 国产精品白丝喷水在线观看| 日韩国产精品99久久久久久| 日韩精品高清在线| 国产精品成人网站| 国产精品久久久久国产精品三级 | 国产成人精品久久亚洲高清不卡 | 尤物国精品午夜福利视频| 影院无码人妻精品一区二区| 亚洲av无码成人精品区| 合区精品久久久中文字幕一区| 强制高潮18XXXXHD日韩| 日韩精品极品视频在线观看免费 | 无码国产精品一区二区高潮| 99亚洲精品卡2卡三卡4卡2卡| 国产SUV精品一区二区88| 精品日产a一卡2卡三卡4卡乱| 成人区人妻精品一区二区三区| 蜜臀91精品国产高清在线观看 | 精品人妻无码一区二区三区蜜桃一 | 99久久精品影院老鸭窝| 亚洲永久精品ww47|