Redis常见问题
缓存穿透
解释
- 应用服务器压力变大,大量访问导致redis命中率降低,大量查询数据库,大量非正常的url访问
- 指查询一个一定不存在的数据
解决
- 对数据库返回的数据为空值做缓存,但它的过期时间会很短,最长不超过五分钟。
- 设置可以访问的名单,使用bitmaps类型定义一个可以访问的名单
布隆过滤器,底层是bitmaps,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被 这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力。- 进行实时监控,设置黑名单
布隆过滤器(Bloom Filter)
-
用于检索一个元素是否在一个集合中,优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难
-
布隆过滤器实际上是一个 bit 向量或者说 bit 数组,使用多个不同的哈希函数生成多个哈希值,并对每个生成的哈希值对应的 bit 位置 1
-
核心思想
- 使用多个哈希函数,增大随机性,减少 hash 碰撞的概率
- 扩大数组范围,使 hash 值均匀分布,进一步减少 hash 碰撞的概率
注意:缓存穿透不能完全解决,只能将其控制在一个可以容忍的范围内。
缓存击穿
现象
数据库访问压力瞬间增大,redis里面没有出现大量的key过期,redis正常运行
对于一些设置了过期时间的 key,如果这些 key 可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,这个和缓存雪崩的区别在于这里针对某一 key 缓存,前者则是很多 key。
解释
redist某个key过期了,大量访问使用这个key
解决
- 预先设置热门数据到key里,加大这些热门数据的时长
- 实时监控key的过期时间
- 使用锁,当查询为空时,让它之后再查询(互斥锁)
缓存雪崩
现象
数据库压力变大,服务器崩溃
解释
极少的时间段里,查询大量的key集中过期情况
解决
- 构建多级缓存架构,nginx缓存+redis缓存+其他缓存(ehcahe等)
- 使用锁或队列(降低效率)
- 设置过期标志更新缓存,触发另外的线程后台去更新key的缓存
- 将缓存失效时间分散开