linux中获取redis的map,深入Redis之 bitmap位图和HyperLogLog(五)

bitmap位图

我们知道一个字符占1个字节,也就是8个位

例如

set name big

big字符串中的3个字符的ASCII码为98 105 113

所以big转为二进制就是:

01100010|01101001|01100111

b       i        g

占了3个字节的大小,一共24个位。

bitmap位图可以帮我们获取和设置key存储的值的位。

例如

获取 name 这个key 的第一个位

getbit name 0   # 得到0

设置 name 这个key的第8个位为1

setbit name 7 1

get name        # 得到cig,b变成c

setbit只能修改位图指定索引的值,要么是0要么是1

如果使用setbit设置一个不存在的key的位图,则会生成这个key,并且将偏移量之前的位自动补0

例如:

setbit newKey 99 1     # 生成一个newKey,其位图长度为100,第100个位的值为1

位图为:

000...001

| 99个0 |

get newKey      # 会得到一堆你不认识的数字"\x00\x00\x00\x00\x80"

bitcount key [start end]   # 获取位图指定范围为1的个数

bitop option destkey key1 key2 ... keyn      # 将多个bitmap进行 and or not xor操作并将结果存到destkey中

这里题外话说一下位运算:

and: 0&0=0  0&1=0  1&0=0  1&1=1

or: 0|0=0  0|1=1  1|0=1  1|1=1

xor: 0^0=0  0^1=1  1^0=1  1^1=0

实战场景:

大量的独立用户统计,具体情境为,一个网站有1亿个注册用户,每天登陆的用户有5000万个独立用户。记录每天每一个用户是否登陆。

两种解决思路:

a.使用集合set:以日期为key,集合存放的是当天登陆的用户id。

sadd date:20190101 100 5019 43889104    # 2019-01-01这天存了id为100,5019和43889104的id

假如每个userid平均占用空间为32个位=4字节,则一天约有5000万个id被记录到一个集合中,所以一天占用的内存空间=4*5000万 = 200M

一个月会产生30个这样的集合(这30个key不会都放到内存,肯定是只有当天的key放到内存,之前的key写入磁盘文件中),会占用

30 * 200M = 6G 的空间

如果想统计连续登录一周的用户可以

sinter date:20190101 date:20190102 ... date:20190107

b.使用位图: 以日期为key,设置位图的长度为最大的userid,假设最大的userid刚好是100000000(1亿),所以这个key一共有1亿个位。

00101100...01101

||

一天占用的空间为 1亿/8 = 12.5M

具体命令:

setbit date:20190101 100000000 0    # 先设定位图长度为1亿

setbit date:20190101 549 1          # 如userid为549的用户登录,就在第549个位上设置为1。

setbit date:20190101 98445219 1

.....

这样每个userid占用的空间实际上只有1个位=1/8个字节。

但是不管当天只有1个用户登录还是有1亿个用户登录,生成的位图的长度都是固定的1亿,占用的空间都是固定的12.5M。

一个月下来占用

12.5*30 = 375M

如果想统计连续登录一周的用户可以

bitop and date:20190101 date:20190102 ... date:20190107

如果想统计一天的独立用户登录数量

bitcount date:20190101

如果想获取id为1000的用户在某一天是否登录:

getbit date:20190101 1000

对比set和bitmap发现,后者会节省很多空间。

c895e2fde2d14964f490d6bee43bf6df.png

但是换一个情景:

1亿的用户,每天10万独立用户登录

使用set : 32/8 * 10万 = 4M

使用bitmap: 1亿/8 = 12.5M

此时是使用set更节省空间。

8feb2c5ce6d7734bc89e9ac7a63f13e1.png

HyperLogLog

基于Hyperloglog算法,可以以极小的空间完成独立数据统计。其本质还是字符串。

命令:

pfadd key element ...   # 向hyperloglog添加一个或多个元素

pfcount key ...     # 计算hyperloglog的不重复的元素总数

pfmerge destkey k1 k2 ...   # 合并多个hyperloglog赋给destkey

实战场景:

计算每一天的网站的独立访客数量(用户重复进入网站不算)

方案:使用hyperloglog,以日期为key,一天建立一个hyperloglog来记录独立访客。用户每访问一次网页就往里面添加用户的id。可以往这个key中添加重复的用户id,但是pfcount只会计算不重复值的个数。

