首页 > 数据库 >如何用 Redis 统计用户访问量?

如何用 Redis 统计用户访问量?

时间:2023-01-03 22:01:40浏览次数:64  
标签:Redis 用户 算法 内存 key id 访问量

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构等核心知识点,欢迎star~

Github地址:​​https://github.com/Tyson0314/Java-learning​

Gitee地址:​​https://gitee.com/tysondai/Java-learning​

拼多多有数亿的用户,那么对于某个网页,怎么使用Redis来统计一个网站的用户访问数呢?

1、Hash

哈希是Redis的一种基础数据结构,Redis底层维护的是一个开散列,会把不同的key映射到哈希表上,如果是遇到关键字冲突,那么就会拉出一个链表出来。

当一个用户访问的时候,如果用户登陆过,那么我们就使用用户的id,如果用户没有登陆过,那么我们也能够前端页面随机生成一个key用来标识用户

当用户访问的时候,我们可以使用HSET命令,key可以选择URI与对应的日期进行拼凑,field可以使用用户的id或者随机标识,value可以简单设置为1。

当我们要统计某一个网站某一天的访问量的时候,就可以直接使用HLEN来得到最终的结果了。

如何用 Redis 统计用户访问量?_Redis

优点:简单,容易实现,查询也是非常方便,数据准确性非常高。

缺点:占用内存过大。随着key的增多,性能也会下降。网站访问量不高还行,拼多多这种数亿PV的网站肯定顶不住。

2、Bitset

我们知道,对于一个32位的int,如果我们只用来记录id,那么只能够记录一个用户,但如果我们转成2进制,每位用来表示一个用户,那么我们就能够一口气表示32个用户,空间节省了32倍!

对于有大量数据的场景,如果我们使用bitset,那么可以节省非常多的内存。

对于没有登陆的用户,我们也可以使用哈希算法,把对应的用户标识哈希成一个数字id。bitset非常的节省内存,假设有1亿个用户,也只需要100000000/8/1024/1024约等于12兆内存。

如何用 Redis 统计用户访问量?_Redis_02

Redis已经为我们提供了SETBIT的方法,使用起来非常的方便,我们可以看看下面的例子。

我们在item页面可以不停地使用SETBIT命令,设置用户已经访问了该页面,也可以使用GETBIT的方法查询某个用户是否访问。最后我们通过BITCOUNT可以统计该网页每天的访问数量。

如何用 Redis 统计用户访问量?_Redis_03

优点: 占用内存更小,查询方便,可以指定查询某个用户,数据可能略有瑕疵,对于非登陆的用户,可能不同的key映射到同一个id,否则需要维护一个非登陆用户的映射,有额外的开销。

缺点: 如果用户非常的稀疏,那么占用的内存可能比方法一更大。

3、概率算法

对于拼多多这种多个页面都可能非常多访问量的网站,如果所需要的数量不用那么准确,可以使用概率算法。

事实上,我们对一个网站的UV的统计,1亿跟1亿零30万其实是差不多的。

在Redis中,已经封装了HyperLogLog算法,他是一种基数评估算法。这种算法的特征,一般都是数据不存具体的值,而是存用来计算概率的一些相关数据。

如何用 Redis 统计用户访问量?_Java_04

当用户访问网站的时候,我们可以使用PFADD命令,设置对应的命令,最后我们只要通过PFCOUNT就能顺利计算出最终的结果,因为这个只是一个概率算法,所以可能存在0.81%的误差。

优点: 占用内存极小,对于一个key,只需要12kb。对于拼多多这种超多用户的特别适用。

缺点: 查询指定用户的时候,可能会出错,毕竟存的不是具体的数据。总数也存在一定的误差。

上面就是常见的3种适用Redis统计网站用户访问数的方法了。

最后给大家分享一个Github仓库,上面有大彬整理的300多本经典的计算机书籍PDF,包括C语言、C++、Java、Python、前端、数据库、操作系统、计算机网络、数据结构和算法、机器学习、编程人生等,可以star一下,下次找书直接在上面搜索,仓库持续更新中~

Github地址:​​https://github.com/Tyson0314/java-books​

标签:Redis,用户,算法,内存,key,id,访问量
From: https://blog.51cto.com/u_13401476/5986857

相关文章

  • CTO也糊涂的常用术语:功能模块、业务架构、用户需求、文档
    功能模块、业务架构、需求分析、用户需求、系统分析、功能设计、详细设计、文档、业务、技术……很多被随口使用的名词,其实是含糊甚至错误的。到底含糊在哪里,错误在哪里,不仅......
  • CTO也糊涂的常用术语(01-04)用户需求、文档
    功能模块、业务架构、需求分析、用户需求、系统分析、功能设计、详细设计、文档、业务、技术……很多被随口使用的名词,其实是含糊甚至错误的。到底含糊在哪里,错误在哪里,不仅......
  • CTO也糊涂的常用术语(01-03)用户需求20180517更新
    功能模块、业务架构、需求分析、用户需求、系统分析、功能设计、详细设计、文档、业务、技术……很多被随口使用的名词,其实是含糊甚至错误的。到底含糊在哪里,错误在哪里,不仅......
  • CTO也糊涂的常用术语(01-03)功能模块、业务架构、用户需求
    功能模块、业务架构、需求分析、用户需求、系统分析、功能设计、详细设计、文档、业务、技术……很多被随口使用的名词,其实是含糊甚至错误的。到底含糊在哪里,错误在哪里,不仅......
  • redis常用命令之Hash
    redis常用命令之HashHash常用命令redis可以理解为一个全局的大字典,key就是数据的唯一标识符。对应的key不同,value也不同。redis有5个基本的数据类型。1redis={2......
  • 爬虫笔记【2】如何在爬虫中进行HTTP Basic Authentication所适合的用户名和密码认证?
       登陆网页前遇到的要求输入用户名和密码的程序,通常称为身份认证程序。HTTP认证可以保护一个作用域(成为一个realm)内的资源不受非法访问。当一个请求要......
  • 20230102用户生命周期模型
    一、目的用户生命周期本质是管理用户价值,基于用户生命周期制定策略提升用户在平台贡献的价值,价值主要体现:让新用户成长为成长用户,成长用户成长为成熟用户,不断提升每个......
  • redis集群切换ip
    问题描述根据应用服务日志显示"Noreachablenodeincluster"问题解决01、登录redis服务查看nodes信息clusternodes02、修改node.conf修改正确的主从依赖关系[webl......
  • 按用户重建索引
    --赋用户表空间分配权限ALTERUSERYBSH_BASEQUOTAUNLIMITEDONTS_YBSH_BASE; --查询已有索引select*fromuser_indexeswhereindex_name='INDX_REG_SI_ITEM3'......
  • redis的简单理解
       redis的作用1做缓存存储数据2做锁分布式锁3可以作为缓存数据库和计算等用途  redis的持久化方案RDB(默认) 和AOF rdb保存某个时间节点的全部快照 根......