赞
踩
通过expire,expireat,pexpire,pexpireat命令对key添加过期时间
expire key seconds # 设置键在给定秒后过期
pexpire key milliseconds # 设置键在给定毫秒后过期
expireat key timestamp # 到达指定秒数时间戳之后键过期
pexpireat key timestamp # 到达指定毫秒数时间戳之后键过期
redis使用的过期键值删除策略是:惰性删除加上定期删除,两者配合使用。
在redis中有一个单独的空间专门存储expire的数据,expire是以hash的数据结构存储的
expires 是hash 的key,原数据的存储地址是hash的field,设置的过期时间则是hash的value
redis有三种数据删除策略,分别是定时删除、惰性删除、定期删除
创建一个定时器,当key设置有过期时间且过期时间到达时,由定时器任务立即执行对键的删除操作
优点:节省内存,快速释放
缺点:cpu压力大,删除操作会影响redis响应时间和吞吐量
数据到达过期时间时不删除,等到下次访问到该数据时删除
在所有get命令执行之前都会先执行expireIfNeed()方法,
优点:节约cpu性能,过期的时候不会立即删除
缺点:内存空间占用过多,很多已经过期的数据可能长期占用内存
redis启动服务器初始化时,会读取配置文件中的hz的值,默认为10
hz表示每秒执行serverCron()的次数
serverCron()方法里会执行databaseCron()方法,databaseCron()的功能就是遍历16个redis的数据库
同时databaseCron()方法还调用了activeExpireCycle()
1.activeExpireCycle()对每个数据库内的expires逐一进行检测,每次执行250ms/hz
2.对某个expires检测时,随机挑选W个key进行检测
3.如果key超时,则删除key
4.如果删除的key的数量>W*25%,则回到步骤2
5.如果删除的key的数量<W*25%,则开始检测下一个expires
其中W的值由ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性值决定
当前activeExpireCron()方法执行到哪个数据库会存储到current_db中
当activeExpireCycle()执行时间到期,下次会从current_db记录的地方继续执行
占用固定的cpu资源来进行检查和删除过期数据
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。