添加

pfadd date:20200101 u1 u100 u439 ...

计算一天的独立访客数

pfcount date:20200101

计算一周的独立访客数

pfcount date:20200101 date:20200102 ... date:20200107

如果一天有100万的独立用户访问网站,则一个hyperloglog只消耗15K的内存,一个月450K,一年才5M。

hyperloglog与set、bitmap的区别和比较:

hyperloglog消耗内存极小,但是它只能计算key中独立元素个数,不能取出里面的元素或者查看key中是否有某个元素。

所以想获取某个用户在某一天是否登陆就办不到的,而set和bitmap都是可以办到的。

hyperloglog有一定的错误率,例如往pfadd添加100万个不同元素(请勿用一条pfadd添加100万个元素),上面计算出来的元素个数为1009839

相比于单纯的字符串型 incr 来计算用户访问的区别是:

两者都先用很小的空间但

incr 不能计算独立用户访问数,只能计算用户总访问数(包括刷新页面也计算在内),而hyperloglog可以。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

想象中的同居生活 VS 真实的同居生活

1 长颈鹿是怎么喝水的2 为了防止雨伞被偷设计师还是真动了不少脑筋呢-3 睡在这样的床上,晒着太阳,肯定超赞4 如何阻止猫咪上楼5 想象中的同居生活 VS 真实的同居生活 6 硬生生把苹果削成吃不饱也吃不起的样子7 来来来准备瓜子杏仁你点的每个赞&#xff…

抽丝剥茧!Source Generators原理讲解

前言前段时间,我们已经用Source Generators实现了好多功能,比如AutoMapper、API最佳实践。你看完那些实现代码,是不是还有点云里雾里!Source Generators到底是怎么做到的?基础知识Source Generators是编译过程的一部分…

GPON技术概述

GPON技术转载自《电子发烧友》。文章链接请见:http://www.elecfans.com/article/88/171/2009/2009050556028.htmlGPON技术详述介绍GPON 技术之前,先介绍目前也被应用的另一种PON 技术“EPON”。1.EPON技术介绍EPON 又名 GEPON,是由…

linux中断处理汇编入口,Linux中断处理体系结构分析(一)

中断也是一种异常,之所以把它单独的列出来,是因为中断的处理与具体的开发板密切相关,除一些必须、共用的中断(比如系统时钟中断、片内外设UART中断)外,必须由驱动开发者提供处理函数。内核提炼出中断处理的共性,搭建一…

没有违反GPL,他们真的给了源码

