redis设置过期时间:
expire key time(以秒为单位)–这是最常用的方式
setex(String key, int seconds, String value)–字符串独有的方式
**
三种过期策略
定时删除
在设置key的过期时间时,同时为每个key设置个定时器,在过期时将其移除。
优点:保证内存尽快被释放。
缺点:如果key的存活时间较短,则删除key会占用大量CPU时间片。(性能不好)
惰性删除,memcached采用
key过期的时候,并不删除。而是每次获取的时候,检查是否过期,若过期,则删除并返回null。
优点:无需定时器,不浪费CPU时间片
缺点:如果大量的key在添加后,并不被访问,则这些垃圾将浪费空间(可以认为是内存泄露,即无用的垃圾占用了大量内存)
定期删除
每隔一段时间执行一次删除过期key操作
优点:
- 通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用–处理”定时删除”的缺点
- 定期删除过期key–避开“惰性删除”的缺点
缺点:相比“定时删除”,内存不会及时释放。相比“惰性删除”,会浪费CPU时间片。
redis 的过期策略
惰性删除+定期删除
懒汉式删除流程:
- 在进行get或setnx等操作时,先检查key是否过期;
- 若过期,删除key,然后执行相应操作;
- 若没过期,直接执行相应操作;
定期删除流程(简单而言,对指定个数个库的每一个库随机删除小于等于指定个数个过期key):
- 遍历每个数据库(就是redis.conf中配置的”database”数量,默认为16)
- 检查当前库中的指定个数个key(默认是每个库检查20个key,注意相当于该循环执行20次,循环体是下边的描述)
- 如果当前库中没有一个key设置了过期时间,直接执行下一个库的遍历
- 随机获取一个设置了过期时间的key,检查该key是否过期,如果过期,删除key
- 判断定期删除操作是否已经达到指定时长,若已经达到,直接退出定期删除。
对于定期删除,在程序中有一个全局变量current_db来记录下一个将要遍历的库,假设有16个库,我们这一次定期删除遍历了10个,那此时的current_db就是11,下一次定期删除就从第11个库开始遍历,假设current_db等于15了,那么之后遍历就再从0号库开始(此时current_db==0)