前言
Hyperloglog
Hyperloglog简介
Hyperloglog作用
命令行中的使用
SpringBoot中的使用
Bitmap
Bitmap简介
Bitmap作用
命令行使用Bitmap
SpringBoot使用Bitmap
尾言
前言很多小伙伴在面试中都会被问道Redis的常用数据结构有哪些?
可能很大一部分回答都是string、hash、list、set、zset。当然啦,这个答案肯定是没有错的,但是相信这个答案,面试官已经听的耳朵都起茧了。
本身我们选择的这个行业竞争就极强,学历拼不过难道还要知识都拼不过吗???
希望进来的小伙伴能好好看完这篇文章,也希望你以后的回答能是常用的数据结构有string、hash、list、set、zset,但我平时可能还会用到Hyperloglog和Bitmap。相信面试官听到你的回答,会有眼前一亮的感觉!
话不多说,开始吧,?
HyperloglogHyperloglog简介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是否适合在比如统计区间活跃度这样对精度要求不高的场景。
为什么能这么存储,主要依赖于伯努利试验,各位小伙伴可以去百度了解了解。
命令行中的使用pfaddkey[element]:添加数据pfcountkey:统计数量在这里插入图片描述SpringBoot中的使用TestpublicvoidtestHyperloglog(){Stringkey="language";for(inti=1;i=;i++){redisTemplate.opsForHyperLogLog().add(key,i);}for(inti=;i=1;i++){redisTemplate.opsForHyperLogLog().add(key,i);}for(inti=;i=;i++){redisTemplate.opsForHyperLogLog().add(key,i);}longsize=redisTemplate.opsForHyperLogLog().size(key);System.out.println(size);}可以看到结果值为:与真实值:相差不了多少,虽说有误差,但相比于set已经是很好了!
除此之外,在SpringBoot中还可以对多个key进行合并,统计合并之后的数据量
TestpublicvoidtestHyperloglog(){Stringkey1="language1";Stringkey2="language2";Stringkey3="language3";StringunionKey="language";for(inti=1;i=;i++){redisTemplate.opsForHyperLogLog().add(key1,i);}for(inti=;i=1;i++){redisTemplate.opsForHyperLogLog().add(key2,i);}for(inti=;i=;i++){redisTemplate.opsForHyperLogLog().add(key3,i);}redisTemplate.opsForHyperLogLog().union(unionKey,key1,key2,key3);longsize=redisTemplate.opsForHyperLogLog().size(unionKey);System.out.println(size);}可见,数据还是
BitmapBitmap简介位图不是特殊的数据结构,它其实就是普通的字符串,也就是byte数组(有了解布隆过滤器的小伙伴可展开联想一下)
通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。
位操作分为两组:
固定时间的单个位操作(如将一个位设置为1或0或获取其值)对位组的操作,例如计算给定位范围内设置的位的数量(例如,人口计数)。位图的最大优点之一是,在存储信息时,它们通常可以节省大量空间。例如,在以增量用户ID表示不同用户的系统中,仅使用MB内存就可以记住40亿用户的一位信息
Bitmap作用使用场景
各种实时分析。存储与对象ID相关联的空间高效但高性能的布尔信息。我们可以使用它来统计DAU。
==日均活跃用户数量==(DailyActiveUser,DAU)是用于反映网站、互联网应用或网络游戏的运营情况的统计指标。日活跃用户数量通常统计一日(统计日)之内,登录或使用了某个产品的用户数(去除重复登录的用户)。
命令行使用Bitmap使用setbit和getbit命令设置和检索位:
setbit命令将位号作为其第一个参数,将其设置为1或0的值作为其第二个参数。如果所寻址的位超出当前字符串长度,则该命令将自动放大字符串。getbit只是返回指定索引处的位的值。超出范围的位(寻址超出存储在目标键中的字符串长度的位)始终被视为零。在这里插入图片描述在位组上还有以下三个命令:
bitop在不同的字符串之间执行按位运算。提供的运算为AND,OR,XOR和NOT。bitcount执行填充计数,报告设置为1的位数。bitpos查找具有指定值0或1的第一位。在这里插入图片描述SpringBoot使用BitmapTestpublicvoidtestBitmap(){Stringkey="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));}在这里插入图片描述尾言我是[Code皮皮虾],一个热爱分享知识的皮皮虾爱好者,未来的日子里会不断更新出对大家有益的博文,期待大家的