聚合统计
建议使用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