思考:
1、不设置过时时间的key就一定不会过期一直存在吗?
2、设置了超时时间的key在超过超时时间后就一定会被清除吗?
一、redis删除策略采用的是定期删除和惰性删除:
定期删除:每隔一定时间间隔,将随机扫描其中的一定数量的key,校验key是否过期,过期即删除。
惰性删除:当去获取某key或者对某key设置值时,校验当前key是否过期,若过期则删除;
二、redis的内存策略:
redis有maxmemory 的设置,当数据占用的内存数量超过这个值时,则会调用自己的内存机制,根据不同的策略淘汰相应的数据,以回收内存。(很像jvm的gc)
1)noeviction: 拒绝写操作, 读、删除可以正常使用。默认策略,不建议使用;
2)allkeys-lru: 移除最近最少使用的key,最常用的策略;
3)allkeys-random:随机删除某个key,不建议使用;
4)volatile-lru:在设置了过期时间的key中,移除最近最少使用的key,不建议使用;
5)volatile-random:在设置了过期时间的key中,随机删除某个key,不建议使用;
6)volatile-ttl: 在设置了过期时间的key中,把最早要过期的key优先删除。
allkeys-lru中lru是Least recently used的缩写,最近很少使用的意思。
因此回过头看上面两个问题:
1、不一定,因为可能在redis内存回收时候使用了allkeys-lru策略,该未设置超时时间的key也被移除了;
2、不一定,因为惰性删除只是随机校验一定数量的key是否过期,因此可能存在该key已经过期,但是没有校验到,导致一直在内存中存在。
网友评论