点击关注公众号,Java干货及时送达

作者:that_is_cool

blog.csdn.net/that_is_cool/article/details/91346356

前言:怎么能把风马牛不相及的概念串在一块,就得看笔者的本事了。

bitmap和布隆过滤器

海量整数中是否存在某个值--bitmap

在一个程序中,经常有让我们判断一个集合中是否存在某个数的case;大多数情况下,只需要用map或是list这样简单的数据结构,如果使用的是高级语言,还能乘上快车调用几个封装好的api,加几个if else,两三行代码就可以在控制台看自己“完美”而又“健壮”的代码跑起来了。

但是,事无完美,在高并发环境下,所有的case都会极端化,如果这是一个十分庞大的集合(给这个庞大一个具体的值吧,一个亿),简单的一个hash map,不考虑链表所需的指针内存空间,一亿个int类型的整数,就需要380多M(4byte × 10 ^8),十亿的话就是4个G,不考虑性能,光算算这内存开销,即使现在满地都是128G的服务器,也不好吃下这一壶。

bitmap则使用位数代表数的大小,bit中存储的0或者1来标识该整数是否存在,具体模型如下:

这是一个能标识0-9的“bitmap”,其中4321这四个数存在

计算一下bitmap的内存开销,如果是1亿以内的数据查找,我们只需要1亿个bit = 12MB左右的内存空间,就可以完成海量数据查找了,是不是极其诱人的一个内存缩减,以下为Java实现的bitmap代码:

public class MyBitMap {private byte[] bytes;private int initSize;public MyBitMap(int size) {if (size <= 0) {return;}initSize = size / (8) + 1;bytes = new byte[initSize];}public void set(int number) {//相当于对一个数字进行右移动3位,相当于除以8int index = number >> 3;//相当于 number % 8 获取到byte[index]的位置int position = number & 0x07;//进行|或运算  参加运算的两个对象只要有一个为1,其值为1。bytes[index] |= 1 << position;}public boolean contain(int number) {int index = number >> 3;int position = number & 0x07;return (bytes[index] & (1 << position)) != 0;}public static void main(String[] args) {MyBitMap myBitMap = new MyBitMap(32);myBitMap.set(30);myBitMap.set(13);myBitMap.set(24);System.out.println(myBitMap.contain(2));}}

使用简单的byte数组和位运算,就能做到时间与空间的完美均衡,是不是美美哒,wrong!试想一下,如果我们明确这是一个一亿以内,但是数量级只有10的集合,我们使用bitmap,同样需要开销12M的数据,如果是10亿以内的数据,开销就会涨到120M,bitmap的空间开销永远是和他的数据取值范围挂钩的,只有在海量数据下,他才能够大显身手。

再说说刚刚提到的那个极端case,假设这个数据量在一千万,但是取值范围好死不死就在十个亿以内,那我们不可避免还是要面对120M的开销,有方法应对么?

布隆过滤器

如果面对笔者说的以上问题,我们结合一下常规的解决方案,譬如说hash一下,我将十亿以内的某个数据,hash成一亿内的某个值,再去bitmap中查怎么样,如下图,布隆过滤器就是这么干的:

利用多个hash算法得到的值,减小hash碰撞的概率

像上面的图注所说,我们可以利用多个hash算法减小碰撞概率,但只要存在碰撞,就一定会有错误判断,我们无法百分百确定一个值是否真的存在,但是hash算法的魅力在于,我不能确定你是否存在,但是我可以确定你是否真的不存在,这也就是以上的实现为什么称之“过滤器”的原因了。

高并发缓存设计策略

why cache??

如果读者是一个计算机专业的同学,cache这个词应该是能达到让耳朵起茧的出现频次。在计算机体系中,cache是介于cpu以及内存之间,用来缓和cpu和内存处理速度差距的那么一个和事佬;在OS中,page cache又是内存和IO之间的和事佬。

cache是个和事老??听着似乎怪怪的,但是也蛮形象的啦。

前面讲了大半截的算法理论,为了防止读者犯困,直接进入下半部分主题,高并发缓存设计。

即使是在软件层,我们同样需要这么一个和事老,从最简单的服务架构开始,通常我们在服务端发起请求,然后CURD某个关系型数据库例如Mysql。但是,类似这样的架构都需要有一个磁盘作为终端持久化,即使增加索引,使用B+树的这种数据结构进行优化查询,效率还是会卡在需要频繁寻道的IO上。这个时候,一个和事老的作用就十分明显了,我们会添加一些内存操作,来缓和IO处理速度慢带来的压力。cache is not a problem,how to use it is actually a problem。

缓存一致性问题

缓存处理的机制有以下几种:

  • cache aside;

  • read through;

  • write through;

  • write behind caching;

缓存穿透问题

所谓的缓存击穿,就是当请求发出,而无法在缓存中读到数据时,请求还是会作用到database,这样的话,缓存减压的效果就不复存在了。

设想这么一个场景,如果一个用户,使用大流量恶意频繁地去查询一条数据库中没有的记录,一直击穿缓存,势必会把database打死,如何避免缓存击穿,这就是一个问题了。

有两种方案,第一种,在缓存中添加空值,如果在database中查询无果,我们大可以把值设置为null,防止下次再次访问数据库,这样做简单便捷,但是多少有些浪费空间。

第二种方案,就是使用布隆过滤器(点题),在cache与web服务器中间加一层布隆过滤器,对访问的key做记录,如此以来,同样可以解决缓存击穿的问题。

缓存雪崩问题

缓存雪崩发生于在某个时间点,缓存同时失效,例如缓存设置了失效时间,这会联动的导致大量缓存击穿问题。

加分布式锁是一种解决方案,只有拿到锁的请求才能访问database。但是这样治标不治本,当请求量过多时,大量的线程阻塞,也会把内存撑坏的。

预热数据,分散地设置失效时间,这样可以减少缓存雪崩发生的概率。

提高缓存可用性,cache的单点一样是会是缓存雪崩的隐患,大部分缓存中间件都提供高可用架构,如redis的主从+哨兵架构。

热门内容:服务端如何防止订单重复支付!
拜托!不要用“ ! = null " 做判空了
道友自诉:入职中软一个月(外包华为)就离职了!
23 种设计模式的通俗解释,看完秒懂
token多平台身份认证架构设计思路
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

从bitmap到布隆过滤器,再到高并发缓存设计策略相关推荐

