Redis缓存雪崩、缓存穿透、热点Key

本文介绍了Redis缓存中常见的三个问题:缓存穿透、缓存雪崩以及热点Key,并提供了相应的解决方案。缓存穿透可通过使用互斥锁或布隆过滤器来缓解;缓存雪崩解决方案包括限制读数据库写缓存的线程数量、预加载缓存以及设置不同的过期时间;对于热点Key,可采用互斥锁或“永远不过期”策略确保资源保护和减少数据库压力。
摘要由CSDN通过智能技术生成

我们通常使用 缓存 + 过期时间的策略来帮助我们加速接口的访问速度,减少了后端负载,同时保证功能的更新。

1、缓存穿透

缓存系统,按照KEY去查询VALUE,当KEY对应的VALUE一定不存在的时候并对KEY并发请求量很大的时候,就会对后端造成很大的压力。

(查询一个必然不存在的数据。比如文章表,查询一个不存在的id,每次都会访问DB,如果有人恶意破坏,很可能直接对DB造成影响。)

由于缓存不命中,每次都要查询持久层。从而失去缓存的意义。

1.1 使用互斥锁排队

业界比价普遍的一种做法,即根据key获取value值为空时,锁上,从数据库中load数据后再释放锁。若其它线程获取锁失败,则等待一段时间后重试。这里要注意,分布式环境中要使用分布式锁,单机的话用普通的锁(synchronized、Lock)就够了。

public String getWithLock(String key, Jedis jedis, String lockKey,
			String uniqueId, long expireTime) {
   
		// 通过key获取value
		String value = redisService.get(key);
		if (StringUtil.isEmpty(value)) {
   
			// 分布式锁,详细可以参考https://blog.csdn.net/fanrenxiang/article/details/79803037
			// 封装的tryDistributedLock包括setnx和expire两个功能,在低版本的redis中不支持
			try {
   
				boolean locked = redisService.tryDistributedLock(jedis,
						lockKey, uniqueId, expireTime);
				if (locked) {
   
					value = userService.getById(key);
					redisService.set(key, value);
					redisService.del(lockKey);
					return value;
				} else {
   
					// 其它线程进来了没获取到锁便等待50ms后
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值