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

给你一个亿的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集合。

潮声丨百万年薪聘导游浙江一座县城的千金买马记开化县主办的百万年薪聘导游活动。衢州市开化县向全国发出启事百万年薪招聘金牌导游。在乙类乙管后旅游业逐步复苏的大背景下,2月8日,这条新闻登上了微博全国热搜。旅游攻略种草遍地的时代,东北王张作霖做兽医时的绝招,让很多专家都望尘莫及在工业不发达的时代,畜力是国力的一个重要指标,比如牛马拉车耕地,马除了拉车耕地外,更多的是作为骑兵,没有战马的中原政权吃尽了苦头,最突出的就是宋朝,连块像样的养马地都没有。所以,历陆游抗金北伐的钢铁直男,一腔热血尽付诗文中公元1125年,中国的历史上发生了一些大事。首先是金太祖派兵攻打北宋首都汴京,但没有成功,金宋两国议和再次是如日中天的金国俘虏了逃亡中的辽国天祚帝,辽国灭亡最后便是伟大的爱国诗人陆聚焦实体经济,瞄准工业赛道徂汶景区3个重点项目集中开工14日上午,泰安市第一季度项目开工大比拼集中开工活动以主会场各县市区功能区分会场视频连线方式举行。在徂汶景区分会场,福星高端装备制造产业园项可乐犇犇绿色健康产业园项目汶河体育运动产防控政策优化,孕产妇如何应对奥密克戎病毒?目前流行的奥密克戎病毒呈现传播力强致病力弱轻症多重症少等特点。对此,孕产妇朋友既要严密防范感染,又要正确面对,保持乐观积极心态。孕产妇感染有何特点?孕产妇的感染率及其症状等都与普通绘本教授小学语文词语积累AABCABCCAABBAABABB七种形式绘本教授你的时间在哪里,孩子未来的方向就在哪里。013岁是孩子最富创造性阶段,很多成功人士都产生在这一阶段。你关注的老师,决定孩子看到的世界。叠词是汉语的一种特殊词汇现象,使用非常婆婆哭诉我看半年孙子,儿子买手机谢我儿媳都不愿意,直接摔了(原创作品,侵权必究)导语照顾月子带孩子是个累人的活,不但休息不好,疲惫,而且还容易跟儿媳产生矛盾,所以很多婆婆说起这个过程都是一肚子苦水,若想解决这个问题只能是双方理解。并且在双孩子如何在父母面前做自己?每天的生活,都是灵魂的精心创造你能真实面对你自己吗?今天的主题是在父母面前做自己。所谓做自己,就是你能勇敢表达你的感受,而不是流于表面的形式,不是只讲事情与道理。到底要如何做自己?后天癫痫是怎么产生的?看一看!你是哪一种?癫痫是一种比较常见的神经性疾病,发病原因非常的复杂,后天性的导致的大脑结构异常或代谢异常,可能局限性或弥漫性,静止或进展性的。后天癫痫是哪些原因引起的?癫痫引起的后天因素有以下几个童书推荐蜉蝣的一天A33A33每日童书刚散完步,突然想起这本由英国绘本大师托尼罗斯与著名童书作家珍妮威利斯合著的蜉蝣的一天,书中用诗的语言和美妙的画面,分享给孩子关于生命的奥秘。蜉蝣的生命只有一天时间,但市场内卷殃及苹果?iPhone14全系降价,2023换机思路来了尽管距离年中618电商大促还有四个月,但手机厂商们似乎都等不及给自己的手机降价促销了。其中最引人注意的当然是苹果,竟然对iPhone14系列带来全系降价的福利。更重要的是相比标准版
PlayStation2023游戏阵容大盘点好多PS5独占新年新气象,老基德在这给大家拜年啦!祝大家兔年大吉,学生党成绩兔飞猛进,上班族工资兔破重围,另外祝玩家朋友们兔年游戏史低入手,本期给大家带来的是PlayStation2023年游戏99投资者必看的兔年投资秘籍文36氪财经全体封面来源视觉中国今年的春季躁动怎么样?2023年的牛股有哪些?大消费回暖了吗?元宇宙到底是不是要来了?2022年经历了俄乌冲突联储加息疫情反复极端天气等不利因素的影数读凯迪拉克品牌2022年在华销量再破20万辆,今年推两款新车型文懂车帝原创李德喆懂车帝原创行业懂车帝从凯迪拉克品牌官方获悉,近日,凯迪拉克公布了2022年在华销量情况。数据显示,2022年面对国内疫情芯片短缺供给需求等多重压力影响,凯迪拉克品回乡创业的年轻人,涌向新消费图片来源视觉中国文商业数据派,作者黄小艺每到春节,在外忙碌一整年的人,又回到了自己的小城市。和一线城市变空城相反,城镇里那些平时空旷的路上,挤满了外地车牌也挤满了回乡人。我爱喝的奶中国银行工商银行存款调整新利息2023年01月,存款全新利息表2023年01月,中国银行中国工商银行人民币存款最新利息表大额存单利率表。中国银行个人大额存单为人民币标准类固定利率大额存单,包括1个月3个月6个月9个月1年18个月2年3年5年等1月起,2023年养老金上涨信号释放,养老金医保补贴有4个变化序1月起,2023年养老金上涨信号释放,养老金医保补贴有4个变化中国经济新闻专家建议,养老金应该下调,至少不能上调。正如中国新闻网这次报道的,专家建议降低(或不增加)养老金。随着缴国内油价或将大幅上调!最新调价后,1月25日全国9592汽油价格油价调整消息第3轮国内油价调整或将大幅上调,时间已确定!1月25日各地9295号汽油价格。今天是1月25日,农历正月初四,时间好快,7天的春节假期已经过了一半,而国内油价第3轮的调开市在即!重点关注这种大涨信号!!头肩底形态相对复杂,周期较长,很考验普通投资者的操作和心态。但优点是这种形态的确定性更高,缓冲垫较好,容错率也高。重要的是,有多个确认买点供投资者选择。按照历史经验来看,头肩底一旦世行专家中国是2023年唯一有望复苏并加速发展的主要经济体北京日报客户端记者白波全球化智库(CCG)与世界银行近日联合举办报告发布会,解读世行最新的全球经济展望,对2023年世界经济形势作出分析和预测。世界银行全球经济展望2023将202这些交易,无效!纽交所最新声明每经编辑黄胜据界面新闻1月25日援引彭博消息,纽约证交所发布声明称,由于系统问题,一部分上市证券在1月24日没有开盘竞价。系统问题导致这些证券从美国东部时间上午930开始连续交易,中国平安连续七年蝉联BrandFinanceampampquot全球最具价值保险品牌ampampquot日前,知名品牌价值评级机构BrandFinance在达沃斯全球经济论坛上发布了2023年全球品牌价值500强榜单。2023年度,中国平安以品牌价值477亿美元,位列全球品牌价值榜第