redis开发中常见问题以及解决方案

缓存穿透

生成原因

缓存穿透是在指查询一定不存在的数据时,由于当缓存不命中时需要从数据库中查询,查询不到数据
则不写入缓存,这将导致每次请求这个不存在的数据时都要去数据库中查询

解决方案


 1. 布隆过滤器:在持久层查询不到数据就向redis中缓存空结果,查询时先判断是否existskey),如果有直接返回空,如果没有则查询后返回
 	--BloomFilter:根据Google的BloomFilter编写一个RedisBloomFilter来获取数据库中一定不存在的数据(会有些许容错率)
 	--BloomFilter缺点:BloomFilter维护起来非常麻烦(不能进行删除);向数据库中添加数据时,也要向BloomFilter中添加本条数据
 2. 缓存null对象:当insert时需要清除查询的key,否则即便DB中有值也查询不到(也可以为空缓存设置过期时间)
 	---在传参的URL中进行加密

缓存雪崩

缓存雪崩:缓存大量失效时,引发大量查询数据库

解决方案


 1. 用锁/分布式锁/队列串行访问
 2. 缓存失效时间均匀分布	

具体实现

1. 加锁排队(限流)--在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量
	--例如对某个key只允许一个线程进行查询数据和写缓存,其他线程等待
2. 数据预热--可以通过缓存reload机制,预先去更新缓存,在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀

热点key

当某个key访问非常频繁时key失效,导致大量线程来构建缓存,导致负载增加,系统崩溃

解决方案


 1. 使用锁:单机时用synchronized,lock;集群使用分布式锁
 	--	双重检查锁
 2. 缓存过期时间不设值,而是设值key对应的value中,如果检测到存在的时间超过过期时间则异步更新缓存
 3.value中设置一个比过期时间小的过期时间值,当小的时间过期后,延长小时间并做更新缓存操作
 4. 设置标签缓存,标签缓存设置过期时间,当标签缓存过期后,需要异步更新实际缓存

你可能感兴趣的:(redis)