作互聯網應用時,常常會碰到關於商品或者文章等詳情的閱讀量,點贊量,評論量這些頻繁更新的屬性如何存儲設計的業務場景;這兩天恰好遇到順便總結一下;redis
方案一:數據庫
以視頻爲例,在視頻實體video中用countRead做爲閱讀總數;緩存
- 用redis存放video的訪問增量,key能夠爲「video_count_inc」+videoId
- 在訪問video詳情時redis訪問增量+1,
- 定時任務讀取redis中的增量更新到視頻中,更新完後redis要減去這個增量(若是增量爲0則刪除這個key);
- 查詢視頻時其閱讀量要加上redis中的增量
方案二:ide
今天又想了一種實現方案,並且感受這種方案更好,對於方案一,假設這個視頻的變更的屬性特別多比點贊,閱讀,收藏,轉發等那每一項屬性都要按方案一來一遍會很繁瑣,並且重點是,通常咱們都會吧video詳情放redis作緩存,那這樣就會緩存不少冗餘數據!因此方案二來了設計
- 將video詳情轉hash放redis(redis的hash結構能夠直接對hash中的每一項操做,並且速度比對象快!);
- 點贊,閱讀,收藏,轉發操做時判斷redis中有無video詳情,若是沒有則需先將video加載進redis,而後將對應屬性+1,同時要記錄一下本次操做的時間戳;
- 定時任務掃描redis,將詳情刷入數據庫;若是操做時間戳距離如今的時間差x大於定時任務的時間間隔則無需更新,而後若是x超過xx天說明該視頻沒什麼熱度了能夠將其從redis刪除;(這一步若是要求高的話能夠直接統計庫裏的數據信息)