主要内容
- redis的过期策略和内存淘汰机制
- 算法:字符流中第一个不重复的字符
redis的过期策略和内存淘汰机制
redis的过期策略
redis给键值对设置的过期时间的命令主要有两种:
1 | expire key 10 # 给制定的key设置过期时间为10秒 |
那么redis到底是如何处理这些过期的时间呢?
redis采用的定期删除和惰性删除的方式
定时删除:redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检测是否过期,并进行处理。定时删除并不能保证所有已经过期的key都被删除。所以还需要惰性删除的机制。
惰性删除:是指在获取某个key的时候,redis会再次检测一下,这个key是否过期,如果过期了,这个时候就进行删除。
因此,如果定时删除漏掉了许多的key,且没有进行惰性删除,那么会怎么样?内存中堆积大量过期的key,导致redis的内存耗尽,就需要内存淘汰机制。
内存淘汰机制
如果redis的内存占用过多的时候,此时会进行内存淘汰,内存淘汰的策略主要有以下几种:
noeviction:当内存不足以容纳新写入的数据时,新写入操作报错。
allkey-lru:当内存不足以容纳新写入的数据时,在键空间中移除最近最少使用的key。(这个时最常见的)
allkey-random:当内存不足以容纳新写入的数据时,在键空间中随机移除某个key。
volatile-lru:当内存不足以容纳新写入的数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
volatile-random:当内存不足以容纳新写入的数据时,在设置了过期时间的键空间中,随机移除某个key。
volatile-ttl:当内存不足以容纳新写入的数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。
算法:字符流中第一个不重复的字符
题目:
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l“。
分析:使用一个map来记录目前字符出现的次数,一个来记录字符出现的次序。
1 | public class Solution { |