如何平等地显示横幅

本文关键字:显示 何平 | 更新日期: 2023-09-27 18:31:06

我有一个带有管理员会话的网站,管理员可以在其中添加横幅。横幅实体具有int ClickLimitint VisualizationLimit。因此,每次显示此横幅时,我都会将 +1 递增到VisualizationLimit,单击也是如此。

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

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

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

如何平等地显示横幅

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

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

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

所以你可以在缓存中存储一些东西:

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

每次显示图像时,都会增加缓存计数和数据库计数。(这样数据库计数就是生存期计数)然后可以在添加新图像时删除缓存,因此所有图像都将公平显示。

您将需要一些代码来管理缓存,以便您可以使用图像计数器列表,而不是处理每个单独的个人。

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

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

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

然后,您需要递增值并更新数据库,或者在任何保存信息的位置。

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

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

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

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

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