专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

给你一个亿的keys,redis如何统计?

  不知你大规模的用过Redis吗?还是仅仅作为缓存的工具了?在Redis中使用最多的就是集合了,举个例子,如下场景:签到系统中,一天对应一系列的用户签到记录。电商系统中,一个商品对应一系列的评论。交友系统中,某个用户的一系列的好友。
  Redis中集合的特点无非是一个Key对应一系列的数据,但是数据的作用往往是为了统计的,比如:交友系统中,需要统计每天的新增好友,以及双方的共同好友。电商系统中,需要统计评论列表中的最新评论。签到系统中,需要统计连续一个月的签到的用户数量。
  大型互联网应用中,数据量是巨大的,少说百万,千万,甚至是一个亿,比如电商巨头淘宝,交友巨头微信、微博;办公巨头钉钉等,哪一个的用户不是上亿?
  只有针对不同场景,选择合适的集合,统计才能更方便。聚合统计
  聚合统计指的是多个元素聚合的结果,比如统计多个集合的交集、并集、差集
  在你需要对多个集合做聚合统计的时候,Set集合是个不错的选择,除了其中无重复的数据外,Redis还提供了对应的API交集
  在上述的例子中交友系统中统计双方的共同好友正是聚合统计中的交集。
  在Redis中可以userid作为key,好友的userid作为value,如下图:
  统计两个用户的共同好友只需要两个Set集合的交集,命令如下;SINTERSTOREuserid:newuserid:20002userid:20003
  上述命令运行完成后,userid:new这个key中存储的将是userid:20002、userid:20003两个集合的交集。差集
  举个例子:假设交友系统中需要统计每日新增的好友,此时就需要对临近两天的好友集合取差集了,比如2020111日的好友是set1,2020112日的好友是set2,此时只需要对set1和set2做差集。
  此时的结构应该如何设计呢?如下图:
  userid:20201101这个key记录了userid用户的2020111日的好友集合。
  差集很简单,只需要执行SDIFFSTORE命令,如下:SDIFFSTOREuser:newuserid:20201102userid:20201101
  执行完毕,此时的user:new这集合将是2020112日新增的好友。
  这里还有一个更贴切的例子,微博上有个可能认识的人功能,可以使用差集,即是你朋友的好友减去你们共同的好友即是可能认识的人。并集
  还是差集的那个例子,假设需要统计20201101和2020112总共新增的好友,此时只需要对这两日新增好友的集合做一个并集。命令如下:SUNIONSTOREuserid:newuserid:20201102userid:20201101
  此时新的集合userid:new则是两日新增的好友。总结
  Set集合的交差并的计算复杂度很高,如果数据量很大的情况下,可能会造成Redis的阻塞。
  那么如何规避阻塞呢?建议如下:在Redis集群中选一个从库专门负责聚合统计,这样就不会阻塞主库和其他的从库了将数据交给客户端,由客户端进行聚合统计。排序统计
  在一些电商网站中可以看到商品的评论总是最新的在上面,这个是怎么做的呢?
  最新评论列表包含了所有的评论,这就要集合对元素进行保序存储了。也就是说集合中的元素必须按序存储,称之为有序集合。
  Redis中的四种集合中List和SortedSet属于有序集合。
  但是List和SortedSet有何区别呢?到底使用哪一种呢?
  List是按照元素进入顺序进行排序,而SortedSet可以根据元素权重来排序。比如可以根据元素插入集合的时间确定权值,先插入的元素权重小,后插入的元素权重大。
  针对这一例子中,显然这两种都是能够满足要求的,List中分页查询命令LRANGE和SortedSet分页查询命令ZRANGEBYSCORE。
  但是就灵活性来说,List肯定不适合,List只能根据先后插入的顺序排序,但是大多数的场景中可能并不只是按照时间先后排序,可能还会按照一些特定的条件,此时SortedSet就很合适了,只需要根据独有的算法生成相应的权重即可。二值状态统计
  二值状态指的是取值0或者1两种;在签到打卡的场景中,只需要记录签到(1)和未签到(0)两种状态,这就是典型的二值状态统计。
  二值状态的统计可以使用Redis的扩展数据类型Bitmap,底层使用String类型实现,可以把它看成是一个bit数组。关于详细内容后续介绍。。。。。。。。。
  在签到统计中,0和1只占了一个bit,即使一年的签到数据才365个bit位。大大减少了存储空间。
  Bitmap提供了GETBITSETBIT操作,使用一个偏移值offset对bit数组的某一个bit位进行读和写。不过,需要注意的是,Bitmap的偏移量是从0开始算的,也就是说offset的最小值是0。当使用SETBIT对一个bit位进行写操作时,这个bit位会被设置为1。Bitmap还提供了BITCOUNT操作,用来统计这个bit数组中所有1的个数。
  键值如何设计呢?key可以是userid:yyyyMM,即是唯一id加上月份。假设员工id为10001,需要统计202011月份的签到打卡记录。
  第一步,执行命令设置值,假设11月2号打卡了,命令如下:SETBITuserid:10001:20201111
  BitMap是从下标0开始,因此2号则是下标为1,值设置为1则表示成功打卡了。
  第二步,检查该用户11月2号是否打卡了,命令如下:GETBITuserid:10001:2020111
  第三步,统计11月的打卡次数,命令如下:BITCOUNTuserid:10001:202011
  那么问题来了,需要统计你这个签到系统中连续20天的签到打卡的用户的总数,如何处理呢?假设用户一个亿。
  比如需要统计20201101到20201120天中连续打卡的人数,如何统计呢?
  Bitmap中还支持同时对多个BitMap按位做与、或、异或操作,命令如下图:
  思路来了,我们可以将每天的日期作为一个key,对应的BitMap存储一亿个用户当天的打卡情况。如下图:
  此时我们只需要对2020111到20201120号的Bitmap做按位与操作,最终得到的一个Bitmap中每个bit位置对应的值则代表连续20天打卡的情况,只有连续20天全部打卡,所在的bit位的值才为1。如下图:
  最终可以使用BITCOUNT命令进行统计。
  可以尝试计算下内存开销,每天使用1个1亿位的Bitmap,大约占12MB的内存(108810241024),20天的Bitmap的内存开销约为240MB,内存压力不算太大。不过,在实际应用时,最好对Bitmap设置过期时间,让Redis自动删除不再需要的签到记录,以节省内存开销。
  如果涉及到二值状态,比如用户是否存在,签到打卡,商品是否存在等情况可以使用Bitmap,可以有效的节省内存空间。基数统计
  基数统计指统计一个集合中不重复元素的个数。
  举个栗子:电商网站中通常需要统计每个网页的UV来确定权重,网页的UV肯定是需要去重的,在Redis类型中Set支持去重,第一时间肯定想到的是Set。
  但是这里有一个问题,Set底层使用的是哈希表和整数数组,如果一个网页的UV达到千万级别的话(一个电商网站中何止一个页面),那么对于内存的消耗极大。
  Redis提供了一个扩展类型HyperLogLog用于基数统计,计算264个元素大概只需要12KB的内存空间
  是不是很心动?但是HyperLogLog是存在误差的,大概是在0。81,如果需要精准的统计,还是需要使用Set。对于这种网页的UV来说,足够了。
  在统计网页UV的时候,只需要将用户的唯一id存入HyperLogLog中,如下:PFADDp1:uv10001100021000310004
  如果存在重复的元素,将会自动去重。
  统计也很简单,使用PFCOUNT命令,如下:PFCOUNTp1:uv总结
  本文介绍了统计的几种类型以及应该用什么集合存储,为了方便理解,作者将支持情况和优缺点汇总了一张表格,如下图:
  Set和SortedSet支持交集、并集的聚合运算,但是SortedSet不支差集运算。
  Bitmap也能对多个Bitmap做与、异或、或的聚合运算。
  List和SortedSet都支持排序统计,但是List是根据元素先后插入顺序排序,SortedSet支持权重,相对于List排序来说更加灵活。
  对于二值状态统计,判断某个元素是否存在等场景,建议使用Bitmap,节省的内存空间。
  对于基数统计,在大数据量、不要求精准的情况建议使用HyperLogLog,节省内存空间;对于精准的基数统计,最好还是使用Set集合。

