本文曾经收录到 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/…