Redis——如何解决redis穿透、雪崩、击穿问题

这篇具有很好参考价值的文章主要介绍了Redis——如何解决redis穿透、雪崩、击穿问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、查询商品信息的常规代码示例

  • 查询商品信息的常规代码示例
/**
*查询商品信息
*/
public ExpressInfo findByDeliveryOrderId(Long id){
	String key="xz-express:expmess-info:"
	//从 Redis查询物流信息
	Object obj = 	redisTemplate.opsForValue().get( key + id);
	if (obi != null) [
		return (ExpressInfo) obj; 
	}else {
		ExpressInfo expressInfo= expressMapper,selectByDeliveryOrderId(id);//数据库查询	
		if(expressInfo l= nul1){ 
			redisTemplate,opsForValue(),set(key + d,expressInfo,Duration,ofHours(2));
			return expressInfo;
 		}else {
 			throw new clientException("发货单,的物流信息不存在",id);
 		}
	}
}
		

二、缓存击穿

2.1、缓存击穿的理解

  • 高并发时,当一个kev非常热点(类似于爆款)在不停的扛着大并发当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库并设置到缓存中,导致性能下降。
    Redis——如何解决redis穿透、雪崩、击穿问题,redis,redis

2.2、缓存击穿的解决方案

  • 设置缓存永不过期
  • 加锁排队