连刷16集!根本停不下来想必大家最近都在追这部赵丽颖的新剧吧浙江卫视风吹半夏,不追的也耳熟。赵丽颖剧照就在刚刚更新的一集许半夏赵垒吻戏名场面上了微博热搜,其实并没有吻上,但是这氛围感,大家感受下看到现在,梁洛施李泽楷疑似复合,现身豪门聚会,李嘉诚财产又归谁呢?说起梁洛施,很多人都被她的美貌吸引,而李泽楷也并不例外,港圈富豪李嘉诚的儿子李泽楷如今五十多岁依然单身。虽然现在已经淡出银幕,但他的恋情消息依然是网友们关注的焦点。自从网传李泽楷和46岁舒淇穿薄纱裙好性感,大嘴笑起来真甜美,清纯的性感女神在香港娱乐圈的黄金时期,无数明星大腕涌现出来,天王天后,影帝影后,在那个港片黄金时代,也是竞争最激烈的时代,有很多女星为了能够更快地站稳脚跟,选择拍一些较为露骨的电影。她们渴望能够王者辅助的小心机你们有没有这种困扰?当你选了一个鲁大,然后对面不是狄仁杰就是虞姬或者是芈月,反正就是你拉不到的英雄,你这一整局都打得很憋屈。这个问题非常容易解决,是你这局游戏的打开方式不对,你看我如何解决阿尔比恩Online卡加载界面加载失败的问题在阿尔比恩Online游戏中准备战斗,在高风险高报酬的全拾取制战斗中,挑战其他冒险者来测试自我极限。从单挑战斗,小型队伍战斗到大规模团战,玩家都需要策略战术和技巧,才能作为胜者离开有着落了?AleFisherLeave疑似签约EDG除了我们LPL赛区之外,各大赛区的转会期似乎已经进入了尾声。以隔壁LCK赛区S12世界赛冠军DRX战队为例,该战队S13赛季的人员建构已经出炉RascalCrocoFATEdeok依托答辩Steam这款4A大作多半差评!赛博2077年度版23年发售Steam每日特惠NBA2K2355Steam售价199折后89。55(新史低)截止时间12月14日支持简体中文好评率64短评玩了后头不痛了,腰不酸了,就是心脏有点不怎么跳了这回有子时大睡,午时小憩,午睡也有大讲究午时阴长阳消,午睡一刻值千金,明朝太医刘纯说饭后小憩,以养精神。午睡对消除疲劳增进健康非常有益,是一项自我保健措施。尤其在夏天,日长夜短,晚上往往又很闷热,使人难以入睡,以致睡眠时气管炎有哪些表现?气管炎是常见的呼吸系统疾病,患病后会有很多症状表现,最典型的是排痰,还有咳嗽,有时候还会带血,在早晨晚上的时候会比较严重,不好好治疗很难痊愈,患者还会有咳喘胸闷等的症状,都会影响健塔猜亚争黑绝杀小特,奥康纳横扫中国三人大胜沃顿,苏赛4强出炉北京时间12月3日凌晨,苏格兰公开赛四场8强赛战罢,进攻型选手大获全胜,进攻就是最好的防守,体现得淋漓尽致,下面,小潼娓娓道来,大家洗耳恭听先说特鲁姆普和塔猜亚之对决,两人历史交手礼遇中国梁丽莎FashionlishaLiang一听到粱丽莎这个名字,是不是觉得特别洋气?对,没错的!人如其名,她是中俄混血,身上流淌着14的俄罗斯血统。粱丽莎,90后,祖籍新疆,随父辈定居广西
美国传来坏消息,战机迫降夏威夷磕头,台岛下令彻查事故原因美国洛克希德马丁公司最近交付了第800架F35闪电II战斗机,其实同时还在进行F16战隼战斗机的建造工作,如今美国建造的F16战斗机都是用于出口,因为美国空军很早就停止采购F16C河南核酸亭调查(图片来源经济观察网记者陈月芹)经济观察网记者陈月芹张英张雅楠一台用于核酸检测采样的亭子,在河南被卖到了4。68万元。该省计划在全省布置类似的亭子1。4万个。按照已公开采购平均价测18分钟丢2球!广州队接连送礼手球漏人,中超标王世界波6月7日,中超第2轮大连赛区,升班马武汉三镇VS广州队。第11分钟第29分钟,武汉三镇连进2球!中超标王斯坦丘世界波斩获首球,200万欧元先生戴维森连场破门。在武汉三镇强大的攻势下刚刚,全国高考作文题出炉看完直呼,还好我们已经毕业了又是一年高考时,今年有1193万人,参加高考。这个数字接近于杭州市(1200万),全市的人口数量。又是一年厮杀,又是一年决定命运的时刻。高考两个字,在国人心中有着无可替代的分量。对90后辽宁小伙,多次国内相亲失败后,娶00后尼泊尔女孩倒赚8000块婚姻到底该由什么作为基础?彩礼?车房?家庭背景?或许小姜和阿优莎小姜阿优莎的故事可以告诉你答案!(小姜和阿优莎结婚时的照片)失望爱情本不应该用钱来衡量来自辽宁抚顺的小姜从小生活在淳娃的逆商要趁早培养,错过将影响孩子一生,家长都应该看看前段时间网上一段视频火了,引发了许多家长对培养孩子逆商的思考。视频内容是这样的商场做活动向小朋友们分发气球,但是有个小女孩没有发到,但是她又很想要那个气球,就支支吾吾让妈妈去跟发气期待!国米中场升级计划锁定三大目标,若真能搞定实力冠绝意甲由于众所周知的原因,国米在今夏依旧受困于财务危机,并且张康阳主席还要求俱乐部制服组的大佬们,要在转会市场上盈利至少6000万欧元,来缓解球队的压力。面对如此困难的局面,蓝黑军团的补离婚7个月后,再看大S的婚姻,才明白离婚是最好的选择赶在5月的最后一天,汪小菲让狗仔们完成了月底的KPI。面对狗仔小葛一条条石锤,他态度立马一百八十度大转弯。前天还在爆料大s服用违禁药品,第二天一口一个熙媛亲昵的道歉。在整场闹剧中,海贼王1052话,时间线离奇推进一周,象主跑路,大和送福利大家好,我是小蜘蛛。海贼王最新一话的情报已经进行了更新,最新一话的情报时间跨度就有些夸张了,一下子就是一周的时间进展。上一话的剧情当中内容就没有什么实质性的进展而,而这一话似乎也是张鹭狂赞林采民!李章洙亚历山德里尼身体有小不适,球队缺中锋中超联赛第一阶段第二轮,梅州赛区召开赛前新闻发布会,天津津门虎将与深圳队打响对决。津门虎主教练于根伟携球员杨帆出席发布会,深圳队主教练李章洙携球员张鹭出席发布会。李章洙首先介绍了深桑德斯马内并不想离开利物浦,他只是想向俱乐部施压直播吧6月7日讯前利物浦球员迪恩桑德斯接受了媒体的采访,谈及马内想离开利物浦加盟拜仁的传闻,桑德斯认为事情并不像外界猜测的那样。桑德斯对记者说道我认为马内并不想离开利物浦,他只是想
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网