redis bitmap實現點贊的思路
阿新 • • 發佈:2018-09-13
用戶 個人 bitmap get tco 圖片 偏移 進制數 允許
bitmap簡介:
bitmap時一連串的二進制數字(0,1),每位所在的位置為偏移(offset),在bitmap上可以執行and、or、xor以及其他操作。
位圖計數:
位圖計數 的意思是統計bitmap中值為1的位的個數,位統計的效率時很高的。
redis中允許使用二進制的key和二進制的value,bitmap就是二進制的value。
點贊/取消點贊:
假設用戶ID為100,對照片ID為100的照片進行點贊。首先根據照片ID生成數據存儲的redis key,比如生成策略是like_photo:{photo_id},用戶ID為1000的用戶點贊只需將like_photo:100的第1000位設置為1即可(取消置為0)。
redis setbit操作的時間復雜度為O(1),所以這種點贊方式十分高效。
當前是否點贊:
用戶打開圖片的時候需要查詢當前是否點贊過該照片,查詢是否點贊可以通過redis getbit操作實現。
查詢點贊總次數:
比如需要顯示照片ID為1000的照片的獲贊總次數,只需對like_photo:1000進行位圖計數操作即可:bitcount。時間復雜度為O(N)。個人以為可以在照片表中加一個字段記錄獲贊總次數,這樣就不用循環統計各個照片的獲贊次數。
redis還提供了bittop等其他一些API,可以實現一些有趣的事。
局限性:
當用戶量很大的時候,比如千萬級用戶量的時候,最壞的情況下一個點贊bitmap需要消耗的內存為10000000/8/1024/1024=1.19MB,
redis bitmap實現點贊的思路