文 | Travis出品 | OSC开源社区(ID:oschina2013)【前情回顾】国内智能设备制造商 UMIDIGI 因违反 GPLv2 协议引发争议,并告知开发者“想要源码上门自取”。而后,知名科技博主 Naomi Wu(机械妖姬&#xff09…

有朋友问我为什么这么帅

1 2 重庆的朋友告诉我这是微辣3 我就说我只是虚胖,这下你相信了吧?4 这明明就是打情骂俏好嘛5 这还是那个平常瓶盖都拧不开的女孩子吗6 被一个机器人撩到了!7 这是什么原理?你点的每个赞,我都认真当成了喜欢

python安装详细步骤mac_Mac安装python3的方法步骤

Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的。 现在 Mac 上默认安装的 python 版本为 2.7 版本,若 安装 新版本需要 通过 该地址进行下载: https://www.python.org/ftp/python/3.5.0/python-3.5.0…

在Excel中实现下拉列表选择录入

我们在用Excel录入表格数据时,常常会遇到某列数据的值只在几个固定值中选择一个的情况,比如:人的性别列只可能录入男或女,对学历列只可能录入高中、大专、本科、研究生之一等。遇到这类数据,如果我们手工录入&#xff…

你吃的瓜子仁,真是老奶奶磕出来的?!

全世界只有3.14 % 的人关注了爆炸吧知识本文转载自微信公众号一只学霸(ID:bajie203)萌萌不是挺爱吃瓜子仁吗有次他吃的时候大毛在旁边看着看着突然想到一个问题吓得我反思了一下自己是怎么和他们考上同个学校的没思考出来吓得我给大家写了这篇…

持续20年,一场威胁Linux存亡的诉讼终结束

文 | 局长出品 | OSC开源社区(ID:oschina2013)一场持续将近 20 年、曾被认为会威胁 Linux 存亡的诉讼终于迎来了尾声。这场诉讼开始于 2003 年,不过其背后的事件最早可追溯到 1998 年。当时 IBM 和 Santa Cruz Operation&#xff…

shell grep 变量_老司机给出的关于 shell 脚本的8个建议,必收!

这八个建议,来源于键者几年来编写 shell 脚本的一些经验和教训。事实上开始写的时候还不止这几条,后来思索再三,去掉几条无关痛痒的,最后剩下八条。毫不夸张地说,每条都是精挑细选的,虽然有几点算是老生常谈…

不是说好一起长大的吗?

1 仿佛闻到了嫉妒的味道!2 阿拉:不是说好一起长大的吗?3 还有这么小的菠萝蜜??4 你以为它是个橘子其实它并不是5 当我吃到自己喜欢吃的东西时……6 以后吃完小龙虾,千万别扔,有妙用7 这是啥玩意…

javascript:设置URL参数的方法,适合多条件查询

适用场景&#xff1a;多条件查询情况&#xff0c;如下图所示&#xff1a; 通过设置URL参数&#xff0c;再结合数据源控件设置的RUL参数&#xff0c;就能进行简单的多条件查询了。 javascript函数&#xff1a; <mce:script type"text/javascript"><!-- //设置…

SQL点滴19—T-SQL中的透视和逆透视

原文:SQL点滴19—T-SQL中的透视和逆透视透视 今天抽一点时间来看看透视和逆透视语句&#xff0c;简单的说就是行列转换。假设一个销售表中存放着产品号&#xff0c;产品折扣&#xff0c;产品价格三个列&#xff0c;每一种产品号可能有多种折扣&#xff0c;每一种折扣只对应一个…

Magicodes.IE 2.5.5.3发布

2.5.5.32021.08.27修复Append方式导出多个sheet时&#xff0c;发生“Tablename is not unique”错误&#xff0c;具体见#299。2.5.5.22021.08.24添加对Abp模块的包装&#xff0c;具体见#318。Magicodes.IE.Excel.Abp&#xff08;MagicodesIEExcelModule&#xff09;注册IExcelE…

C语言阿斯码,木叶四位上忍设定各不相同,网红负责秀操作,她只需要美就够了...

原标题&#xff1a;木叶四位上忍设定各不相同&#xff0c;网红负责秀操作&#xff0c;她只需要美就够了木叶四位上忍设定各不相同&#xff0c;网红负责秀操作&#xff0c;她只需要美就够了说道忍界网红&#xff0c;那一定就是卡卡西了。卡卡西在《火影》当中的表现俘获了大批小…

80岁COBOL码农:扶我起来,这个bug我会修!

95&#xff05;的 ATM 交易通过 COBOL 程序&#xff0c;80&#xff05;的现场交易依赖于它们&#xff0c;超过 40&#xff05;的银行仍然使用 COBOL 作为其系统的基础。由于年轻人懂 COBOL 的比较少&#xff0c;美国康涅狄格州劳工部正在召回经验丰富的退休 COBOL 人员。来源&a…

小心使用宏

开发过程中&#xff0c;会经常使用宏定义&#xff0c;偶尔还会碰到重复定义的宏&#xff0c;有些时候会造成不良影响。 见如下例子&#xff1a; Test.h #ifndef GUARD_TEST_H #define GUARD_TEST_H class CTest { public: CTest(); virtual ~CTest(); void Display(void); publ…

数据资产纳入国资保值增值考核

首先是国资云近期横空出世&#xff0c;国资云的推广预示着党政及国企未来将坚持私有云技术路线。从天津、四川等省市国资云平台的建设方式来看&#xff0c;未来党政及国企部门的业务系统上云将坚持私有云的技术路线&#xff0c;由此可能对未来国内云计算市场带来深远影响。国资…

iPhone5:4G是否进入主流的风向标?

当业内的目光不约而同地集中到苹果即将发布的iPad2的时候&#xff0c;按照惯例&#xff0c;苹果的另一款重量级产品iPhone5也会在今年登场。近日&#xff0c;国外有预测称&#xff0c;苹果的iPhone5可能会不支持 4G网络&#xff0c;这多少令业内感到意外和失望&#xff0c;并由…