侧边栏壁纸
博主头像
毕发胖博主等级

沉默会被理解为赞同

  • 累计撰写 8 篇文章
  • 累计创建 0 个标签
  • 累计收到 0 条评论

Redis ——缓存穿透

毕发胖
2022-03-21 / 0 评论 / 0 点赞 / 752 阅读 / 844 字
温馨提示:
本文最后更新于 2022-03-21,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

缓存穿透

简介:
缓存穿透是指用户向服务器请求一个非法的数据,也就是不存在的数据,数据库不存在,那么缓存中自然也就不存在,这就导致了如果大量用户发送请求会直接绕开缓存直接面对数据库,这就是缓存命中率问题。

解决方案 ——前后端校验

某些情况用户会通过请求一个id来进行查询,我们可以在前端对一些非法id做一些拦截并提示,比如一些负数的id就可以直接拦截掉,到后端后,也对一些非法数据进行拦截

解决方案 ——空值缓存

简单来说就是把空值也缓存起来,下次如果碰到同样的请求就可以直接返回空了,这样既可以避免当前数据库查询的值为空引起的缓存穿透,同时也可以单独设置一个缓存区域存储空值,就是需要对第一次的请求的key进行一个数据校验,如果为空就直接放到缓存中

public String getByUsers2(Long id) {
// 1.先查询redis
String key = this.getClass().getName() + "-" + Thread.currentThread().getStackTrace()
[1].getMethodName()+ "-id:" + id;
String userName = redisService.getString(key);
if (!StringUtils.isEmpty(userName)) {
return userName;
}
System.out.println("######开始发送数据库DB请求########");
Users user = userMapper.getUser(id);
String value = null;
if (user == null) {
// 标识为null
value = "";
} else {
value = user.getName();
}
redisService.setString(key, value);
return value;
}

但是如果要给这个请求的key设置真值的话,必须要清除先前设置的空缓存

0

评论区