Redis如何统计用户访问量

 更新时间:2023年07月14日 09:33:10   作者:一倾而尽  
这篇文章主要介绍了Redis如何统计用户访问量问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Redis统计用户访问量

1. 使用Hash

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

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

当要访问一个网站某一天的访问量时,就可以直接使用HLEN来获取结果;

优点:简单,易实现.查询方便,并且数据精准性非常好.

缺点:内存占用过大.随着key的增多,性能会随之下降.无法支撑大规模的访问量.

2. 使用Bitset

对于个int型的数来说,若用来记录id,则只能记录一个,而若转换为二进制存储,则可以表示32个,空间的利用率提升了32倍.对于海量数据的处理,这样的存储方式会节省很多内存空间.对于未登陆的用户,可以使用Hash算法,把对应的用户标识哈希为一个数字id.对于一亿个数据来说,我们也只需要1000000000/8/1024/1024大约12M空间左右.

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

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

缺点:如果用户过于稀疏,则占用的内存可能比第一个方法更大

3. 使用概率算法

对于一个网站页面若访问量非常大的话,如果要求的数量不是很高,可以考虑使用概率算法。

在Redis中,已经对HyperLogLog算法做了封装,这是一种基数评估算法:不存储具体数值,只是存储用来计算概率的一些相关数据。

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

优点:占用内存极小,对于一个key,只需要12kb。对于超大规模数据访问量的网站效率极高

缺点:查询指定用户的时候,可能会出错。在总数统计时也不一定十分精准.

使用Redis做某个时间段在线数统计

一般有范围性的需求都可以使用 sorted set 实现。

sorted set 类型通常用于实现(排行榜,最新的xxx,延迟队列…)

实现

实现很简单,将用户的登录时间转换成时间戳作为权重即可。

假设用户1,3 在20220801号登录

zadd login 1659283200 1
zadd login 1659283200 3

假设用户2,3 在20220802号登录

zadd login 1659369600 2
zadd login 1659369600 3

假设用户4,在20220803号登录

zadd login 1659456000 4

统计20220801至20220802的在线用户数量

# ZCOUNT key min max
# 在线 3
zcount login 1659283200 1659369600

拓展:在上面的基础上统计连续两天都在线的用户及其最后登录时间

假设用户1,3 在20220801号登录

zadd login:20220801 1659283200 1
zadd login:20220801 1659283200 3

假设用户2,3 在20220802号登录

zadd login:20220802 1659369600 2
zadd login:20220802 1659369600 3

假设用户4,在20220803号登录

zadd login:20220803 1659456000 4

统计20220801,20220802 两天都登录的用户及其最后登录时间

# 将两个交集保存至 result:20220801:20220802
# aggregate max 保留最大的权重(即最后登录时间)
# 不使用 aggregate max,权重会累加
zinterstore result:20220801:20220802 2 login:20220801 login:20220802 aggregate max
# 展示数据
zrange result:20220801:20220802 0 -1 withscores

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 关于Redis的读写一致问题

    关于Redis的读写一致问题

    在项目使用Redis过程中,当数据更新时,我们要保证缓存和数据库的一致性,否则会导致很多脏数据出现,此时我们就要思考如何去进行数据更新,本文就给大家讲讲关于redis的读写一致问题,需要的朋友可以参考下
    2023-08-08
  • Redis数据库中实现分布式锁的方法

    Redis数据库中实现分布式锁的方法

    这篇文章主要介绍了Redis数据库中实现分布式锁的方法,Redis是一个高性能的主存式数据库,需要的朋友可以参考下
    2015-06-06
  • Redis过期时间的设计与实现代码

    Redis过期时间的设计与实现代码

    在 Redis 中,键的过期时间设计与实现是一个重要的功能,这使得 Redis 可以自动删除在指定时间后不再需要的键,下面详细介绍 Redis 过期时间的设计和实现,包括设置过期时间、过期键的存储结构、过期键的删除策略等,需要的朋友可以参考下
    2024-08-08
  • 详解三分钟快速搭建分布式高可用的Redis集群

    详解三分钟快速搭建分布式高可用的Redis集群

    这篇文章主要介绍了详解三分钟快速搭建分布式高可用的Redis集群,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • redis yml配置的用法小结

    redis yml配置的用法小结

    RedisYML配置是Redis的一种配置文件格式,,对Redis的配置进行统一管理,本文就来介绍了redis yml配置的用法小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • redis主从+哨兵搭建的实现示例

    redis主从+哨兵搭建的实现示例

    本文主要介绍了redis主从+哨兵搭建的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • Redis缓存数据库表(列单独缓存)的示例代码

    Redis缓存数据库表(列单独缓存)的示例代码

    在Redis中缓存数据库表数据,而不使用JSON结构来表示value,通常意味着我们会将数据库表的每一行数据映射为Redis中的一个或多个键值对,这篇文章主要介绍了Redis缓存数据库表(列单独缓存),需要的朋友可以参考下
    2024-03-03
  • Redis序列化设置以及jetcache连接Redis序列化的设置过程

    Redis序列化设置以及jetcache连接Redis序列化的设置过程

    这篇文章主要介绍了Redis序列化设置以及jetcache连接Redis序列化的设置过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • SpringBoot读写Redis客户端并实现Jedis技术切换功能

    SpringBoot读写Redis客户端并实现Jedis技术切换功能

    这篇文章主要介绍了SpringBoot读写Redis客户端并实现技术切换功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • 深入理解 Redis Template及4种序列化方式

    深入理解 Redis Template及4种序列化方式

    这篇文章主要介绍了深入理解 Redis Template及4种序列化方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论