本文曾经收录到Github仓库,该仓库蕴含计算机根底、Java根底、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构等外围知识点,欢送star~
Github地址:https://github.com/Tyson0314/...
Gitee地址:https://gitee.com/tysondai/Ja...
拼多多有数亿的用户,那么对于某个网页,怎么应用Redis来统计一个网站的用户拜访数呢?
1、Hash
哈希是Redis的一种根底数据结构,Redis底层保护的是一个开散列,会把不同的key映射到哈希表上,如果是遇到关键字抵触,那么就会拉出一个链表进去。
当一个用户拜访的时候,如果用户登陆过,那么咱们就应用用户的id,如果用户没有登陆过,那么咱们也可能前端页面随机生成一个key用来标识用户
当用户拜访的时候,咱们能够应用HSET命令,key能够抉择URI与对应的日期进行拼凑,field能够应用用户的id或者随机标识,value能够简略设置为1。
当咱们要统计某一个网站某一天的访问量的时候,就能够间接应用HLEN来失去最终的后果了。
长处:简略,容易实现,查问也是十分不便,数据准确性十分高。
毛病:占用内存过大。随着key的增多,性能也会降落。网站访问量不高还行,拼多多这种数亿PV的网站必定顶不住。
2、Bitset
咱们晓得,对于一个32位的int,如果咱们只用来记录id,那么只可能记录一个用户,但如果咱们转成2进制,每位用来示意一个用户,那么咱们就可能一口气示意32个用户,空间节俭了32倍!
对于有大量数据的场景,如果咱们应用bitset,那么能够节俭十分多的内存。
对于没有登陆的用户,咱们也能够应用哈希算法,把对应的用户标识哈希成一个数字id。bitset十分的节俭内存,假如有1亿个用户,也只须要100000000/8/1024/1024约等于12兆内存。
Redis曾经为咱们提供了SETBIT的办法,应用起来十分的不便,咱们能够看看上面的例子。
咱们在item页面能够不停地应用SETBIT命令,设置用户曾经拜访了该页面,也能够应用GETBIT的办法查问某个用户是否拜访。最初咱们通过BITCOUNT能够统计该网页每天的拜访数量。
长处: 占用内存更小,查问不便,能够指定查问某个用户,数据可能略有瑕疵,对于非登陆的用户,可能不同的key映射到同一个id,否则须要保护一个非登陆用户的映射,有额定的开销。
毛病: 如果用户十分的稠密,那么占用的内存可能比办法一更大。
3、概率算法
对于拼多多这种多个页面都可能十分多访问量的网站,如果所须要的数量不必那么精确,能够应用概率算法。
事实上,咱们对一个网站的UV的统计,1亿跟1亿零30万其实是差不多的。
在Redis中,曾经封装了HyperLogLog算法,他是一种基数评估算法。这种算法的特色,个别都是数据不存具体的值,而是存用来计算概率的一些相干数据。
当用户拜访网站的时候,咱们能够应用PFADD命令,设置对应的命令,最初咱们只有通过PFCOUNT就能顺利计算出最终的后果,因为这个只是一个概率算法,所以可能存在0.81%的误差。
长处: 占用内存极小,对于一个key,只须要12kb。对于拼多多这种超多用户的特地实用。
毛病: 查问指定用户的时候,可能会出错,毕竟存的不是具体的数据。总数也存在肯定的误差。
下面就是常见的3种实用Redis统计网站用户拜访数的办法了。
最初给大家分享一个Github仓库,下面有大彬整顿的300多本经典的计算机书籍PDF,包含C语言、C++、Java、Python、前端、数据库、操作系统、计算机网络、数据结构和算法、机器学习、编程人生等,能够star一下,下次找书间接在下面搜寻,仓库继续更新中~
Github地址:https://github.com/Tyson0314/...