• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Redis高级数据类型Hyperloglog、Bitmap的使用

    前言

    很多小伙伴在面试中都会被问道 Redis的常用数据结构有哪些?

    可能很大一部分回答都是 string、hash、list、set、zset。当然啦,这个答案肯定是没有错的,但是相信这个答案,面试官已经听的耳朵都起茧了。

    本身我们选择的这个行业竞争就极强,学历拼不过难道还要知识都拼不过吗???

    希望进来的小伙伴能好好看完这篇文章,也希望你以后的回答能是 常用的数据结构有string、hash、list、set、zset,但我平时可能还会用到 Hyperloglog和Bitmap。相信面试官听到你的回答,会有眼前一亮的感觉!

    话不多说,开始吧,⬇

    Hyperloglog

    Hyperloglog简介

    HyperLogLog是一种概率数据结构,用来估算数据的基数。

    基数:可简单理解为集合中不同元素的个数,也可以理解为Set
    对于一个集合 1、2、3、4,那么它的基数为 4
    对于一个集合 1、2、3、4、1,那么它的基数也是 4

    Hyperloglog作用

    我们可以使用它来统计 UV。

    UV即:UniqueVisitor,UV指的是独立访客的数量,一台电脑被视为一个独立访客。一台电脑早上访问了一次,下午又访问了一次,两次访问的都是同一个网站,只能被计算一次。

    那可能有小伙伴问了,及刚才都说了可以理解为一个Set,那我为什么要用它来统计UV?

    Redis 的 HyperLogLog 通过牺牲准确率来减少内存空间的消耗,只需要12K内存,在标准误差0.81%的前提下,能够统计2^64个数据。而Set就需要消耗大量空间
    所以 HyperLogLog 是否适合在比如统计区间活跃度这样对精度要求不高的场景。

    为什么能这么存储,主要依赖于伯努利试验,各位小伙伴可以去百度了解了解。

    命令行中的使用


    SpringBoot中的使用

    @Test
    public void testHyperloglog() {
    
        String key = "language";
    
        for (int i = 1; i = 10000; i++) {
            redisTemplate.opsForHyperLogLog().add(key,i);
        }
    
        for (int i = 5000; i = 15000; i++) {
            redisTemplate.opsForHyperLogLog().add(key,i);
        }
    
        for (int i = 10000; i = 20000; i++) {
            redisTemplate.opsForHyperLogLog().add(key,i);
        }
    
        long size = redisTemplate.opsForHyperLogLog().size(key);
        System.out.println(size);
    }
    


    可以看到结果值为:19891与真实值:20000相差不了多少,虽说有误差,但相比于set已经是很好了!

    除此之外,在SpringBoot中还可以对多个key进行合并,统计合并之后的数据量

    @Test
    public void testHyperloglog() {
    
        String key1 = "language1";
        String key2 = "language2";
        String key3 = "language3";
        String unionKey = "language";
    
    
        for (int i = 1; i = 10000; i++) {
            redisTemplate.opsForHyperLogLog().add(key1,i);
        }
    
        for (int i = 5000; i = 15000; i++) {
            redisTemplate.opsForHyperLogLog().add(key2,i);
        }
    
        for (int i = 10000; i = 20000; i++) {
            redisTemplate.opsForHyperLogLog().add(key3,i);
        }
    
        redisTemplate.opsForHyperLogLog().union(unionKey,key1,key2,key3);
    
        long size = redisTemplate.opsForHyperLogLog().size(unionKey);
        System.out.println(size);
    }
    


    可见,数据还是19891

    Bitmap

    Bitmap简介

    位图不是特殊的数据结构,它其实就是普通的字符串,也就是 byte 数组(有了解布隆过滤器的小伙伴可展开联想一下)

    通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。

    位操作分为两组:

    位图的最大优点之一是,在存储信息时,它们通常可以节省大量空间。例如,在以增量用户ID表示不同用户的系统中,仅使用512 MB内存就可以记住40亿用户的一位信息

    Bitmap作用

    使用场景

    我们可以使用它来统计 DAU。

    日均活跃用户数量(Daily Active User,DAU)是用于反映网站、互联网应用或网络游戏的运营情况的统计指标。日活跃用户数量通常统计一日(统计日)之内,登录或使用了某个产品的用户数(去除重复登录的用户)。

    命令行使用Bitmap

    使用 setbit 和 getbit 命令设置和检索位:

    在位组上还有以下三个命令:

    SpringBoot使用Bitmap

    @Test
    public void testBitmap() {
    
        String key = "bitmap";
    
        redisTemplate.opsForValue().setBit(key,1,true);
        redisTemplate.opsForValue().setBit(key,4,true);
        redisTemplate.opsForValue().setBit(key,2,true);
        redisTemplate.opsForValue().setBit(key,5,true);
    
        System.out.println(redisTemplate.opsForValue().getBit(key,2));
        System.out.println(redisTemplate.opsForValue().getBit(key,3));
        System.out.println(redisTemplate.opsForValue().getBit(key,5));
    
    }
    

    尾言

    到此这篇关于Redis高级数据类型Hyperloglog、Bitmap的使用的文章就介绍到这了,更多相关Redis Hyperloglog、Bitmap内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • redis的五大数据类型应用场景分析
    • 浅谈Redis存储数据类型及存取值方法
    • Redis六大数据类型使用方法详解
    • Redis常用数据类型命令实例汇总
    • 详解Redis 数据类型
    • 详解Redis数据类型实现原理
    上一篇:redis实现排行榜功能
    下一篇:详解Redis瘦身指南
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Redis高级数据类型Hyperloglog、Bitmap的使用 Redis,高级,数据,类型,Hyperloglog,