范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

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

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

饰演张学良被拒绝2017年,张迪准备拍摄少帅时,打算让文章出现,但张学良84岁的儿子当场发火。他说文章人品有问题,就让他演自己的英雄父亲吧。这不是毁了他父亲的名声吗?但张莉不为所动。他一直强调文章大猿魂56,无上祖师决定讨伐阿修罗族,这下好看了本文要说的是漫画大猿魂第56话的内容,首先回顾一下上一话的剧情,古龙那加被无上祖师斩杀,众龙看到了这一幕,然后无上祖师让龙族归顺。在第56话的内容中龙族召开了会议,讨论是否归顺无上女孩是怎么把仙女管插入体内的?提醒别盲目效仿俗话说爱美是女人的天性,现实生活中很多女性朋友在变美这方面也付出了很大的努力,随着人们思想的转变,人们对于美丽的追求也发生了很大的变化,可能早在过去的时候美丽就是高颜值,而现在美丽刚刚宣布暂停交易!又一平台爆雷中国基金报记者李智继AEXHOO等交易所相继暴雷后,加密交易平台Hotbit也传来噩耗,宣布暂停存取款交易功能。自7月底以来,Hotbit多位高级管理人员已被执法部门传唤,部分资金与凤行牛!剧还在拍,微博电视剧热聊榜就已经到第5名了最近上映的电视剧挺多的,大家看的也是不亦乐乎,微博热聊榜也是实时更新数据,与凤行算是一个例外了,2022年5月份剧组发出了海报,确认了主演人员,现在人家剧组还在拍呢,微博网友们已经新五美高能首秀!欢乐颂3首播便上演联合擒狼戏码回顾欢乐颂的前两部,22楼的女孩子们就一直在困境中守望相助,彼此声援鼓励。五美被困电梯,个个吓得花容失色。只有安迪最为冷静,迅速帮大家稳定情绪,保持体力平稳呼吸。成功脱险后,樊胜美蔡英文下令全党挺林智坚赵少康讽她真把自己当成神了据中评社报道台湾大学9日宣布民进党桃园市长参选人林智坚的硕士论文抄袭情节严重撤销硕士学位,但蔡英文昨定调请全党团结支持林捍卫清白。中国国民党战斗蓝发起人中广董事长赵少康今天痛批蔡,好男人于晓光,屡次出轨改写自己的结局,再也不是国民老公了爱情要用忠诚播种,友谊要用谅解护理。米南德在恋爱婚姻关系中,忠诚是桥梁,是影响二人关系至关重要的因素,即使双方一见钟情,彼此都很优秀,实力地位势均力敌,可当一段关系中,失去了忠诚,江疏影主演欢乐颂3今晚全新放颂,五美大换血,还能创造出第一部的战绩吗?欢乐颂3五美全员大洗牌,演员换成了江疏影杨采钰张佳宁张慧雯李浩菲,讲述五个女孩的故事,这五个女孩分别是从事生命科学研究工作的叶蓁蓁(江疏影饰)神秘冷艳的公司人事方芷衡(杨采钰饰)以什么是夫妻?什么是情人?这就是最好的回答前段时间,在知乎上刷到一个热门话题爱人和情人,本质区别是什么?网友简小妮给出了高赞回答情人更多的是情的部分,这个情往往只追求快乐,不求责任和付出。爱人是在情的基础上,建立了进一步的镜头里的战争俄乌冲突第168天希望用照片记录历史,让光影留住点滴让眼睛判断对错,让战争永远远离。2022年8月10日激射哈尔科夫,一名乌克兰军人在前线的炮位上操纵ZU232高射炮射击,照片源自REUTERS路透
南京明城墙下有琵琶湖和琵琶洲,在紫金山索道下方秋冬季节,南京的晴朗午后时光,很适合沿着明城墙走一走。在城墙根下找一个静谧的游园,岂不悠哉悠哉美哉美哉。琵琶湖就是不错的去处,乘坐南京地铁2号线,到明故宫站出站。可以沿着明城墙经过子宫腺肌症导致的痛经怎么办?子宫腺肌症导致的痛经怎么办?痛经是大多每个女性朋友都难以忍受的痛苦,而一些女性还没有听说过子宫腺肌症,其实大多女性之所以有继发性痛经,主要是因为自己有子宫腺肌症疾病,这种病症会导致太神奇了,阿根廷的输球却变成国足的更名之战!国足威名不是盖的花钱最多的世界杯是越来越让人看不懂了!无缘参加世界杯的国家队人没去却又被推到了风口浪尖,引起多人的想念!真的是名声在外,不火也难啊!先是卡塔尔打破主办国不败神话,又有卫冕冠军阿根廷孕期多做3项运动,保持好身材促进生产,效果比你想象中好嗨,我是小清,点击上方关注,定期为你分享育儿干货。在某一个平台上看到一个热议话题是关于孕期一定要积极运动吗?有的长辈看到自己的儿媳妇怀孕很紧张,特别是怀孕期间,看到儿媳妇在做运动,世界杯的亚洲定律,相当神奇这届世界杯,你看懂了吗?本届世界杯,到目前为止,已有20支国家球队,打完了小组赛的前10场比赛。而这10场比赛中,超过3球的仅有4场比赛,其他6场比赛最多才有2个进球,更有3场打出法国队官方卢卡斯埃尔南德斯十字韧带断裂,告别本届世界杯北京时间11月23日上午,法国队宣布了一则令人遗憾的消息,球队主力左后卫卢卡斯埃尔南德斯的伤情确认为右膝十字韧带断裂,他将不得不放弃本届世界杯的剩余比赛。法国队表示,全队都祝福卢卡金价回暖,黄金牛市真的到来了?导语尽管美联储官员接连发表鹰派言论打压黄金,但国际金价依然维持在1750美元盎司的高位阶段,国内金价也徘徊在405元克左右。壹近期,美国圣路易斯联储主席布拉德表示,经过一系列的专业登上央视的手机品牌!搭载骁龙8售价2。38万,华为苹果都甘拜下风登上央视的手机品牌!搭载骁龙8售价2。38万,华为苹果都甘拜下风这应该是我第一次听说的品牌VERTU。稍微bai度了一下,定位是老牌奢侈手机,和曾经的8848手机定位相同。该机型最逆转完胜!无与伦比的过程,日本队,太让人羡慕了日本队2比1击败了德国队。这是世界杯第四比赛日发生的故事,不可思议又令人惊叹。如果说一天之前,沙特2比1爆冷逆转阿根廷还带着点运气的成分,日本2比1逆转德国,就过程而言更加无与伦比22分4板4助3断!加盟76人大放异彩,费城这笔交易果然大获成功了费城76人队最近遭遇了伤病的侵蚀,恩比德哈登马克西三位核心巨头全部都要因伤缺席。哈登要在12月初才能复出,老里弗斯透露最新情况,恩比德和哈登可能会一起复出。看来,未来几场比赛,76上了年纪要懂得忌口,建议中老年人这4种食物能不吃就别吃俗话说岁月是把杀猪刀,随着年龄的增长,我们的容颜开始衰老,身体各项机能也开始下降,尤其是年过60岁,体能抵抗力明显不如从前,吃饭胃口差,走路没有劲,一些小毛病也层出不穷。都说生命在