缓存异常

一 缓存穿透

   缓存与数据库中都没有的数据,同一时间大量请求涌入造成DB压力

  • 缓存空对象
redisTemplate.opsForValue().set(key, null, 30, TimeUnit.SECONDS);

         缺点:如果大量key穿透,占用内存空间;       缓存null期间如果数据库有了key数据,会造成数据不一致

  • 布隆过滤器 - 位数组+k个哈希函数的数据结构,数据通过k个哈希函数定位到位数组的k个点,如果这k个点都为1,那么数据存在,如果有一个是0,那么数据不存在

        优点:节约空间;  时间复杂度低;

        缺点:准确率有误;  不能删除元素;

 

二 缓存击穿

    某个热点key在失效瞬间大量请求涌入造成DB压力

  •  不失效  -  如果需要更新起线程异步更新

         缺点:无法保证数据一致性

  •  互斥锁/分布式锁  -  如果需要更新一个线程做更新其它线程等待

         缺点:吞吐量降低

         

三 缓存雪崩

类缓存击穿,大量热点key失效

  • 不失效
  • 互斥锁/分布式锁
  • 设置不同失效时间
redisTemplate.opsForValue().set(Key, value, time + Math.random() * 1000, TimeUnit.SECONDS);

 

四 缓存预热

  • 数据量小,不需要预热
  • 数据量不大,系统启动加载缓存
  • 数据量大,定时任务加载缓存
  • 数据量超大,优先热点key加载缓存

 

五 缓存降级

可以将部分热点数据缓存到服务内存,类似HashMap、Guava这样的;

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,我们可以使用 Map 来实现异常信息的缓存。具体实现如下: ``` public class ExceptionCache { private static Map<String, String> cacheMap = new ConcurrentHashMap<>(); public static String getStackTrace(Throwable throwable) { String key = throwable.getClass().getName() + ":" + throwable.getMessage(); String stackTrace = cacheMap.get(key); if (stackTrace == null) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); throwable.printStackTrace(pw); stackTrace = sw.toString(); cacheMap.put(key, stackTrace); } return stackTrace; } } ``` 在上面的代码中,我们定义了一个静态变量 `cacheMap`,用来存储异常信息。在 `getStackTrace` 方法中,我们首先根据异常名称和异常信息生成一个唯一的 key,然后从缓存中获取这个 key 对应的异常信息。如果缓存中没有这个异常信息,则使用 StringWriter 和 PrintWriter 将异常信息转化为字符串,然后将它存入缓存中。最后返回这个异常信息字符串。 使用这个异常信息缓存的方法很简单,只需要在需要获取异常信息的地方调用 `ExceptionCache.getStackTrace()` 方法即可: ``` try { // some code that may throw an exception } catch (Exception e) { String stackTrace = ExceptionCache.getStackTrace(e); // do something with the exception stack trace } ``` 这样,我们就可以在程序中方便地缓存和获取异常信息了。注意,在实际应用中,我们还需要考虑缓存的清理和过期机制,防止缓存过多占用过多内存或者缓存异常信息已经过期不再有意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值