redis过期策略六种 redis过期数据处理

Redis数据的过期与淘汰内存淘汰管理机制Memory Management 当内存占满之后 , redis提供缓存淘汰机制 。
那对于过期数据,一般有三种方式进行处理:Redis的过期删除策略: 惰性删除 和 定期删除 两种策略配合使用 。spring-boot-starter-data-redis 包中提供了监听过期的类,对于key过期,需要得到通知 , 做业务处理的 , 可以做此监听 。
redis根据maxmemory-samples随机抽取一部分数据,将最旧的数据淘汰,指到内存降下来 。
Redis的过期数据会被立马删除吗?先说结论,并不会立马删除,Redis 有两种删除过期数据的策略:该命令在 Redis 4 版本,过期时间并不是很精确,它可能在零到一秒之间 。从 Redis 6 开始,过期错误为 0 到 1 毫秒 。
惰性删除不会去主动删除数据,而是在访问数据的时候,如果发现数据已经过期,就会自动删除 。定期删除则是每隔一段时间就检查一次是否有过期的数据,如果有的话就进行删除 。
也称被动删除,当数据过期后,并不会马上删除 。而是等到有请求访问时,对数据检查,如果数据过期,则删除数据 。优点:不需要单独启动额外的扫描线程,减少了CPU资源的损耗 。
Redis主从模式下过期数据和数据不一致数据到达过期时间,并不做处理,而是等下次访问该数据时,先判断该数据是否过期,未过期,返回数据 ;发现已过期,删除该数据,返回不存在 。这种方式虽然节约 CPU 性能,发现必须删除的时候才删除 。
从库不会进行过期扫描 , 主库删除时,会在AOF文件里增加一条del指令 , 同步到所有从库,从库通过此指令来删除 。由于指令的同步存在异步 , 所以会出现主从数据不一致的情况 。
因为指令同步是异步进行的,所以主库过期的 key 的 del 指令没有及时同步到从库的话,会出现主从数据的不一致 这是由 redis 的过期策略来决定 。redis 过期策略是: 定期删除+惰性删除。
原因一:跟 Redis 的版本有关系,Redis 2 之前版本,读从库并不会判断数据是否过期,所以有可能返回过期数据 。解决方案:升级Redis的版本,至少要2 以上版本,读从库 , 如果数据已经过期,则会过滤并返回空值 。
Redis 对于已经过期的数据,采用两种策略来处理这些数据,分别是惰性删除和定期删除 。惰性删除不会去主动删除数据,而是在访问数据的时候,如果发现数据已经过期,就会自动删除 。
redis查询到已经过期数据原因1、(被动)惰性删除:当客户端请求到一个已经过期的key时,redis会检查是否过期并删除 所以,虽然key过期了,但是没被清理的话,还是会占内存的 。
2、如果 读取的是 Slave 库,则有可能会拿到过期数据,一般造成这样原因有两个 。这样的场景由于 Redis 控制不住过期数据被客户端应用误读,形成数据不安全 。
3、由于指令的同步存在异步,所以会出现主从数据不一致的情况 。当Redis内存超出物理内存限制时,内存数据会开始和磁盘产生频繁的交换,使得性能急剧下降 。
4、Redis 对于已经过期的数据,采用两种策略来处理这些数据,分别是惰性删除和定期删除 。惰性删除不会去主动删除数据,而是在访问数据的时候,如果发现数据已经过期 , 就会自动删除 。
5、当然这还不够,因为有过期的key永远不会被再次访问 。这些key无论如何都应该过期 , 所以周期性地Redis会在具有过期设置的key中随机测试几个key 。已经过期的所有key都将从key空间中删除 。
redis开个线程扫过期订单1、时间不精准 。一般定时任务基于固定的频率、按照时间定时执行的,那么就可能会发生很多订单已经到了超时时间,但是定时任务的调度时间还没到 , 那么就会导致这些订单的实际关闭时间要比应该关闭的时间晚一些 。
2、集中处理 Redis会将设置了过期时间的key放到一个独立的字典里,默认每秒10次过期扫描 。扫描方式:为防止扫描时间过长,扫描时间限制为25ms,开发时应尽量避免大量key同时过期 。
3、定期删除 。每隔一段时间,默认100ms,Redis会随机挑选一定数量的Key,检查是否过期,并将过期的数据删除 。原因一:跟 Redis 的版本有关系,Redis 2 之前版本 , 读从库并不会判断数据是否过期,所以有可能返回过期数据 。
4、不会 。Redis是单线程的,在多个Client并发操作时,秉承“先发起先执行”的原则,其它的处于阻塞状态 。因此不会同时监听 。
【redis过期策略六种 redis过期数据处理】5、定期删除策略:Redis 启用一个定时器定时监视所有的 key,判断key是否过期 , 过期的话就删除 。

    推荐阅读