redis内存淘汰策略

2020-05-29  本文已影响0人  sunpy

什么时候执行内存淘汰策略

redis为内存数据库,当redis内存耗尽的时候,将执行内存淘汰策略(就是抛弃一些key)。内存耗尽也是由于定期删除还未执行,而惰性删除访问却也没有执行,造成内存积压太多key,导致内存耗尽。

redis内存淘汰策略

no-eviction :当没有可用内存容纳新写入数据时,新写入的操作将报错,redis默认淘汰策略。

maxmemory-policy noeviction

测试:

127.0.0.1:6380> config set maxmemory 512k
OK
127.0.0.1:6380> config get maxmemory
1) "maxmemory"
2) "512000"
Jedis jedis = new Jedis("XX.XX.XXX.XXX", 6380);  //指定Redis服务Host和port   
jedis.connect();
        
int i = 0;
        
try {
    for (; i < Integer.MAX_VALUE ; i++) {
        jedis.set("v"+i, UUID.randomUUID().toString());
    }
} catch (Exception e) {
    e.printStackTrace();
} finally {
    jedis.close();
}
OOM command not allowed when used memory > 'maxmemory'.

2. allkeys-random
当内存不足容纳新写入数据,随机删除key。

127.0.0.1:6380> config get maxmemory
1) "maxmemory"
2) "1024000"
127.0.0.1:6380> config get maxmemory-policy
1) "maxmemory-policy"
2) "allkeys-random"
int i = 0;
for (; i < 3000 ; i++) {
    jedis.set("v"+i, String.valueOf(i));
}

结果:

127.0.0.1:6380> DBSIZE
(integer) 2803

查看appendonly.aof日志(部分):

DEL
$5
v1428
*2
$3
DEL
$3
v91
*2
$3
DEL
$4
v840
*2
$3

3. volatile-random
当内存不足容纳新写入数据,在设置过期时间中的key进行随机删除。
4. volatile-ttl
当内存不足容纳新写入数据,优先移除过期时间最早的key。
5. allkeys-lru
当内存不足容纳新写入数据,将最近最少使用的key删除。

127.0.0.1:6380> config get maxmemory-policy
1) "maxmemory-policy"
2) "allkeys-lru"
int i = 0;
for (; i < 2800 ; i++) {
    jedis.set("v"+i, String.valueOf(i));
}
127.0.0.1:6380> DBSIZE
(integer) 2208

6. volatile-lru
当内存不足容纳新写入数据,在设置过期时间且最近最少使用的key删除。

上一篇 下一篇

猜你喜欢

热点阅读