redis键的过期和内存淘汰策略

Posted huanglf714

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis键的过期和内存淘汰策略相关的知识,希望对你有一定的参考价值。

键的过期时间

设置过期时间

Redis可以为存储在数据库中的值设置过期时间,作为一个缓存数据库,这个特性是很有帮助的。我们项目中的token或其他登录信息,尤其是短信验证码都是有时间限制的。

按照传统的方法都是项目本身判断过期,这样无疑影响了系统性能。

redis可以为set或者expire两种方式为键设置过期时间

 1         Jedis jedis = new Jedis("localhost");
 2         //nxxx:nx是不存在是才set,xx是存在时才set
 3         //expx:EX是秒,PX是毫秒
 4         jedis.set("key","value","XX","PX",1000);
 5         Thread.sleep(2000);
 6         String value = jedis.get("key");
 7         if(value==null||"".equals(value))
 8             System.out.println("已过期");
 9         else
10             System.out.println(value);
11         
12         jedis.set("key","value");
13         jedis.expire("key",10000);
14         value = jedis.get("key");
15         if(value==null||"".equals(value))
16             System.out.println("已过期");
17         else
18             System.out.println(value);
19         

输出结果

技术图片

 

删除过期键

为一个键设置了过期时间为一个小时,那么一个小时之后如何处理这个键呢?有两种方式:定期删除和惰性删除

定期删除:每隔一定的时间就在设置了过期时间的键里面随机挑选一些删除

惰性删除:已经过期了的键值没有在定期删除里被删掉,除非系统用get去查那个key才会被删除

由此我们可以看到如果定期删除留下了很多过期的key,又没有及时去查让惰性删除发挥作用,就会在redis内存中占用大量空间,导致redis内存块被耗尽。

为了解决这个问题,redis提供了内存淘汰策略

 

内存淘汰策略

 

redis提供了6种内存淘汰策略

1、voilate-lru:在设置了过期时间的数据里面挑选最近最少被使用的删除

2、voilate-ttl:在设置了过期时间的数据里面挑选将要过期的删除

3、voilate-random:在设置了过期时间的数据里面随机挑选一些删除

4、allkeys-lru:在所有数据里面挑选最近最少被使用的删除

5、allkeys-random:在所有数据里面随机挑选一些删除

6、no-eviction:禁止驱逐数据,不允许新数据插入

4.0版本之后增加了两种

7、violate-lfu:在设置了过期时间的数据里面挑选最不常使用的删除

8、allkeys-lfu:在所有数据里面挑选最不常使用的删除

 

 

 

技术图片

以上是关于redis键的过期和内存淘汰策略的主要内容,如果未能解决你的问题,请参考以下文章

Redis 键的过期删除策略及缓存淘汰策略

Redis过期删除策略和内存淘汰策略

Redis的缓存淘汰策略LRU与LFU

Redis 过期删除策略和内存淘汰机制

Redis中Key的过期策略和淘汰机制

Redis过期键删除策略和内存淘汰策略