背景
在项目中,有一个注册电子健康卡的服务,用户注册电子健康卡时候,都要携带外部流水号来进行注册。
我们的需求是并发情况下不能让流水号重复。
由于每次每个请求都要去判断流水号是否重复,就要去数据库查询实体是否存在,并发情况下导致数据库压力较大,就引入了Redis来减少去请求数据库的次数。
使用Redis就会出现缓存穿透的问题。
缓存穿透
缓存穿透是指缓存和数据库中都没有的数据,用户不断发起请求,我们的数据库不存这些数据时候,这时候用户很可能是攻击者,攻击就会导致数据库压力过大,严重击垮数据库。
以下流程就是会导致缓存穿透:
解决办法-布隆过滤器
缓存穿透说到底就是你要让项目中的“流水号”存在的情况去请求数据库,找到这个实体,找到后抛出异常-重复的流水号。
我会使用布隆过滤器增加校验,如果这个流水号在布隆过滤器中存在,就去请求数据库,不存在就把该流水号放入布隆过滤器中之后进行接下来业务操作注册电子健康卡。
以下为流程图: