ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
>[success] **缓存数据分层** > 热频数据 冷频数据 >[success]**缓存问题** >>**缓存穿透**: 缓存穿透是指查询的key不存在,从而缓存查询不到而查询了数据库。若是这样的key恰好并发请求很大,那么就会对数据库造成不必要的压力。比如黑客用一堆不存在的key访问数据,大量请求发送到数据库,数据库压力过大而宕机. >>>>[danger]解决方法: 1、把所有存在的key都存到另外一个存储的Set集合里,查询时可以先查询key是否存在; 2、将这些key对应的值设置为null 丢到缓存里面去。后面再出现查询这个key 的请求的时候,直接返回null,再根据业务需求设置过期时间。 3、BloomFilter 类似于一个hbase set 用来判断某个元素(key)是否存在于某个集合中。这种方式在大数据场景应用比较多,比如 Hbase 中使用它去判断数据是否在磁盘上。这种方案可以加在第1/2种方案中,在缓存之前加一层 BloomFilter ,在查询的时候先去 BloomFilter 去查询 key 是否存在,如果不存在就直接返回,存在再走查缓存 -> 查 DB。 >>**缓存击穿** 在高并发的系统中,大量的请求同时查询一个 key 时,这个key刚好失效了,就会导致大量的请求都打到数据库上面去。这种现象我们称为缓存击穿。 >>>>[danger]解决方法:在第一个查询数据的请求上使用一个 互斥锁。其他的线程进入等待状态,等第一个线程查询到了数据,然后做缓存。后面的线程进来发现已经有缓存了,就直接走缓存。 >[success]缓存设计思考 制定缓存策略 区分缓存数据 避免缓存问题