bitmap的特性和应用

BitMap 是什么?

BitMap 简称位图,实际上是一个散列表,只不过这个散列表中各个槽是计算机存储中的最小单元bit.


那BitMap数据结构长什么样呢?

一个长度为8的BitMap是下面这样的:

状态 实际表示
初始化状态 00000000
使用后状态 00100000

BitMap 特性

  • 数据结构本身所占用的存储极小
  • 每个槽位上的值只能是0或者1

所以,上面的两个特性决定的它的使用场景。特别是在解决大数据中识别问题。具体0和1能表示什么,取决于业务上赋予它的值。比如有一下场景:

  1. 可以表示自然数是否存在问题。直接把自然数定位到数组下标,用1标记存在,用0标记不存在即可。
  2. 所知道的数组下标都只能是自然数,所以,可以将其他数据最终转换成自然数后,再使用BitMap进行标记。比如小明今天来上课的问题,就可以用学号直接替代自然数,标记用1或者0标记今天是否来上课问题。
  3. 网络爬虫中标记某一个url是否已经爬过了的问题。可以使用hash算法,将长url转换成自然数,然后用1或者0标记是否爬过。

BitMap在redis中应用

redis中除了list,set,zset,string,map这五种常用数据结构以外,还有hylog,geo,bitmap,sub/pub这四种数据结构。

其中,bitmap在redis中的应用,可以解决现在分布式服务器之间数据同步访问的问题。(注:redis4.0以上已经有bloomfilter插件了,可以配置开启)

Bloom Filter原理剖析

布隆过滤器原理就是使用BitMap来标记一个内容在map中是否存在。为了把其他的内容统一转换成自然数,也就是数组的下标,使用了hash算法,然后在对应的位置上标记是否存在。

关于hash算法

hash算法是指通过对数据的关键字进行某种运算,直接求出元素的地址。这里的地址指的是hashtable的下标位置。因为,hashtable本省就是一个数组结构。衡量hash算法好坏有两个重要指标。

  1. hash冲突尽可能的小,也就是尽可能的分散在各个槽内
  2. 装填因子=表中填充数据长度/hashtable.length 要尽可能的大

bloomfilter 在使用hash运算的时候也会产生hash冲突,解决hash冲突有两种方式:

  1. 扩大table的长度
  2. 解决hash冲突(它使用多次hash来解决该问题的)
对于连续的密集型的数据,可以使用下标位置代替数字本身,可以节省空间

这一特性在redisson中保存hashSlot就是典型的应用

posted @   Eular  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示