缓存穿透问题

if(redis中是否存在key){
 if(get(key)!=''){
   返回redis数据
 }
} else {
 查询数据库 查到了就放到redis去 查不到也写到redis去 key=''
}
这个是我解决 如果一个key不存在的时候 让他不去访问数据库 在高并发的时候不至于挂掉

但是同时也有一个问题了 如果有人恶意请求很多不存在的key 那么我的内存会生成很多key='' key1='' 这样的数据 会占用我内存的空间 针对这个要如何处理呢

阅读 1.9k
2 个回答

按你的描述,猜测你将不存在的key也写入缓存是想要减少对无效数据查询数据库的次数。这个可以使用一定的规则,对key进行验证。比如一个32位字符串,你加入一定的校验机制,即使是一个比较简单的校验都能帮你过滤很大一部分无效的key。另外可以将所有的无效key放在一个redis的hash当中。这个hash设置一个比较合理的过期时间,这样可以相对控制无效key的大小

你的设计本身没问题,但是对这个问题,考虑考虑引入规则引擎或者类似风控等的系统解决了。
查数据库的时候,可以加个锁,避免同一条记录的并发访问。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题