Java 线程池
拒绝策略
- AbortPolicy:拒绝处理新任务并抛出RejectExecutionException
- CallerRunPolicy:调用 执行execute()方法的线程 来运行被拒绝的新任务。
- DiscardPolicy:不处理新任务,直接丢弃
- DiscardOldestPolicy:丢弃最早未被处理的任务(等待时间最长的任务)
Redis
过期删除策略
惰性删除:只在访问数据时进行过期检查,缺点:太多过期key没有被删除
定期删除:周期性随机抽查一批设置了过期时间的key,如果过期就删除。对内存友好,对CPU不友好
延迟队列:设置了过期时间的加入到延迟队列,过期就删除(类似定时任务)
定时删除:每个设置了过期时间的key一过期就删除,需要每个键单独设置定时器
Redis采用 定期删除+惰性/懒汉式删除 相结合的策略。
淘汰策略
不淘汰(默认策略,noeviction)
noeviction:不删除任何 key,写操作直接返回 OOM 错误。读请求正常。
volatile-设置了过期时间的key
只看设置了 expire 的键,永不过期的 key 完全不动。
volatile‑lru:过期 key 里,淘汰最近最少使用 LRUvolatile‑lfu:过期 key 里,淘汰访问频次最低 LFUvolatile‑ttl:过期 key 里,淘汰剩余存活时间最短(TTL 最小,马上要过期)volatile‑random:过期 key 里,随机删除
如果所有带过期的 key 删完,内存还不够 → 退化成
noeviction,写报错。
Allkey
所有 key,不管有没有设置过期时间,都参与淘汰。
allkeys‑lru:全部 key,淘汰最近最少使用allkeys‑lfu:全部 key,淘汰访问频次最低allkeys‑random:全部 key,随机删除
