请教诸位一个 redis 统计访问量增速的问题

2021-04-10 18:46:20 +08:00
 waibunleung

自己搞了个小程序,需要统计一下某些内容的访问量增速,比如某个视频 10 分钟内的访问量,在内存有限的情况下(最多 8g),用 redis 来做的话,怎么做比较好?因为存在时间窗口的问题,不知道采用哪种方法比较好。

关于用户,没登录什么的,所以也不会有什么用户 id 之类的东西

  1. 有序集合,毫秒时间戳为 score,但是如果比较多访问的话,内存占用比较大,实际上我只想要一个数而已
  2. 普通的 key,但是怎么去除 10 分钟前的数据?每分钟存一次访问量数据的话,要统计一个视频的 10 分钟访问量还好,但是要统计多个的时候,就要多次读取 redis
  3. 有没有更好的办法? 成本有限,加内存什么的就先不考虑了吧
3871 次点击
所在节点    程序员
49 条回复
waibunleung
2021-04-12 10:54:36 +08:00
@liuhan907 嗯嗯我加入备忘研究一下
keakon
2021-04-12 14:17:10 +08:00
@waibunleung 你最好先熟悉 redis 的内存占用再来臆测。一楼的方案内存占用要多 1~2 个数量级。
waibunleung
2021-04-12 21:27:02 +08:00
@keakon 关键是我没有看出来你的方案和一楼的方案有什么本质的区别,臆测倒没有,你说扛不住也要说说你的理由和分析吧?
waibunleung
2021-04-12 21:43:01 +08:00
@keakon 对不起,一开始没有 get 到你全部的意思,我之所以会这么说,是因为用一楼的方案,也可以做到你说的时间轮的类似效果,只是一楼少了定时删除旧缓存的做法,加上之后,我觉得和你说的没有太本质的区别,始终维护的是一个时间段内的数据
sunhuawei
2021-04-12 22:35:13 +08:00
看需求有点云里雾里的,如果是我的话我会用 HyperLogLog 统计,最大占用 12k,会有 0.81%左右的误差但很高效
waibunleung
2021-04-13 10:14:49 +08:00
@sunhuawei 要在内存有限的情况下用 redis 统计近 10 分钟的视频访问量,转发数等数据,HyperLogLog 主要是去重,场景不对
11373450
2021-04-13 10:30:25 +08:00
redis 设置一个过期时间( 10 分钟),然后设置他值为 1 。 判断这个 redis 存在就累加。没有存在就重新设置
waibunleung
2021-04-13 20:00:48 +08:00
@11373450 这种不太符合时间滑动窗口的需求哈
CantSee
2021-04-23 17:30:33 +08:00
设置 bitmap 的存储大小,例如 1 -N 分钟,单个 Key 的长度为 200(假设),那么第一个 key 存储时,为 name_1,第二个为 name_2,同时失效第一个,保证永远只会存在一个 key,统计时,直接 200 * n +当前 name_key 的长度;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/769758

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX