本文知识点
过期数据概念
数据删除策略
逐出算法
Redis删除策略
过期数据
先来看三个key值,分别为sex、name、age。
这三个值设置的指令为 set name kaka setex age 100 24 setex sex 10 1
在redis中我们可以使用ttl来获取某个key的状态,下面我们来使用ttl分别获取一下上边name、age、sex的状态
可以看到出来了三个值,分别为 -1 775 -2
那么这三个值给出的信息是什么呢!
- -1 表示永久有效的数据
- 775 这个值是设置在age上,使用的指令为setex age 1000 24,表示为剩余有效时间
- -2 表示已经过期的数据,或者是被删除的数据,或者说是么有定义的数据
过期数据的存储结构
- 当我们设置一个带有时效性的name时,redis存储的是一个内存地址0x10101
- 然后redis会再开辟一个空间用来存储带有时效性的key
- 但是存储方式是key对应的内存地址 和 过期时间
那么今天我们所说的redis删除策略,就是删除的这部分数据。
定时删除
定时删除就是写一个定时器,然后当key的时间过期后,定时器任务立即对过期的key进行删除
优点:可想而知key到期就删,肯定对内存时最友好的,节约内存
缺点:redis单线程的特性是所有的命令都在按照一定的顺序进行执行。key值到期就删cpu的压力就会变大,会直接影响到redis服务器响应时间和IO
定时删除就是用时间来换取空间
当执行完定时删除后,key值对应的数据会被删除,同时在过期的内存区里边也会直接删除。
惰性删除
在来看这个图当key值过期后不会直接删除,那是什么时候删除呢!继续往下看
当我们使用惰性删除时,数据到期了也不会自动删除,那么他的删除方式是,在下一次在获取这个key值时,会做一个判断,判断这个key是否过期,如果过期了在执行删除。
也就是说当再次执行get name时 会走一个函数expirelfNeeded() 这个函数就是判断此key是否过期的。过期的返回nil,然后从内存在进行删除
优点:会减少一定的CPU性能,只有到必须要删的时候才会删除
缺点:那肯定就是内存压力大了,例如一些热点新闻,热点过了就基本没人访问了,没有人访问这个key就一直存在,就会出现长期占用一定的内存空间
也就说这种方式是用空间换时间