1. 程式人生 > >redis bitmap實現點贊的思路

redis bitmap實現點贊的思路

用戶 個人 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實現點贊的思路