死去的记忆Redis过期数据的困境(redis 过期的数据)
随着时间的推移,不可避免的会存在一些已知(或未知)的资源被从系统中清理掉,这些资源必须会存在着过期的状态,即“死去的记忆”。
在Redis中,该可以让资源存在一种规定时间后自动失效的过程中也存在。有了它,可以避免过期资源占据过长的资源空间,从而节省内存开支,也可以防止系统其他正常操作遇到延迟等等问题。
Redis中可以利用EXPIRE和PEXPIRE来设置资源的过期时间,当资源存在时间大于设定的过期时间后,资源会被删除,并从存储中彻底清除掉。
但是,这里也存在一个问题,如果Redis中的资源设定的过期时间较长,但在过期之前,Redis服务停止了,则这些资源不管原先是否设定过期,则都将永远被保存在Redis中,形成“死去的记忆”,而在Redis重启之后,自然也就无法删除这部分已经过期的资源。
关于这块,Redis提供了名为RDB和AOF的持久化模式,其中RDB就是定时备份DB文件,可以避免资源过期时Redis服务器挂掉而导致的“死内存”问题,而AOF中提供了appendfsync来控制Redis服务器的fsync去避免死内存。
//RDB示例
node.rdb..active-defrag-hint
node.rdb..last-save
node.rdb..saving
//AOF示例appendfsync always
appendfsync everysecappendfsync no
总结来说,对于规定时间失效的资源,我们可以利用Redis的EXPIRE等数据失效机制,来正常处理此类问题,从而节省Redis存储空间。而如果出了意外,可以利用RDB和AOF来有效的避免清除“死去的记忆”而造成的资源的浪费以及其他问题。