1.有个视频表
2.用户观看视频记录日志表
3.每次推送时从视频表查出该用户没有观看记录的视频
如果数据量大的时候查询应该会很慢 要怎么处理 有什么好的方案吗?
1.有个视频表
2.用户观看视频记录日志表
3.每次推送时从视频表查出该用户没有观看记录的视频
如果数据量大的时候查询应该会很慢 要怎么处理 有什么好的方案吗?
相比起把完整精确的『看过信息』存在数据库或者缓存里面,其实为了节省空间,完全可以把不完全精确的『看过信息』给存下来,这当中两个路子,一个是Bloom Filter,另一个是HyperLogLog:
1.Bloom Filter:
用Redis的话,以{user_id}_{video_id}作为键,算出一组hash值,然后通过setbit命令来存,最后只需要对于{user_id}_{video_id}算出的hash值,通过命令getbit来取,发现都有了就是推送过了。
这种方法有一定误差,但表现力极好,空间占用足够少。
2.HyperLogLog:
Redis提供了HyperLogLog的支持,直接通过PFADD user_id video_id命令来存,然后通过这个命令看返回值为1还是为0,为1就是没存过,为0就是存过了。
这种方法也有一定误差,但表现力和空间占用都巨佳。
更多资料还可以参考,希望能帮助到你:
Redis详解(十三)------ Redis布隆过滤器
Redis基数统计——HyperLogLog小内存大用处
15 回答8.4k 阅读
8 回答6.2k 阅读
4 回答4.4k 阅读✓ 已解决
5 回答3.2k 阅读✓ 已解决
4 回答4k 阅读
1 回答3k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决