开发者社区> 问答> 正文

redis中的数据过期后如何处理?

redis可以设置数据过期时间,如果一个数据过期是如何处理的呢?
是有一个计时器实时删除吗?这样太低效了。是下次使用的时候再判断吗?这样随着数据的增多,会不会判断时间越来越长?

展开
收起
落地花开啦 2016-02-29 15:21:40 5304 0
1 条回答
写回答
取消 提交回答
  • 喜欢技术,喜欢努力的人

    仅供参考
    通过查看dbDelete的调用者,首先注意到这一个函数,是用来删除过期key的。
    1
    ifNeed表示能删则删,所以4行没有设置超时不删,7行在"loading"时不删,16行非主库不删,21行未到期不删。25行同步从库和文件。
    再看看哪些函数调用了expireIfNeeded,有lookupKeyRead,lookupKeyWrite,dbRandomKey,existsCommand,keysCommand。通过这些函数命名可以看出,只要访问了某一个key,顺带做的事情就是尝试查看过期并删除,这就保证了用户不可能访问到过期的key。但是如果有大量的key过期,并且没有被访问到,那么就浪费了许多内存。Redis是如何处理这个问题的呢。
    dbDelete的调用者里还发现这样一个函数:
    2
    这个函数的意图已经有说明:删一点点过期key,如果过期key较少,那也只用一点点cpu。25行随机取一个key,38行删key成功的概率较低就退出。这个函数被放在一个cron里,每毫秒被调用一次。这个算法保证每次会删除一定比例的key,但是如果key总量很大,而这个比例控制的太大,就需要更多次的循环,浪费cpu,控制的太小,过期的key就会变多,浪费内存——这就是时空权衡了。
    最后在dbDelete的调用者里还发现这样一个函数:
    void freeMemoryIfNeeded(void)
    这个函数太长就不再详述了,设置这个参数的意义是,你把redis当做一个内存cache而不是key-value数据库。

    以上3种删除过期key的途径,第二种定期删除一定比例的key是主要的删除途径,第一种“读时删除”保证过期key不会被访问到,第三种是一个当内存超出设定时的暴力手段。
    由此也能看出redis设计的巧妙之处,

    2019-07-17 18:50:22
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Redis在唯品会的应用实践——架构演进与功能定制 立即下载
微博的Redis定制之路 立即下载
云数据库Redis版的开源之路 立即下载