开发者学堂课程【Redis 入门到精通(进阶篇):高级数据类型-Bitmaps】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/765/detail/13443
高级数据类型-Bitmaps
在讲解之前,需要了解所谓的高级数据类型是为了解决单一的数据类型而存在的,它不像是前面学习的5个基础的数据类型,它们是有明显的模型特征的。本章主要易举例的方式讲解 Bitmaps
一,Bitmaps 讲解
1.举例
(1).公司年度总会
在公司年度总会上,老板在会议上提出一个问题,公司的电影网站租凭的服务器马上会到期,要进行续费,根据往年的经验,今年续费的时候,容量又要扩大,因为电影网站实际上是靠资源,大小也是比较大的。关于怎么续法,员工们各自提出了看法。员工A 提出,继续续费。员工 B 提出,是否可以自己搭机房,但是由于搭机房需要买相应的服务器,还要去管理维护,导致它的成本比较高。此时,员工C 提出,是否考虑一下淘汰,淘汰什么?也就是淘汰服务器上已经常年没有人访问的电影。这些电影,占着资源,并没有去浏览。如果,这些可以淘汰下来,那么今年有可能不需要新的容量,甚至有可能降低一些容量。老板听完之后,觉得员工 C 的方案比较靠谱,令员工们先去统计一些情况之后再做续费或否的决定。
(2).公司年度总会第二天
这些工作自然的落在令运维人员的身上,运维人员向编程员小王提出一些要求,要求为查一些信息。小王梳理了以下三类信息。一,年度浏览量最低;二,月度浏览量最低;三,周浏览量最低。做这些工作时,小王作为一名程序员,很容易想到把数据库里的数据查一遍,他就开始做统计工作。首选是用数据库的方案来解决。这时,精明老道的老王出来,看了以后直接告诉小王,这个东西不要用数据库,用redis。应用 redis 时也就会涉及到下面所要讲的存储需求。
2.存储需求
当我们存储数据的时候,如果是要读取数据里边具体的内容,这时数据的存储相对复杂一些,但是如果仅仅要的是一个状态,这样的存储相对简单一些。像我们日常存储有很多这样的例子,比如说性别,男女,它明显的就是一个状态。开关似的,非黑即白。再比如说你是不是华侨,比如说你是不是党员,我们从一个是就可以了。此外,我们也可以存一个 Y 或者 N, true 或者 force 来进行存储。当然还有一种情况也是比较容易想到的,就是我们存一个数字1或者0就行。使用一个一表示真,使用一个零表示假,这样,它存储起来性能会比较的高一些,因为它占用的空间小。而对于我们的数据存储来说,如果在不同的语言中存储一个一最小需要多大的空间?如果你要将1当成是一个完整的数据来看的话,在各个语言中,最小的单位应该是beat。但实际上我们大家都知道,在计算机上存储数据的最小单元是 beat weight,可以用一个 weight 存储。这就是一组数据。一个beat,实际上它存储的是八个状态值,也就是拿出来任意一个数据,我们都可以用最小力度来描述我们真正要保存的数据。
此图为讲解八个状态值的举例图:
这张图可以看出八个人都不是党员,这时换一个数据
这张图里可以知道,编号为2,5,7的人分别是党员
这里可以看出都是党员,从整个的存储结构上来说,我们已经利用了计算机中最小的存储单位,Beat。不可能比这种存储效率再高了,这是一个比较好存储空间节约的方案,但是这样好的存储方案会带来麻烦一点儿的东西,就是取这个数据的时候比较麻烦,原本取出来是可以直接用了。现在,取的时候可能麻烦点儿,需要在这里边按位置去取,另外一个就是改职业比较麻烦,原本直接把这个值给改了,现在是改里边某一个 beat 上面的值。也就是,这是一个典型的什么数据结构的思想,拿时间换空间。按照这个思路发展下去,那我们要研究的就是这个值该怎么改,这个值该怎么取。对应的两个操作,如果想改某一位上的值,改哪至少要知道两个。第一,要改哪一位置上,第二,准备改成什么样的东西,比如说要改第五位上的改成零和五,这两个数据要知道,如果你想取一个值,最少得知道一个东西。
3.Bitmaps类型的基础操作
1.获取指定 key 对应偏移量上的 bit 值
getbit key offset
2.设置指定 key 对应偏移量上的 bit 值,value 只能是1或0
setbit key offset value


