一、什么是缓存穿透
在客户端发送请求查询数据的时候,先是查询缓存,若缓存中没有该数据,再去查询数据库,查到数据以后返回给客户端,并且将该数据写入缓存中。如果有大量的请求查询不存在的数据,会给数据库带来极大的压力,这个就是缓存穿透。
二、怎么解决缓存穿透
- 对空值做缓存:
如果一个查询返回的数据为null(不管数据是否存在),我们扔把这个空结果进行缓存,设置很短的空结果的过期时间,最长不超过5min。 - 设置白名单:
利用bitmaps,定义一个可访问的白名单,名单id为birmaps的偏移量,每次访问都要和bitmaps中的白名单进行比较,若id不在bitmaps中,不允许访问。 - 布隆过滤器:
布隆过滤器是一个bit向量或者说是一个bit数组,使用的时候将值映射通过多个不同的哈希函数生成多个哈希值,并对每个生成的hash值指向的bit位置为1。查询的时候只需要看指定位置的值是否为1,查询结果只能是一定不存在和可能存在。图示是一个初始化的过滤器。
在向其中存入baidu,假如通过hash算法得到三个值:1,2,5,则此时的数组为
再向其中存入taobao,得到的值是2,4,6,此时的数组为:
查找Tencent,hash值为2,3,4,此时3位置为0,因此Tencent肯定不存在,但是在查找baidu的时候,可以说baidu一定存在吗?也不可以,只能说baidu可能存在。因此布隆过滤器有一定的误识别率并且位移以后的数组无法删除。 - 进行实时监控:
请运维人员配合,排查访问对象和数据,设置黑名单服务。
版权声明:本文为qq_45655489原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。