2016-01-20 65 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时间与另一个线程交换。现在,您基于陈旧的信息多次加载同一横幅。

没有写一本答案的书,如果你有一个低流量的网站,那么你可能不必担心太多的并发。如果您预计会有大量流量,那么您可能需要考虑这一点,并适当规划您的查询和更新,否则您的号码可能不准确。

编辑:重新阅读您的问题后,您似乎不希望重复展示广告条,直到他们在视觉上看到为止。在这种情况下,您可以将时间戳添加到数据库中的表中,并查询最长时间未查看的横幅。上述相同的原则仍然适用,包括潜在的并发问题。

希望这会有所帮助,祝你好运!