什么时候执行内存淘汰策略
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删除。
网友评论