如何平等地显示横幅
本文关键字:显示 何平 | 更新日期: 2023-09-27 18:31:06
我有一个带有管理员会话的网站,管理员可以在其中添加横幅。横幅实体具有int ClickLimit
和int VisualizationLimit
。因此,每次显示此横幅时,我都会将 +1 递增到VisualizationLimit
,单击也是如此。
问题是我需要某种FIFO队列。在上面的逻辑上,它不起作用,因为如果用户单击 10 次,然后某个管理员添加了新横幅,则新横幅的int ClickLimit
和int 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 时间与另一个线程交换。现在,您根据过时的信息多次加载相同的横幅。
如果不写一本答案书,如果你有一个低流量的网站,那么你可能不必担心并发性。如果您预计有大量流量,那么您可能需要考虑这一点并适当地计划您的查询和更新,否则您的数字可能不准确。
编辑:重新阅读您的问题后,您似乎不想重复显示横幅,直到它们在视觉上赶上。在这种情况下,您可以向数据库中的表添加时间戳,并查询最长未查看的横幅。上述相同原则仍然适用,包括潜在的并发问题。
希望这有帮助,祝你好运!