  1. 布隆过滤器速度_高并发系统一定要考虑的 Bloom Filter 布隆过滤器

    开篇思考 你能想到哪些方式判断一个元素是否存在集合中? 布隆过滤器并不存储数据本身,那么是怎么做到过滤的? 布隆过滤器实现?参数配置? 一般我们用来判断一个元素是否存在,会想到用 List,Map,S ...

  2. 高并发软件设计的几种方式

    本文就高并发软件设计中可以考虑使用的一些方法做如下总结: 1)多线程有利于提高CPU占用率,因为软件本身的线程越多,在和系统上其他线程争夺CPU资源时就能分配到更多执行资源,同时也能提高业务处理的并发 ...

  3. 数据库学习:高并发数据库设计

    数据库学习:高并发数据库设计 随着乐视硬件抢购的不断升级,乐视集团支付面临的请求压力百倍乃至千倍的暴增.作为商品购买的最后一环,保证用户快速稳定的完成支付尤为重要.所以在15年11月,我们对整个支付系 ...

  4. 服务器系统怎么做高并发,QPS 高并发 如何设计一个支撑高并发大流量的系统?...

    QPS 高并发 如何设计一个支撑高并发大流量的系统? 高并发架构相关概念 什么是并发? 并发是指并发的访问,也就是某个时间点,有多少个访问同时到来: 通常如果一个系统的日PV在千万以上,有可能是一个高 ...

  5. 机票搜索高并发架构设计

    去哪儿网机票搜索系统的高并发架构设计 转载 2017年05月11日 11:25:51 查看全文 http://www.taodudu.cc/news/show-3183758.html 相关文章: P ...

  6. 华为19级专家10年心血终成百页负载均衡高并发网关设计实战文档

    负载均衡(LoadBalance)的字面意思是将工作负载分担到多个工作单元上进行执行,它建立在现有网络结构之上,是构建分布式服务.大型网络应用的关键组件. 近十几年来,负载均衡技术层出不穷,令人眼花缭 ...

  7. 华为19级大佬10年心血终成百页负载均衡高并发网关设计实战文档

    说在前面的话 负载均衡(LoadBalance)的字面意思是将工作负载分担到多个工作单元上进行执行,它建立在现有网络结构之上,是构建分布式服务.大型网络应用的关键组件. 近十几年来,负载均衡技术层出不 ...

  8. 什么是布隆过滤器?如何解决高并发缓存穿透问题?

    日常开发中,大家经常使用缓存,但是你知道大型的互联网公司面对高并发流量,要注意缓存穿透问题吗!!!    本文会介绍布隆过滤器,空间换时间,以较低的内存空间.高效解决这个问题. 本篇文章的目录: 1. ...

  9. 对BitMap和布隆过滤器的理解

    BitMap 将每一个元素映射到一个Byte[]数组, 那么判断每个元素是否存在于一个数据集时, 直接用下标获取标记位进行判断即可 ○○ [] ●○ [1] ○● [2] ●● [1,2] 布隆过滤器 ...

最新文章

  1. mysql命令创建模式_mysql在命令行模式下创建数据库时要显式指定字符集
  2. Ocelot简易教程(一)之Ocelot是什么
  3. php 安卓实现实时导航,用安卓平板电脑轻松实现GPS实时导航
  4. VoiceConvert/音频格式快速转换
  5. boost::geometry::num_geometries用法的测试程序
  6. 【Silverlight5矢量打印】如何用C#代码检测打印机和驱动是否支持PostScript
  7. 惠普z6计算机进不去桌面,HP Z6 桌面工作站 | HP® HK 惠普香港
  8. asp.net中引入外部js文件,容易产生中文乱码
  9. SpringBoot 2.0 整合Mybatis详细步骤
  10. VMware虚拟机磁盘扩容
  11. linux配置maven环境变量
  12. 可以自己diy壁纸的app_有什么APP可以做壁纸?
  13. fcpx快闪插件推荐,让视频片头片尾更动感
  14. 用户权限集中管理方案
  15. 【随笔】AI+眼镜行业
  16. Ubuntu server 14.04 启用root用户并设置密码
  17. day08【File类、递归】
  18. 网赚里的lead是什么?与offer有什么区别?-自由网赚网
  19. English语法_ 定语从句
  20. HIT软件构造lab2

热门文章

  1. facebook maskrcnn 安装笔记
  2. leaflet地图框架
  3. QWidget一生,从创建到销毁事件流
  4. AngularJs $cacheFactory 缓存服务
  5. ORACLE分页SQL
  6. WhyGL:一套学习OpenGL的框架,及翻写Nehe的OpenGL教程
  7. 项目管理过程中,如何编制初步工作说明书
  8. Java中使用LUA脚本语言
  9. 如何利用 C# 实现神经网络的感知器模型?
  10. 记录一次自己调试代码的过程