Redis数据类型:有序集合与基数统计

目录

有序集合

ZADD和ZREM

基数统计

HyperLogLog


      前面说的无序集合类型,特点是里面存放的对象都是唯一的,无需的,使用无序集合的场景通常是集合的交并差运算,或者检查某个对象是否在集合中。除了无序集合外,集合set还有有序集合类型,集合的对象唯一特点可以用来做计数,但是还有更节省内存消耗的数据结构可以使用,这篇日志就来总结有序集合,基数统计和Geo这三种数据类型。

 

有序集合

ZADD和ZREM

      首先是有序集合,顾名思义集合中存放的对象都是有序排列的,那么按照什么样的方式排列呢?在有序集合里面每一个对象都有一个“权重”,或者说是分数,我们可以用命令对这些对象的权重进行加法和减法,然后用不同命令将它们升序或降序输出:

      创建/添加一个有序集合使用的命令的ZADD,如上图所示,创建MusicList为里面添加歌曲数据,并为每一个元素设置一个权值,完成后我们就可以用ZREVRANGE命令降序输出集合中的元素或ZRANGE命令升序输出,这两条命令中参数0,-1表示的是输出范围,0到-1即输出全部元素,这个前面的日志里讲过,WITHSCORES参数是可选参数,表示输出时带上元素的权值。有添加就有删除,对有序集合的删除命令有三种,直接删除某一对象、按排名范围删除和按权值范围删除:

      第一种删除命令是ZREM,后面直接指定需要删除的集合key中的对象,第二种删除命令是ZREMRANGEBYRANK,从命令可以看出是按照排名范围来删除,如上图所示,第一次ZREMRANGEBYRANK时,指定范围-2到-1,即按降序删除前两个元素,还记得前面讲列表时说过,从左到右下标从0开始,从右到左下标从-1开始。两条命令删除完成后列表中没有了分数最高的前三个元素。接着删除列表中0到1范围内元素,即按升序删除前集合中的两个,最后剩下一个“song_4”,也就是说,ZREMRANGEBYRANK命令指定的范围参数如果是整数,就是按升序排列进行删除,如果范围参数是负数,即按降序排列进行删除。

      第三种有序集合删除命令是ZREMRANGEBYSCORE,按分数范围删除列表中的元素:

      命令的两个参数可以设置要删除的分数范围,例如删除权重在30到70之间的元素。增加和删除操作完成,如果想查看集合里的某一个元素,可以用ZREVRANK命令查看具体元素的排名和ZSCORE命令查看具体元素的权重。

 

基数统计

      基数统计是常见的场景,例如网站对每一个用户一星期内或一个月内登陆次数的统计,基数是一个集合中出现的不同的值的数量,例如一个集合a={1,2,3,4,5},集合a里面的基数就是5,b={1,2,2,3,4,5}集合中虽然有6个数,但是其中2重复了,所以基数还是5,所以说基数统计做的是唯一计数,基数统计中出现了多次的数也只会被算作一次。既然是唯一计数,那么可以用前面的有序集合来做统计任务,如果用ZADD命令向有序集合中添加已存在键的元素,则会覆盖掉旧的对象,实现更新值的操作。但是,如果数据量十分大的话,就要考虑内存消耗的问题了,Redis提供了一种数据结构HyperLogLog给我们做基数统计,且在内存消耗上比起用集合有很大的优化。

HyperLogLog

       使用HyperLogLog数据结构的优点是即时存储的元素数量很大很大,在计算基数时消耗的空间总是固定的,实现原理是通过牺牲准确率的方式来减少空间消耗,每个HyperLogLog键消耗的内存为12KB,标准偏差为0.81%,算法原理大家可以上网查看,所以HyperLogLog适合用在如网站统计用户月均在线量这类对统计精度要求不高的场景。

      创建/添加一个HyperLogLog使用的命令是PFADD,和前面大多数的ADD命令一样,如果参数键不存在,则会先创建一个空的HyperLogLog。往里面添加完元素后,使用PFCOUNT可以输出得到基数的近似值,注意这是一个近似值,正如前面说的标准偏差是0.81%,PFCOUNT命令执行成功后,会将这个近似基数值缓存,等下次执行PFADD命令后,如果近似基数发生了变化,就会返回1,否则,直接使用旧的近似基数,并返回0。如果我们有多个HyperLogLog,例如是多张用户列表,想要统计它们的基数综合,可以用PFMERGE命令将多个HyperLogLog合并在一起,然后输出基数总和,这个基数是它们的并集,并且也是一个近似值,近似于所有合并的HyperLogLog基数总和。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值