我有一个管理员会话的网站,管理员可以在其中添加横幅广告。横幅实体具有int ClickLimit
和int VisualizationLimit
。因此,每次显示此横幅时,我都会向VisualizationLimit
增加+1,并为点击增加+1。
问题是我需要某种 FIFO队列。在上面的逻辑上它不起作用,因为如果用户点击10次然后某个管理员添加了新横幅,则新横幅的int ClickLimit
和int VisualizationLimit
将为0,因此此横幅将为显示9次,不显示旧横幅。
目标: 我需要平等地展示横幅,而不是随机展示横幅。与FIFO队列一样,当显示较少查看的横幅时,它将到达队列的末尾。
我试图找到一些模式来实现它,但没有幸运。什么是这种情况的最佳解决方案?
答案 0 :(得分:3)
为什么不在横幅实体上添加'LastViewed'
?您可以显示最近未查看过的内容。
只需增加ViewCount
并在查看实体时设置LastViewed
时间,然后显示具有最早日期的内容。
答案 1 :(得分:0)
如何在内存缓存中保留临时计数器(List)(如果负载平衡,则为共享缓存)。
所以你可以在缓存中存储一些东西:
imagecount-image1:19
imagecount-image2:17
imagecount-image3:18
^
use a prefix so you can identify these as part of the same set.
每次显示图像时,都会增加缓存计数和数据库计数。 (这样DB Count是生命周期计数)然后可以在添加新图像时删除缓存,因此所有图像都会得到公平显示。
您需要一些代码来管理缓存,以便您可以使用imageCounters列表而不是处理每个人。
只是一个建议 - 希望它有所帮助
答案 2 :(得分:0)
这似乎是一个排序问题。例如,如果您在内存中有一个横幅列表,则可以确定要显示的内容:
var banner = banners.OrderBy (_ => _.VisualizationLimit).First ();
然后,您需要增加值并更新数据库,或者在您持久保存信息的任何位置。
如果我的假设不正确,您还没有横幅列表,那么您需要从数据库中查询它们。这提出了一个有趣的并发问题,可能会出现在高流量网站......
典型的情况可能是根据group by/having
子句加载下一个标题,在该子句中查找最小的VisualizationLimit标题,然后在内存中递增这些值,并更新数据库。这里潜在的问题是,在重负载下,服务器可能会在您更新数据库之前将CPU时间与另一个线程交换。现在,您根据陈旧信息多次加载相同的横幅。
如果你没有写一本答案的书,如果你有一个低流量的网站,那么你可能不必担心并发性。如果您预计会有大量流量,那么您可能需要考虑这一点并正确计划您的查询和更新,否则您的数字可能不准确。
修改:重新阅读问题后,您似乎不想重复显示横幅,直到它们直观地抓住。在这种情况下,您可以向数据库中的表添加时间戳,并查询尚未查看最长的横幅。上述相同的原则仍然适用,包括潜在的并发问题。
希望这会有所帮助并祝你好运!