常见数据统计类型
我们常见的数据统计类型一共有以下几种:
- 聚合:求两个集合之间的交、并、差等。
- 排序:字面意思XD。
- 二值状态:只有两种值的状态,比如说某天是否签到(已签到、未签到)
- 基数统计:统计一批数据中不重复元素的个数。比如某个网页的UV(unique visitor)
Redis数据类型选择
在进行数据统计的时候,我们应该根据自己的需求,同时考虑Redis数据增删拆改的性能以及内存的使用来选择合适的Redis数据类型。
Redis有五种基本数据类型:String,Set, Sorted Set, List, Hash。
还有两种扩展的数据类型:BitMap(底层数据结构和String一样的都是字节数组,redis额外支持了通过BitMap来操作字节中的位), HyperLogLog。
在进行数据统计的时候,String一半用不到,我们主要关注其他6中数据类型。
一般情况下,这6种数据类型与其适用的数据统计类型之间的关系如下:
注意事项
- List和SortedSet均支持排序。建议优先推荐使用Sorted Set。比如,在获取最新评论且分页的场景下,当我获取了第一页最新的5条评论之后,有其他用户添加了一条新评论,然后我选择了下一页去获取第二页的评论,之前显示的第一页评论中的最后一条评论,会显示为我第二页的第一条评论。如果使用Sorted Set,分页的起始范围,可以根据Sorted Set分值来设置,就会避免出现上述使用List时的问题。
- 数据的聚合统计,比如set的SINTER或SUNION等命令,当键值的数据量比较大的时候,执行所需要的时间也会比较长,会阻塞redis服务(redis是单线程的方式来处理所有客户端发送过来的命令的),所以最好不要在Redis主从集群中的主服务器上执行数据的聚合统计,有三种规避方式:①将这些耗时较长阻塞redis服务的读操作指定到从服务器上执行,避免影响主服务器的写操作。②将聚合操作放到后台服务器端进行计算。③将统计用的数据存放到一个专用的redis实例中,和业务数据存放的redis实例分开来。
- 当使用Redis分片集群时要注意,多个key可能分布在不同的redis实例上,对这些key进行聚合统计的时候会之间报错或者失败,这是Redis分片集群的一个坑。
- HyperLogLog并不能精确统计基数,它的统计规则是基于概率的,所以统计结果是有一定误差的。如果对于数据精度要求不高,且需要统计的数据两很大的话,那就用HyperLogLog吧,12KB的内存就可以计算接近2^64个元素的基数。