首页 > 数据库 >怎么使用redis来统计一个网站的用户访问数

怎么使用redis来统计一个网站的用户访问数

时间:2023-01-02 23:15:01浏览次数:43  
标签:redis 用户 访问 算法 内存 key 使用 id

使用Hash

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

当一个用户访问的时候,如果用户登陆过,那么我们就使用用户的id,如果用户没有登陆过,那么我们也能够前端页面随机生成一个key用来标识用户,当用户访问的时候,我们可以使用HSET命令,key可以选择URI与对应的日期进行拼凑,field可以使用用户的id或者随机标识,value可以简单设置为1。

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

 

 

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

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

使用Bitset

我们知道,对于一个32位的int,如果我们只用来记录id,那么只能够记录一个用户,但如果我们转成2进制,每位用来表示一个用户,那么我们就能够一口气表示32个用户,空间节省了32倍!对于有大量数据的场景,如果我们使用bitset,那么,可以节省非常多的内存。对于没有登陆的用户,我们也可以使用哈希算法,把对应的用户标识哈希成一个数字id。bitset非常的节省内存,假设有1亿个用户,也只需要100000000/8/1024/1024约等于12兆内存。

 

Redis已经为我们提供了SETBIT的方法,使用起来非常的方便,我们可以看看下面的例子,我们在item页面可以不停地使用SETBIT命令,设置用户已经访问了该页面,也可以使用GETBIT的方法查询某个用户是否访问。最后我们通过BITCOUNT可以统计该网页每天的访问数量

 

 

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

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

 

使用概率算法

对于拼多多这种多个页面都可能非常多访问量的网站,如果所需要的数量不用那么准确,可以使用概率算法,事实上,我们对一个网站的UV的统计,1亿跟1亿零30万其实是差不多的。在Redis中,已经封装了HyperLogLog算法,他是一种基数评估算法。这种算法的特征,一般都是数据不存具体的值,而是存用来计算概率的一些相关数据。

 

 

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

 

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

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

 

标签:redis,用户,访问,算法,内存,key,使用,id
From: https://www.cnblogs.com/nanyu/p/17020794.html

相关文章

  • spring redis 注解开发 单片机 集群 主从复制
    失败记录,虽然最终没有成功,但是原理还是知道的 1、springreids简单实现注解 1、导入相应依赖 <dependency><groupId>redis.clients</groupId>jedis<......
  • 用户级线程
    线程切换:不切换映射关系,不切换资源,只切换执行的指令顺序。线程保留了并发的优点,避免了进程切换的代价。进程切换:指令切换+资源切换(映射表的切换)线程切换:指令切换,不切换资......
  • Docker配置redis相关
    三主三从配置---首先要保证dockerqidongsystemctlstartdocker---拉取redis镜像dockerpullredis:6.0.8---运行redis实例dockerrun-d--nameredis-node-1--nethost-......
  • redis之登录模块的开发
    UserHolder此类封装了ThreadLocal保证了线程安全packagecom.hmdp.utils;importcom.hmdp.dto.UserDTO;publicclassUserHolder{privatestaticfinalThre......
  • Redis RDB 与AOF
    参考书籍《Redis设计与实现》一丶为什么redis需要持久化redis作为一个内存数据库,如果不想办法将存储在内存中的数据,保存到磁盘中,那么一旦服务器进程退出,那么redis数据......
  • redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resourc
    超时Exceptioninthread"main"redis.clients.jedis.exceptions.JedisConnectionException:java.net.SocketTimeoutException:Readtimedoutatredis.clients.jedi......
  • Redis Clients Handling
    ThisdocumentprovidesinformationabouthowRedishandlesclientsfromthepointofviewofthenetworklayer:connections,timeouts,buffers,andothersimila......
  • Redis 中ZSET数据类型命令使用及对应场景总结
    转载请注明出处:目录1.zadd添加元素2.zrem从有序集合key中删除元素3.zscore返回有序集合key中元素member的分值4.zincrby为......
  • Win10多用户同时登陆
    1.说明:(1)Win服务器版默认是支持多用户登陆的,甚至可以在主机上用不同用户自己远程登陆自己,如windowserver2016。(2)Win10正常情况下是不允许用户同时远程的,即一个用户......
  • Redis的自增也能实现滑动窗口限流?
    限流是大家开发之路上一定会遇到的需求。比如:限制一定时间内,接口请求请求频率;一定时间内用户发言、评论次数等等,类似于滑动窗口算法。这里分享一份拿来即用的代码,一起看看......