Redis是一种内存级数据库,数据都存在内存中,但是针对于已经过期的数据,reids不会立刻删除
只是会存储在expires中,当执行删除策略的时候,才会从expires中寻找对应的数据存储的地址,在存储空间中找到对应的数据进行删除。
数据删除其实就是内存和CPU占用之间寻找平衡,CPU才能去处理事情,针对过期数据,要进行删除的时候,一半有三种策略
1.定时删除 顾名思义,当key设置有过期时间,时间到了,定时器任务立即执行删除,相当于消耗CPU来减少内存使用,拿时间换空间。
2.惰性删除 就是说,数据到达过期时间的时候,先不做处理,等到下次访问数据的时候,进行访问,如未过期,返回数据,如过期,则删除。这就相当于节约了CPU但占用了内存,拿空间换时间。
3.定期删除,就是以上两种的折中,Redis启动服务器初始化的时候,读取配置的server.hz的值,这个就是一秒钟执行的次数
每一秒钟执行server.hz次 ---->serverCron()----->databaseCron------->acticeExpireCycle() 对每一个expires检测,随机挑选W个key进行检测,如果key已经超时,则删除,要是这一轮中删除的key数量超过25%则循环这个过程,如果没有,则进入下一个expires检测。
数据淘汰策略
这个是redis内存不足的时,执行的,redis执行命令之前,都会用freeMemoryIfNeeded()方法,检测这次内存是否充足,如果不满足加入新数据,则会执行淘汰策略(淘汰未过期的数据)
检测易失去数据(一般是有定时,会过期的数据的)
volatile-lru:挑选最近最少使用的数据淘汰
volatile-lfu:挑选最近使用次数最少的数据淘汰
volatile-ttl:挑选将要过期的数据淘汰
volatile-random:任意选择数据淘汰
全库数据
allkeys-lru:挑选最近最少使用的数据淘汰
allkeLyRs-lfu::挑选最近使用次数最少的数据淘汰
allkeys-random:任意选择数据淘汰,相当于随机