Redis之惰性删除

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis之惰性删除

场景

使用del指令删除key时,redis会直接释放对象的内存,当对象很小时这个指令速度是很快的,但是如果是一个很大的对象被del时,那么删除操作就会比较耗时,造成其他指令阻塞,对客户端造成卡顿的现象。

unlink

Redis在4.0版本中引入了unlink指令,可以对删除操作进行懒处理,丢给后台线程异步回收内存。

unlink youkey

注意,虽然是异步删除,但并不会引发并发问题,因为unlink指令发出后,该key将从redis有效数据结构中移除,其他线程无法再获取到它。

flush

redis提供了 flushdbflushall 用于清空数据库,清空整个redis db也是一个非常耗时的操作,在4.0版本中,在指令后面增加一个 async 参数就可以进行异步的清空了。

flushall async

异步队列

异步删除的操作一般会被放到一个异步队列中,后台线程会从这个队列中取任务进行删除处理,该队列同时被主线程和异步线程同时操作,因此是一个线程安全的队列。

image.png

不过不是所有的 unlink 操作都会延后处理,如果要操作的对象占用内存较小,就没必要丢到异步队列中处理了,而是直接删除回收内存。

AOF Sync

AOF日志sync到磁盘也是一个很慢的操作,为了减少因为宕机导致的数据丢失,Redis一般1s(可配置)同步一次,这个操作会导致主线程效率下降,

因此AOF Sync操作也被放到异步线程中操作,执行Sync操作的线程是一个独立的线程,和懒惰删除的线程不是一个,Sync异步线程拥有一个自己的任务队列,队列里只存放AOF Sync任务。

其他异步删除点

除del与flush操作外,Redis在key的过期、LRU淘汰、rename指令过程中,都会实施内存回收,还有一种特殊操作,

即发生于正在进行全量同步的从节点中,在接受完整的rdb文件之后,也需要将当前内存一次性清空,随后加载rdb文件进行内容恢复。

在redis4.0中打开如下选项可对这些删除点进行异步操作的支持:

  1. slave-lazy-flush:从节点接收完毕rdb后进行异步flush
  2. lazyfree-lazy-eviction:执行LRU淘汰时异步删除
  3. lazyfree-lazy-expire:key过期时异步删除
  4. lazyfree-lazy-server-del:rename删除destkey异步执行
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
4月前
|
存储 NoSQL 算法
Redis过期处理策略、惰性删除、定期删除、RDB和AOF、内存淘汰机制
Redis过期处理策略、惰性删除、定期删除、RDB和AOF、内存淘汰机制
|
12月前
|
NoSQL 安全 Redis
Redis进阶-Redis的惰性删除
Redis进阶-Redis的惰性删除
156 0
|
NoSQL 算法 Java
75. 说说Redis的过期键删除策略吧
75. 说说Redis的过期键删除策略吧
110 0
75. 说说Redis的过期键删除策略吧
|
存储 NoSQL Java
SpringBoot集成Redis业务功能 02、定时任务+Redis删除特定前缀key的优雅实现
SpringBoot集成Redis业务功能 02、定时任务+Redis删除特定前缀key的优雅实现
|
NoSQL Java Linux
Redis - Java使用RedisTemplate模糊查询/删除key
Redis - Java使用RedisTemplate模糊查询/删除key
4107 0
|
存储 NoSQL 算法
Redis删除策略和逐出策略(2)
Redis删除策略和逐出策略
154 0
Redis删除策略和逐出策略(2)
|
存储 NoSQL 算法
Redis删除策略和逐出策略
Redis删除策略和逐出策略
105 0
Redis删除策略和逐出策略
|
NoSQL Unix Redis
Redis 的数据过期了是否会马上删除
Redis 的数据过期了是否会马上删除
304 0
Redis 的数据过期了是否会马上删除
|
监控 NoSQL Java
redis 删除大key集合的方法
redis大key,这里指的是大的集合数据类型,如(set/hash/list/sorted set),一个key包含很多元素。由于redis是单线程,在删除大key(千万级别的set集合)的时候,或者清理过期大key数据时,主线程忙于删除这个大key,会导致redis阻塞、崩溃,应用程序异常的情况。
1401 0
|
存储 NoSQL Redis
Redis集群:主从节点添加和删除
Redis集群:主从节点添加和删除
535 0
Redis集群:主从节点添加和删除