缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成数据库压力过大。
解决缓存穿透的常见策略有:
布隆过滤器:使用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免对底层存储系统的查询压力。
缓存空对象:即使数据库查询不到数据,也将空结果进行缓存,但是需要设置较短的过期时间,防止长时间占用缓存空间。
使用互斥锁:如果是多线程环境下,可以使用互斥锁,当缓存失效的时候,不是立即去load db,而是先使用缓存 工具 的某些带成功操作返回值的操作(比如 Redis 的SETNX或者 Memcached 的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。
数据预热:在系统上线前,就将可能成为热点的数据加载到缓存中中。
暂无回复。