C# 如何平等地展示横幅?

C# 如何平等地展示横幅?,c#,asp.net-mvc,banner,C#,Asp.net Mvc,Banner,我有一个网站与管理员会话,管理员可以添加一个横幅。横幅实体有一个int ClickLimit和一个int VisualizationLimit。因此,每次显示此横幅时,我都会将+1增加到可视化限制,单击时也是如此 问题是我需要某种先进先出队列。在上面的逻辑上,它将不起作用,因为如果用户单击10次,然后某个管理员添加一个新的横幅,则新横幅的int ClickLimit和int VisualizationLimit将为0,因此此横幅将显示9次,而旧的横幅将不会显示 目标: 我需要平均显示横幅,而不是

我有一个网站与管理员会话,管理员可以添加一个横幅。横幅实体有一个
int ClickLimit
和一个
int VisualizationLimit
。因此,每次显示此横幅时,我都会将+1增加到
可视化限制
,单击时也是如此

问题是我需要某种先进先出队列。在上面的逻辑上,它将不起作用,因为如果用户单击10次,然后某个管理员添加一个新的横幅,则新横幅的
int ClickLimit
int VisualizationLimit
将为0,因此此横幅将显示9次,而旧的横幅将不会显示

目标: 我需要平均显示横幅,而不是随机显示。与FIFO队列一样,当显示较少查看的横幅时,它将转到队列的末尾


我试图找到一些模式来实现它,但没有成功。这种情况的最佳解决方案是什么?

在am内存缓存中保留一个临时计数器(列表)(如果负载平衡,则为共享缓存)如何

因此,您可以在缓存中存储某些内容:

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列表,而不是处理每个单独的计数器


只是一个建议-希望能有所帮助

这似乎是一个排序问题。例如,如果内存中有一个横幅列表,则可以通过以下方式确定要显示的横幅:

var banner = banners.OrderBy (_ => _.VisualizationLimit).First ();
然后,您将希望增加您的值并更新您的数据库,或者无论您在哪里保存您的信息

如果我的假设是不正确的,您还没有您的横幅列表,那么您需要从数据库中查询它们。这提出了一个有趣的并发问题,可能发生在高流量站点中

典型的情况可能是基于
group by/having
子句加载下一个横幅,在该子句中查找最小的VisualizationLimit横幅,然后在内存中增加这些值,并更新数据库。这里潜在的问题是,在重载情况下,服务器可能会在更新数据库之前与另一个线程交换CPU时间。现在,您正在根据过时的信息多次加载同一条横幅

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

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


希望这对你有帮助,祝你好运

为什么不在横幅实体上添加一个
'LastViewed'
。您可以显示最近未查看的内容


只需在查看实体时增加
ViewCount
并设置该实体的
LastViewed
时间,然后显示最早日期的内容

,以及您希望实现的目标?期望的结果是什么?@Romias我已经编辑了Op您可以同时显示多个横幅吗?@Romias不,一次只能在版面页面的一个位置显示一个横幅。