- 缓存穿透
一.数据查询的流程
程序根据请求查询数据时,会先到redis中查询,如果redis中查到了目标数据,则直接返回;如果redis中没有目标数据,则到mysql中查找,找到目标数据后返回,同时将该数据写入到redis中。
二.什么是缓存穿透?
查询一个数据库中不存在的数据,由于数据库中没有该数据,因此也不会写入到redis中,导致每次请求该数据都要查询数据库。大量针对该数据的高并发请求可能会导致数据库挂掉。
三.如何解决缓存穿透?
方案一.缓存空数据
1.实施:对mysql中查询不到的数据,返回一个空值null,同时将该null值写入到redis中。
2.缺点:
(1)会消耗内存,无效数据一直占用内存;
(2)写入数据时可能会导致mysql与redis数据不一致的情况。
方案二.布隆过滤器
1.位图(bitmap):位图是一种以位(bit)为单位的数组,数组的每个单元只能存储二进制0或1
2.加了布隆过滤器后的查询流程:在对缓存进行预热时会先预热布隆过滤器,请求在查询redis前会先被布隆过滤器拦截,由布隆过滤器判断该数据是否存在,如果要查询的数据存在,则请求可以继续去查询redis;如果要查询的数据不存在,则直接返回。
3.布隆过滤器是通过位图来判断要查询的数据是否存在:
(1)对布隆过滤器进行预热时,会对每一个数据进行多个hash函数计算得到多个hash值,这些hash值作为数组的下标,