如何平等地展示横幅?
How to display banners equally?
我有一个带有管理员会话的网站,管理员可以在其中添加横幅。横幅实体有一个 int ClickLimit
和一个 int VisualizationLimit
。因此,每次显示此横幅时,我都会将 +1 增加到 VisualizationLimit
并且点击相同。
问题是我需要某种FIFO 队列。在上面的逻辑上它不会工作,因为如果用户点击 10 次然后一些管理员添加了一个新横幅,新横幅的 int ClickLimit
和 int VisualizationLimit
将为 0,所以这个横幅将显示 9 次,旧的横幅将不会显示。
目标:
我需要平均显示横幅,而不是随机显示。像先进先出队列一样,当显示较少查看的横幅时,它将转到队列的末尾。
我试图找到一些模式来实现它,但运气不好。这种情况的最佳解决方案是什么?
如何在 in-memory 缓存中保留一个临时计数器(列表)(如果负载平衡则为共享缓存)。
所以你可以在缓存中存储一些东西:
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就是lifetime count)添加新图片时可以删除缓存,所以所有图片都会公平显示。
您将需要一些代码来管理缓存,这样您就可以处理一组 imageCounter,而不是逐一处理。
只是一个建议 - 希望对您有所帮助
这似乎是一个排序问题。例如,如果您在内存中有一个横幅列表,您可以通过以下方式确定显示哪个:
var banner = banners.OrderBy (_ => _.VisualizationLimit).First ();
然后你会想要增加你的值并更新你的数据库,或者你保存信息的任何地方。
如果我认为您还没有横幅列表的假设是错误的,那么您需要从数据库中查询它们。这提出了一个有趣的并发问题,可能会在 high-traffic 个站点中发生...
一个典型的场景可能是根据 group by/having
子句加载下一个横幅,您在其中查找最小的 VisualizationLimit 横幅,然后在内存中递增这些值,并更新您的数据库。这里的潜在问题是在重负载下,服务器可能会在您更新数据库之前与另一个线程交换 CPU 时间。现在您要根据过时的信息多次加载同一个横幅。
如果您有一个 low-traffic 站点,则不用写一本答案书,那么您可能不必太担心并发问题。如果您预计会有大量流量,那么您可能需要考虑这一点并适当地计划您的查询和更新,否则您的数字可能不准确。
编辑:在 re-reading 你的问题之后,你似乎不想重复显示横幅,直到它们在视觉上赶上为止。在这种情况下,您可以将时间戳添加到数据库中的 table 并查询最长未被查看的横幅。上述原则仍然适用,包括潜在的并发问题。
希望这对您有所帮助,祝您好运!
为什么不在横幅实体上添加 'LastViewed'
。您可以显示最近未查看的内容。
只需递增 ViewCount
并在查看实体时设置 LastViewed
时间,然后 显示最旧的日期。
我有一个带有管理员会话的网站,管理员可以在其中添加横幅。横幅实体有一个 int ClickLimit
和一个 int VisualizationLimit
。因此,每次显示此横幅时,我都会将 +1 增加到 VisualizationLimit
并且点击相同。
问题是我需要某种FIFO 队列。在上面的逻辑上它不会工作,因为如果用户点击 10 次然后一些管理员添加了一个新横幅,新横幅的 int ClickLimit
和 int VisualizationLimit
将为 0,所以这个横幅将显示 9 次,旧的横幅将不会显示。
目标: 我需要平均显示横幅,而不是随机显示。像先进先出队列一样,当显示较少查看的横幅时,它将转到队列的末尾。
我试图找到一些模式来实现它,但运气不好。这种情况的最佳解决方案是什么?
如何在 in-memory 缓存中保留一个临时计数器(列表)(如果负载平衡则为共享缓存)。
所以你可以在缓存中存储一些东西:
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就是lifetime count)添加新图片时可以删除缓存,所以所有图片都会公平显示。
您将需要一些代码来管理缓存,这样您就可以处理一组 imageCounter,而不是逐一处理。
只是一个建议 - 希望对您有所帮助
这似乎是一个排序问题。例如,如果您在内存中有一个横幅列表,您可以通过以下方式确定显示哪个:
var banner = banners.OrderBy (_ => _.VisualizationLimit).First ();
然后你会想要增加你的值并更新你的数据库,或者你保存信息的任何地方。
如果我认为您还没有横幅列表的假设是错误的,那么您需要从数据库中查询它们。这提出了一个有趣的并发问题,可能会在 high-traffic 个站点中发生...
一个典型的场景可能是根据 group by/having
子句加载下一个横幅,您在其中查找最小的 VisualizationLimit 横幅,然后在内存中递增这些值,并更新您的数据库。这里的潜在问题是在重负载下,服务器可能会在您更新数据库之前与另一个线程交换 CPU 时间。现在您要根据过时的信息多次加载同一个横幅。
如果您有一个 low-traffic 站点,则不用写一本答案书,那么您可能不必太担心并发问题。如果您预计会有大量流量,那么您可能需要考虑这一点并适当地计划您的查询和更新,否则您的数字可能不准确。
编辑:在 re-reading 你的问题之后,你似乎不想重复显示横幅,直到它们在视觉上赶上为止。在这种情况下,您可以将时间戳添加到数据库中的 table 并查询最长未被查看的横幅。上述原则仍然适用,包括潜在的并发问题。
希望这对您有所帮助,祝您好运!
为什么不在横幅实体上添加 'LastViewed'
。您可以显示最近未查看的内容。
只需递增 ViewCount
并在查看实体时设置 LastViewed
时间,然后 显示最旧的日期。