Redis统计操作

发布时间 2023-11-10 17:35:47作者: kiper

聚合统计

建议使用Set类型,但是以下命令时间复杂度均为O(N),数据量大时可能会有阻塞问题。

以user:id存储的用户id数据为例。

交集

统计8月4日相对于8月3日留存的用户。

SINTERSTORE user:id:rem user:id:20200803 user:id:20200804

并集

统计所有用户,将8月4日的用户并入总用户中。

SUNIONSTORE user:id user:id user:id:20200803

差集

统计8月4日新增用户。

SDIFFSTORE user:new user:id:20200804 user:id

排序统计

建议使用Sorted List或List。

面对稳定不变的数据,可以考虑使用List通过下标直接分页。插入数据会导致下标变化,分页可能会显示重复数据。

面对评论或者首页等频繁更新数据的场景,建议使用Sorted List,由于分数固定,通过ZRANGEBYSCORE命令可以避免分页期间的数据插入问题。

二值状态统计

集合状态只有0和1,常用于签到、心跳等统计。

建议使用Bitmap。底层实现为String类型,因为String类型是保存形式为二进制的字节数组。

统计某用户的月度签到或者年度签到情况,可以用31位或者365位的Bitmap即可。

  • SETBIT {key} {index}

    SETBIT uid:sign:3000:202008 2 1,表示用户id为3000的用户在20年8月3日已签到

  • GETBIT {key}

    GETBIT uid:sign:3000:202008 2

  • BITCOUNT

    BITCOUNT uid:sign:3000:202008

基数统计

需要统计的数据量很大时,建议HyperLogLog类型。
HyperLogLog计算基数所需的空间总是固定的12 KB,便可以计算接近 2^64 个元素的基数。
但是HyperLogLog的统计规则是基于概率完成的,所以它给出的统计结果是有一定误差的,标准误算率是 0.81%。

PFADD page1:uv user1 user2 user3 user4 user5
PFCOUNT page1:uv