缓存穿透

当使用错误或者不存在的账号进行登录时,因为账号不存在,所以Redis里不会存入缓存数据,但程序实际上还是会每次都查询数据库,导致数据库压力仍然过大。读写速度越来越慢,甚至宕机,这属于系统漏洞。

看起来,使用了Redis,但实际上这种被错误数据攻击的情况下,Redis失去了缓存的意义,称为缓存穿透。

解决缓存穿透

第一次从数据库查询不到数据时,仍然把这个空结果缓存,不过过期时间一般不超过五分钟。

// 只 new 实例但不设置任何属性,相当于一个空对象
userDO = new UserDO();
redisTemplate.opsForValue().set(userName, userDO, 5, TimeUnit.MINUTES);

当用户第二次访问时,无论账户是否正确,Redis都缓存了数据,避免再次查询数据库。而缓存住的错误账号,因为没有属性值,实际不会执行登录。