空白键|我要消灭一半程序员,10大高性能开发宝石( 五 )


位图索引正是基于这一点进行优化 , 针对字段取值只有少量有限项 , 数据表中该列字段出现大量重复时 , 就是位图索引一展身手的时机 。
所谓位图 , 就是Bitmap , 其基本思想是对该字段每一个取值建立一个二进制位图来标记数据表的每一条记录的该列字段是否是对应取值 。
你的网站现在访问量越来越大了 , 同时在线人数大大增长 。 然而 , 大量用户的请求带来了后端程序对数据库大量的访问 。 渐渐的 , 数据库的瓶颈开始出现 , 无法再支持日益增长的用户量 。 老板再一次给你下达了性能提升的任务 。
缓存技术&&布隆过滤器
从物理CPU对内存数据的缓存到浏览器对网页内容的缓存 , 缓存技术遍布于计算机世界的每一个角落 。
面对当前出现的数据库瓶颈 , 同样可以用缓存技术来解决 。
每次访问数据库都需要数据库进行查表(当然 , 数据库自身也有优化措施) , 反映到底层就是进行一次或多次的磁盘I/O , 但凡涉及I/O的就会慢下来 。 如果是一些频繁用到但又不会经常变化的数据 , 何不将其缓存在内存中 , 不必每一次都要找数据库要 , 从而减轻对数据库对压力呢?
缓存系统有三个著名的问题:
缓存穿透:缓存设立的目的是为了一定层面上截获到数据库存储层的请求 。 穿透的意思就在于这个截获没有成功 , 请求最终还是去到了数据库 , 缓存没有产生应有的价值 。 缓存击穿:如果把缓存理解成一面挡在数据库面前的墙壁 , 为数据库“抵御”查询请求 , 所谓击穿 , 就是在这面墙壁上打出了一个洞 。 一般发生在某个热点数据缓存到期 , 而此时针对该数据的大量查询请求来临 , 大家一股脑的怼到了数据库 。 缓存雪崩:理解了击穿 , 那雪崩就更好理解了 。 俗话说得好 , 击穿是一个人的雪崩 , 雪崩是一群人的击穿 。 如果缓存这堵墙上处处都是洞 , 那这面墙还如何屹立?吃枣药丸 。关于这三个问题的更详细阐述 , 推荐一篇文章什么是缓存系统的三座大山 。
有了缓存系统 , 我们就可以在向数据库请求之前 , 先询问缓存系统是否有我们需要的数据 , 如果有且满足需要 , 我们就可以省去一次数据库的查询 , 如果没有 , 我们再向数据库请求 。
注意 , 这里有一个关键的问题 , 如何判断我们要的数据是不是在缓存系统中呢?
进一步 , 我们把这个问题抽象出来:如何快速判断一个数据量很大的集合中是否包含我们指定的数据?
先回到上面的问题中来 , 这其实是一个查找问题 , 对于查找问题 , 最常用的解决方案是搜索树和哈希表两种方案 。
因为这个问题有两个关键点:快速、数据量很大 。 树结构首先得排除 , 哈希表倒是可以做到常数阶的性能 , 但数据量大了以后 , 一方面对哈希表的容量要求巨大 , 另一方面如何设计一个好的哈希算法能够做到如此大量数据的哈希映射也是一个难题 。


推荐阅读