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         }

输出结果

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

删除过期键

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

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

惰性删除:已经过期了的键值没有在定期删除里被删掉,除非系统用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:在所有数据里面挑选最不常使用的删除