ARTICLE

后端八股:Java 线程池与 Redis

Java 线程池

拒绝策略

  • AbortPolicy:拒绝处理新任务并抛出RejectExecutionException
  • CallerRunPolicy:调用 执行execute()方法的线程 来运行被拒绝的新任务。
  • DiscardPolicy:不处理新任务,直接丢弃
  • DiscardOldestPolicy:丢弃最早未被处理的任务(等待时间最长的任务)

Redis

过期删除策略

惰性删除:只在访问数据时进行过期检查,缺点:太多过期key没有被删除

定期删除:周期性随机抽查一批设置了过期时间的key,如果过期就删除。对内存友好,对CPU不友好

延迟队列:设置了过期时间的加入到延迟队列,过期就删除(类似定时任务)

定时删除:每个设置了过期时间的key一过期就删除,需要每个键单独设置定时器

Redis采用 定期删除+惰性/懒汉式删除 相结合的策略。

淘汰策略

不淘汰(默认策略,noeviction)

noeviction:不删除任何 key,写操作直接返回 OOM 错误。读请求正常。

volatile-设置了过期时间的key

只看设置了 expire 的键,永不过期的 key 完全不动。

  1. volatile‑lru:过期 key 里,淘汰最近最少使用 LRU
  2. volatile‑lfu:过期 key 里,淘汰访问频次最低 LFU
  3. volatile‑ttl:过期 key 里,淘汰剩余存活时间最短(TTL 最小,马上要过期)
  4. volatile‑random:过期 key 里,随机删除

如果所有带过期的 key 删完,内存还不够 → 退化成 noeviction,写报错。

Allkey

所有 key,不管有没有设置过期时间,都参与淘汰。

  1. allkeys‑lru:全部 key,淘汰最近最少使用
  2. allkeys‑lfu:全部 key,淘汰访问频次最低
  3. allkeys‑random:全部 key,随机删除
本文由 Guailper 撰写CC BY-NC-SA 4.0