具有唯一当前查看器的PHP Redis(predis)计数器
我想知道如何实现一个独特的访客计数器使用超时1小时。我有一个小小的网店,我想展示一下目前有多少人在看一篇文章。最好的办法是什么?我正在使用具有唯一当前查看器的PHP Redis(predis)计数器,php,redis,counter,Php,Redis,Counter,我想知道如何实现一个独特的访客计数器使用超时1小时。我有一个小小的网店,我想展示一下目前有多少人在看一篇文章。最好的办法是什么?我正在使用 谢谢你的帮助,你需要做两件事: 为每个访问者(他们)生成唯一的ID 使用RedisSET或ZSET存储这些ID并添加过期机制 方法#1:SET+SCARD+EXPIRE 解决方案 设置的名称可能类似于[article\u id]:[current\u hour\u timestamp],每次在其中添加访客id时,执行过期操作。每一套都会在一段时间后过期
谢谢你的帮助,你需要做两件事:
- 为每个访问者(他们)生成唯一的ID
- 使用Redis
或SET
存储这些ID并添加过期机制ZSET
[article\u id]:[current\u hour\u timestamp]
,每次在其中添加访客id时,执行过期操作。每一套都会在一段时间后过期
使用SCARD[article\u id]:[current\u hour\u timestamp]
了解有多少访问者在线
注释
密钥可以是[article\u id]:[current\u hour\u timestamp]
或类似articles:[article\u id]:阅读器:[current\u hour\u timestamp]
,如果您愿意的话
在每一个小时开始时,设置将是空的,这不是您可能想要的
方法2:ZSET+ZCARD+cron
解决方案
每次访问者阅读打开一篇文章并发送ZADD[article\u id]:readers[expiration\u time][visitor\u id]
,重新加载页面并不重要,只会更新expiration\u time
<代码> ExviyTime是我们认为访问者离开文章时的时间戳。
将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\u id]:readers
注意
这种方法更好,因为它使用了一个滑动窗口,所以你不会在每一个新的小时都有“0阅读器”的效果。然而,缺点是您需要循环查看所有的文章id,这可能是一个问题
方法#3:ZSET+ZCARD+ZSET-as-index+cron
解决方案
与方法2相同,但是此方法使用另一个zsetarticles:readers:zset
,其中包含最近更新的所有zset键
然后,您必须循环使用此zset成员,而不是所有的项目ID
注意
如果你这样做了,别忘了从文章:readers:zset
中删除过期成员