2.3、解决缓存击穿的代码示例

  • 代码示例

    /**
    *查询商品信息
    */
    @Suppresswarnings("unchecked”)
    public ExpressInfo findByDeliveryOrderId(Long id){
    	String key="xz-express:expmess-info:"
    	//从 Redis查询物流信息
    	Object obj = 	redisTemplate.opsForValue().get( key + id);
    	if (obi == null) {
    		synchronized (this){
    			//进入 synchronized 一定要先再查询一次 Redis,防止上一个抢到锁的线程已经更新过了
    			obj = 	redisTemplate.opsForValue().get( key + id);
    			if(obj != null){
    				return (List<ProductCategory>) obj;
    			}
    			//数据库查询	
    			List<ProductCategory> categorylList = productCategoryMapper.selectProductCategory(id);
    			redisTemplate,opsForValue().set(key,categoryList,Duration.ofHours(2L));
    		}
    		return categorylList ; 
    	}else {
    		return (List<ProductCategory>) obj;
    	}
    }
    

三、缓存雪崩

3.1、缓存雪崩的理解

  • 缓存集中过期,或者缓存服务器宕机,导致大量请求访问数据库,造成数据库瞬间压力过大,宕机。
    Redis——如何解决redis穿透、雪崩、击穿问题,redis,redis

3.2、缓存雪崩的解决方案

3.2.1、缓存集中过期的情况
  • 加锁排队
  • 设置随机失效时间
3.2.2、缓存服务器宕机的情况
  • 提前部署好redis高可用集群(比如哨兵模式)
3.2.3、缓存服务器断电的情况
  • 提前做好灾备(多机房部署)

3.3、解决缓存雪崩(缓存集中过期)的代码示例

  • 代码示例

    /**
    *查询商品信息
    */
    @Suppresswarnings("unchecked”)
    public ExpressInfo findByDeliveryOrderId(Long id){
    	String key="xz-express:expmess-info:"
    	//从 Redis查询物流信息
    	Object obj = 	redisTemplate.opsForValue().get( key + id);
    	if (obi == null) {
    		synchronized (this){
    			//进入 synchronized 一定要先再查询一次 Redis,防止上一个抢到锁的线程已经更新过了
    			obj = 	redisTemplate.opsForValue().get( key + id);
    			if(obj != null){
    				return (List<ProductCategory>) obj;
    			}
    			//数据库查询	
    			List<ProductCategory> categorylList = productCategoryMapper.selectProductCategory(id);
    			//设置随机失效时间
    			Duration expire = DurationofHours(2L).plus(Duration.ofSeconds((Math .random() 100)));
    			redisTemplate,opsForValue().set(key,categoryList,expire);
    		}
    		return categorylList ; 
    	}else {
    		return (List<ProductCategory>) obj;
    	}
    }
    

四、缓存穿透

4.1、缓存穿透的理解

  • 数据库不存在缓存中也不存在,导致每次请求都会去查询数据库,这时的用户很可能是攻击者如发起为id为“-1”的数据或id为特别大(不存在的数据),导致数据库压力过大或宕机。
    Redis——如何解决redis穿透、雪崩、击穿问题,redis,redis

4.2、缓存穿透的解决方案

  • 参数校验
  • 缓存空对象
  • 布隆过滤器

4.3、解决缓存穿透的代码示例

  • 代码示例文章来源地址https://www.toymoban.com/news/detail-682245.html

    /**
    *查询商品信息
    */
    @Suppresswarnings("unchecked”)
    public ExpressInfo findByDeliveryOrderId(Long id){
    	String key="xz-express:expmess-info:"
    	//从 Redis查询物流信息
    	Object obj = 	redisTemplate.opsForValue().get( key + id);
    	if (obi == null) {
    		synchronized (this){
    			//进入 synchronized 一定要先再查询一次 Redis,防止上一个抢到锁的线程已经更新过了
    			obj = 	redisTemplate.opsForValue().get( key + id);
    			if(obj != null){
    				return (List<ProductCategory>) obj;
    			}
    			//数据库查询	
    			List<ProductCategory> categorylList = productCategoryMapper.selectProductCategory(id);
    			//设置随机失效时间
    			Duration expire = DurationofHours(2L).plus(Duration.ofSeconds((Math .random() 100)));
    			//从数据库中查询出的categoryList不管是否是空,都存到redis中
    			redisTemplate,opsForValue().set(key,categoryList,expire);
    		}
    		return categorylList ; 
    	}else {
    		return (List<ProductCategory>) obj;
    	}
    }
    

到了这里,关于Redis——如何解决redis穿透、雪崩、击穿问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis 如何解决缓存雪崩、缓存击穿、缓存穿透难题

    Redis 作为一门热门的缓存技术,引入了缓存层,就会有缓存异常的三个问题,分别是缓存击穿、缓存穿透、缓存雪崩。我们用本篇文章来讲解下如何解决! 缓存击穿 : 指的是缓存中的某个热点数据过期了,但是此时大量的并发请求访问这个key的值,此时因为缓存过期无法从

    2024年02月14日
    浏览(43)
  • 【Redis(8)】Spring Boot整合Redis和Guava,解决缓存穿透、缓存击穿、缓存雪崩等缓存问题

    在缓存技术的挑战及设计方案我们介绍了使用缓存技术可能会遇到的一些问题,那么如何解决这些问题呢? 在构建缓存系统时,Spring Boot和Redis的结合提供了强大的支持,而Guava的 LoadingCache 则为缓存管理带来了便捷的解决方案。下面我将介绍如何通过整合Spring Boot、Redis和Gu

    2024年04月22日
    浏览(48)
  • Redis - 三大缓存问题(穿透、击穿、雪崩)

    概念: 查询一个数据库中也不存在的数据,数据库查询不到数据也就不会写入缓存,就会导致一直查询数据库 解决方法: 如果数据库也查询不到,就把空结果进行缓存 缺点是 - 消耗内存 布隆过滤器的作用 :检索一个元素是否在某个集合中 布隆过滤器由组成 : 位图 + 若干

    2024年02月14日
    浏览(41)
  • redis缓存雪崩、穿透、击穿解决方案

    关于缓存异常,我们常见的有三个问题:缓存雪崩、缓存击穿、缓存穿透。这三个问题一旦发生,会导致大量请求直接落到数据库层面。如果请求的并发量很大,会影响数据库的运行,严重的会导致数据库宕机。 为了避免缓存异常带来的损失,我们需要了解每种异常的原因以

    2024年02月10日
    浏览(73)
  • Redis 击穿、穿透、雪崩产生原因解决思路

    大家都知道,计算机的瓶颈之一就是IO,为了解决内存与磁盘速度不匹配的问题,产生了缓存,将一些热点数据放在内存中,随用随取,降低连接到数据库的请求链接,避免数据库挂掉。需要注意的是,无论是击穿还是后面谈到的穿透与雪崩,都是在高并发前提下,比如当缓存中

    2024年01月20日
    浏览(45)
  • Redis缓存问题(穿透, 击穿, 雪崩, 污染, 一致性)

    目录 1.什么是Redis缓存问题? 2.缓存穿透 3.缓存击穿 4.缓存雪崩 5.缓存污染(或满了)    5.1 最大缓存设置多大    5.2 缓存淘汰策略 6.数据库和缓存一致性    6.1 4种相关模式    6.2 方案:队列+重试机制    6.3 方案:异步更新缓存(基于订阅binlog的同步机制) 在高并发的业

    2024年02月12日
    浏览(34)
  • Redis缓存问题:穿透,击穿,雪崩,双写一致性等

    在高并发场景下,数据库往往是最薄弱的环节,我们通常选择使用 redis 来进行缓存,以起到缓冲作用,来降低数据库的压力,但是一旦缓存出现问题,也会导致数据库瞬间压力过大甚至崩溃,从而导致整个系统崩溃.今天就聊聊常见的 redis 缓存问题. 缓存击穿 缓存击穿一般指redis中的一

    2024年04月27日
    浏览(51)
  • redis缓存穿透、缓存击穿、缓存雪崩及对应解决方法

    缓存穿透、击穿和雪崩是缓存使用中的常见问题,对它们的理解和相应的解决方法对于维护系统性能和稳定性至关重要。 定义 : 当客户端请求的数据在缓存中和数据库中都不存在时,该请求会直接打到数据库上,这种情况称为缓存穿透。如果持续请求这样的数据,会给数据

    2024年04月08日
    浏览(47)
  • Redis 性能管理/优化 双一致性问题 缓存雪崩/击穿/穿透

    used_memory_rss:是Redis向操作系统申请的内存。 used_memory:是Redis中的数据占用的内存。 mem_fragmentation_ratio:内存碎片率。 used_memory_peak:redis内存使用的峰值。 内存碎片如何产生的? Redis内部有自己的内存管理器,为了提高内存使用的效率,来对内存的申请和释放进行管理。

    2024年02月11日
    浏览(49)
  • Redis中的缓存雪崩、击穿、穿透的原因以及解决办法

    缓存雪崩、击穿、穿透一旦发生,会导致大量的请求积压到数据库层。如果请求的并发量很大,就会导致数据库宕机或是故障,这就是很严重的生产事故了。 俗话说,知己知彼,百战不殆。了解了问题的成因,我们就能够在应用Redis缓存时,进行合理的缓存设置,以及相应的

    2024年02月12日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包