Redis进阶-Redis的惰性删除
文章目录
- Pre
- del ------> unlink
- FLUSHDB/FLUSHALL --> FLUSHDB ASYNC/FLUSHALL ASYNC
- 异步队列
- AOF Sync
- 扩展阅读
Pre
Redis进阶-Redis对于过期键的三种清除策略
我们一直说 Redis 是单线程的,这里的我们默认指的都是Redis主要的工作线程,面向开发的。 实际上 Redis 内部实并不是只有一个主线程,它有很多个异步线程专门用来处理一些耗时的操作
del ------> unlink
删除指令 del 会直接释放对象的内存,大部分情况下,这个指令非常快,没有明显延迟。不过如果删除的 key 是一个非常大的对象,举个例子一个包含几千万元素的key,那么删除操作就会导致单线程卡顿。
Redis 为了解决这个卡顿问题,在 4.0 版本引入了 unlink 指令,它能对删除操作进行懒处理,丢给后台线程来异步回收内存。
192.168.18.131:8001> set artisan vv
-> Redirected to slot [4009] located at 192.168.18.133:8006
OK
192.168.18.133:8006> UNLINK artisan
(integer) 1
192.168.18.133:8006> UNLINK artisan
(integer) 0
192.168.18.133:8006>
FLUSHDB/FLUSHALL --> FLUSHDB ASYNC/FLUSHALL ASYNC
Redis 提供了 flushdb 和 flushall 指令,用来清空数据库,当数据量很大时,容易阻塞Redis。
Redis 4.0 同样给这两个指令也带来了异步化,在指令后面增加 async 参数扔给后台线程销毁,不会阻塞当前线程。
192.168.18.133:8006> FLUSHDB ASYNC
OK
192.168.18.133:8006> FLUSHALL ASYNC
OK
192.168.18.133:8006>
异步队列
主线程将对象的引用从「大树」中摘除后,会将这个 key 的内存回收操作包装成一个任务,塞进异步任务队列,后台线程会从这个异步队列中取任务。
任务队列被主线程和异步线程同时操作,所以必须是一个线程安全的队列。
不是所有的 unlink 操作都会延后处理,如果对应 key 所占用的内存很小,延后处理就没有必要了,这时候 Redis 会将对应的 key 内存立即回收,跟 del 指令一样。
AOF Sync
Redis 需要每秒一次(可配置)同步 AOF 日志到磁盘,确保消息尽量不丢失,需要调用
sync 函数,这个操作会比较耗时,会导致主线程的效率下降,所以 Redis 也将这个操作移到异步线程来完成。
执行 AOF Sync 操作的线程是一个独立的异步线程,和前面的懒惰删除线程不是一个线程,同样它也有一个属于自己的任务队列,队列里只用来存放 AOF Sync 任务
redis 4.0这次除了显示增加unlink、flushdb async、flushall async命令之外,还增加了4个后台删除配置项,分别为:
- slave-lazy-flush:slave接收完RDB文件后清空数据选项
- lazyfree-lazy-eviction:内存满逐出选项
- lazyfree-lazy-expire:过期key删除选项
- lazyfree-lazy-server-del:内部删除选项,比如rename srckey destkey时,如果destkey存在需要先删除destkey
以上4个选项默认为同步删除,可以通过config set [parameter] yes打开后台删除功能。
扩展阅读
redis4.0之lazyfree
Redis数据过期和淘汰策略详解
Redis进阶-Redis的惰性删除相关推荐
- Redis进阶-Redis集群 【高可用切换】【cluster-require-full-coverage】集群是否完整才能对外提供服务
文章目录 Pre 需求 :集群不完整仍然需要对外提供服务 验证 Redis Cluster 架构 高可用切换 Code访问测试 继续停掉8006 ,验证集群是否down掉 Pre Redis进阶-Re ...
- Redis进阶-Redis 4种MQ 方案对比
文章目录 Pre 方案1 Pub/Sub 优点 缺点 小结 方案2 List 优点 缺点 小结 方案3 ZSet 优点 缺点 小结 方案4 stream Pre 最终方案-----> Redis ...
- Redis进阶-Redis对于过期键的三种清除策略
文章目录 Pre Redis Key的超时设置处理 被动删除 主动删除 当前已用内存超过maxmemory限定时,触发主动清理策略 总结 Pre Redis-17Redis内存回收策略 Redis K ...
- Redis进阶-Redis缓存优化
文章目录 缓存穿透 定义 原因 缓存穿透问题解决方案 缓存空对象 布隆过滤器 缓存同时失效 缓存同时失效解决方案 缓存雪崩 缓存雪崩的解决方案 缓存击穿 ( 热点缓存key重建优化 ) 缓存击穿的解决 ...
- Redis进阶-Redis安全相关操作
文章目录 Pre port command lua script SSL proxy 小结 Pre 这里我们主要谈一下使用 Redis 需要注意的安全风险以及防范措施,避免数据泄露和丢失,避免所在主机 ...
- Redis进阶 - Redis主从工作原理详解
文章目录 主从配置 主从工作原理 全量复制 增量复制 主从复制风暴 主从配置 简要回顾一下,Redis的主从配置 复制一份redis.conf文件 将相关配置修改为如下值: port 6380pidf ...
- Redis进阶-Redis持久化原理
文章目录 Pre 快照原理 fork( 多进程) AOF 原理 AOF 重写 fsync 运维 Redis 4.0 混合持久化 Pre Redis-16Redis备份(持久化) Redis 的数据全部 ...
- Redis进阶-Redis使用建议一二事
文章目录 命令使用 客户端使用 命令使用 [推荐] O(N)命令关注N的数量 例如hgetall.lrange.smembers.zrange.sinter等并非不能使用,但是需要明确N的值.有遍历的 ...
- Redis进阶-Redis键值设计及BigKey问题
文章目录 键值设计 key设计 value设计 big key 定义 反例 bigkey的产生 如何优化bigkey 删除bigKey的注意事项 bigkey的危害 键值设计 key设计 (1)[建议 ...
最新文章
- 白血病孕妇产子继母子双双安然
- Hive用户权限管理理解
- 查看docker运行状态_docker商业版受限?请了解下crio
- DataSet转化为DataTable
- 使用Azure DevOps Pipeline实现.Net Core程序的CD
- php删除文件代码指定,PHP删除指定文件夹所有文件代码
- java 文件大小统计工具类_Java获取文件大小,文件夹内文件个数的工具类
- 视频(avi)转换为图片(Python代码实现)
- [文摘]Eclipse中如何批量替换
- 集成学习 Bagging, Boosting, Stacking
- MySQL性能优化的最佳20+套经验
- 国外手机短信验证码接收神器(转自美国华人网FuninUSA)
- Windows驱动之电源管理
- mac foxmail html签名,Foxmail怎么设置签名?Foxmail个性签名设置方法
- oracle禁用系统用户登录,关闭系统 - 在 x86 平台上引导和关闭 Oracle Solaris
- win10访问服务器共享文件夹密码不对,WIN10 Samba文件共享的设置方法,解决不能访问和密码错误的问题...
- 双系统重启进入GRUB解决方案
- Linux系统简介分区基础命令(ADMIN01-2)
- 范美忠的逃生本能需要一种理性伪饰吗?
- homeassistant搭建_Centos7搭建Home Assistant