2016-01-20 66 views
2

我有一個管理員可以添加橫幅的管理員會話網站。橫幅實體有一個int ClickLimit和一個int VisualizationLimit。因此,每次顯示此橫幅時,我都會將+1增加到VisualizationLimit,點擊次數也相同。如何平等地顯示橫幅?

問題是我需要某種先進先出隊列。在上面的邏輯中,它不起作用,因爲如果用戶點擊10次然後一些管理員添加新的橫幅,則新橫幅的int ClickLimitint VisualizationLimit將爲0,因此該橫幅將顯示9次,而舊橫幅將不會顯示。

目標: 我需要顯示橫幅平等,而不是隨機。像FIFO隊列一樣,當顯示較少查看的橫幅時,它將進入隊列的末尾。

我試圖找到一些模式來實現它,但沒有幸運。什麼是這種情況的最佳解決方案?

+0

你想達到什麼目的?期望的結果是什麼? – Romias

+0

@Romias我編輯OP – gog

+0

您可以同時顯示多個橫幅嗎? – Romias

回答

3

爲什麼不在廣告實體上添加'LastViewed'。您可以顯示最近未查看的內容。

只是增加ViewCount並設置實體LastViewed一次被瀏覽時,然後顯示無論有最早的日期

0

如何保持臨時計數器(列表)在內存中緩存(共享緩存如果負載平衡)。

所以你可以存儲一些緩存:

imagecount-image1:19 
imagecount-image2:17 
imagecount-image3:18 
    ^
use a prefix so you can identify these as part of the same set. 

每次顯示的圖像增加緩存的數量和DB計數。 (通過這種方式,數據庫計數是生存期計數),添加新圖像後緩存可以被刪除,因此所有圖像都會被公平地顯示出來。

您將需要一些代碼來管理緩存,以便您可以使用imageCounters列表而不是處理每個人。

只是一個建議 - 希望它有助於

0

這似乎是一個排序問題。舉例來說,如果你有記憶橫幅列表,你可以決定哪些顯示方式:

var banner = banners.OrderBy (_ => _.VisualizationLimit).First(); 

然後你要增加你的價值觀和更新數據庫,或任何你要堅持你的信息。

如果我的假設不正確,你還沒有你的橫幅列表,那麼你需要從你的數據庫中查詢它們。這提出了一個有趣的併發問題,可能發生在高流量的網站...

一個典型的情況可能是加載下一個橫幅基於group by/having子句,您尋找最小的VisualizationLimit橫幅,然後增加這些值內存,並更新您的數據庫。這裏的潛在問題是,在重負載下,服務器可能會在更新數據庫之前將CPU時間與另一個線程交換。現在,您基於陳舊的信息多次加載同一橫幅。

沒有寫一本答案的書,如果你有一個低流量的網站,那麼你可能不必擔心太多的併發。如果您預計會有大量流量,那麼您可能需要考慮這一點,並適當規劃您的查詢和更新,否則您的號碼可能不準確。

編輯:重新閱讀您的問題後,您似乎不希望重複展示廣告條,直到他們在視覺上看到爲止。在這種情況下,您可以將時間戳添加到數據庫中的表中,並查詢最長時間未查看的橫幅。上述相同的原則仍然適用,包括潛在的併發問題。

希望這會有所幫助,祝你好運!