gpt4 book ai didi

PHP Redis (predis) 计数器与唯一的当前观众

转载 作者:可可西里 更新时间:2023-11-01 11:48:41 26 4
gpt4 key购买 nike

我想知道如何使用 Redis 实现唯一访客计数器超时为 1 小时。我有一个小网上商店,我想显示目前有多少人正在查看一篇文章。最好的方法是什么?我正在使用 Predis

提前致谢

最佳答案

你需要做两件事:

  • 为每个访问者生成一个唯一的 ID(他们 are many ways to do it)
  • 使用 Redis SETZSET 来存储这些 ID 并添加过期机制。

方法#1:SET + SCARD + EXPIRE

解决方案

SET 名称可能类似于 [article_id]:[current_hour_timestamp],每次您在其中SADD 访问者 id 时,执行 EXPIRE。每套将在一定时间后过期。

使用 SCARD [article_id]:[current_hour_timestamp] 了解有多少访客在线

注意事项

键可以是 [article_id]:[current_hour_timestamp] 或任何类似 articles:[article_id]:readers:[current_hour_timestamp] 的东西,如果你愿意...

在每个小时开始时,SET 将是空的,这不是您想要的。

方法#2:ZSET + ZCARD + cron

解决方案

每次访问者阅读打开文章时发送一个ZADD [article_id]:readers [expiry_time] [visitor_id],如果它重新加载页面并不重要,expiry_time 将被更新。

expiry_time 是我们认为访问者已离开文章的 future 时间戳。

设置一个 cron 每小时运行一次:

Retrieve all article ids in databases
For each article
Send a `zremrangebyscore "article.id:readers" -inf [current_timestamp]` to remove expired visitors_id

最后,要检索当前读者计数,请运行 ZCARD [article_id]:readers

注意

这种方法要好得多,因为它使用了一个滑动窗口,因此您不会在每个新的时间都出现“0 位读者”的情况。然而,缺点是您需要遍历所有文章 ID,这可能是个问题。

方法#3:ZSET + ZCARD + ZSET as index + cron

解决方案

与方法 #2 相同,但是此方法使用另一个 zset articles:readers:zset,其中包含最近更新的所有 zset key 。

然后您将必须遍历此 zset 成员而不是所有文章 ID。

注意

如果你这样做,不要忘记从 articles:readers:zset 中删除过期成员!

关于PHP Redis (predis) 计数器与唯一的当前观众,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22597751/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com