redis的过期策略

redis的过期策略有哪些?

  • 设置过期时间(redis会采用定期删除、惰性删除的策略)

  • 定期删除

所谓定期删除,指的是redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。

注意:

实际上redis是每隔100ms随机抽取一些key来检查和删除的,定期删除可能会导致很多过期key到了时间并没有被删除掉。这里可不是每隔100ms就遍历所有的设置过期时间的key,那样就是一场性能上的灾难。redis基本上就死了。

  • 惰性删除

在你获取某个key的时候,redis会检查一下 ,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除,不会给你返回任何东西。并不是key到时间就被删除掉,而是你查询这个key的时候,redis再懒惰的检查一下。

  • 通过上述两种手段结合起来,保证过期的key一定会被干掉。

  • 我的数据明明都过期了,怎么还占用着内存啊?

redis中的过期key靠定期删除没有被删除掉,导致大量占用内存,导致redis的内存装不下数据,此时redis会进行内存淘汰。

  • 我redis里写的数据怎么没了?

很简单你写的数据太多,内存满了,或者触发了什么条件,redis lru,自动给你清理掉了一些最近很少使用的数据。

redis的内存淘汰的一些策略?

  • noeviction:当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了。

  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)。

  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的key给干掉啊。

  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key(这个一般不太合适)。

  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。

  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

手写一下LRU算法?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class LRUCache<K, V> extends LinkedHashMap<K, V> {

private final int CACHE_SIZE;

// 这里就是传递进来最多能缓存多少数据
public LRUCache(int cacheSize) {
super((int) Math.ceil(cacheSize / 0.75) + 1, 0.75f, true);
/*这块就是设置一个hashmap的初始大小,同时最后一个true指的是让
linkedhashmap按照访问顺序来进行排序,最近访问的放在头,最老访问的就在尾*/
CACHE_SIZE = cacheSize;
}

@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
// 这个意思就是说当map中的数据量大于指定的缓存个数的时候,就自动删除最老的数据
return size() > CACHE_SIZE;
}

}

如果本文对你有所帮助,请赏我1个铜板买喵粮自己吃,您的支持是我最大的动力!!!