【问题标题】:How to display banners equally? [closed]如何平等地显示横幅? [关闭]
【发布时间】:2016-01-20 13:55:48
【问题描述】:

我有一个带有管理员会话的网站,管理员可以在其中添加横幅。横幅实体有一个int ClickLimit 和一个int VisualizationLimit。因此,每次显示此横幅时,我都会为 VisualizationLimit 增加 +1,点击次数也是如此。

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

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

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

【问题讨论】:

  • 你想达到什么目标?期望的结果是什么?
  • @Romias 我已经编辑了 OP
  • 您可以同时显示多个横幅吗?
  • @Romias 不,在布局页面的一个地方一次只有一个。

标签: c# asp.net-mvc banner


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    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 就是生命周期计数)然后可以在添加新图像时删除缓存,因此所有图像都将得到公平显示。

    您将需要一些代码来管理缓存,这样您就可以使用一系列 imageCounters 而不是处理每个人。

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

    【讨论】:

      【解决方案3】:

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

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

      然后你会想要增加你的值并更新你的数据库,或者在你保存信息的任何地方。

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多