文章目录

  • 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的惰性删除相关推荐

  1. Redis进阶-Redis集群 【高可用切换】【cluster-require-full-coverage】集群是否完整才能对外提供服务

    文章目录 Pre 需求 :集群不完整仍然需要对外提供服务 验证 Redis Cluster 架构 高可用切换 Code访问测试 继续停掉8006 ,验证集群是否down掉 Pre Redis进阶-Re ...

  2. Redis进阶-Redis 4种MQ 方案对比

    文章目录 Pre 方案1 Pub/Sub 优点 缺点 小结 方案2 List 优点 缺点 小结 方案3 ZSet 优点 缺点 小结 方案4 stream Pre 最终方案-----> Redis ...

  3. Redis进阶-Redis对于过期键的三种清除策略

    文章目录 Pre Redis Key的超时设置处理 被动删除 主动删除 当前已用内存超过maxmemory限定时,触发主动清理策略 总结 Pre Redis-17Redis内存回收策略 Redis K ...

  4. Redis进阶-Redis缓存优化

    文章目录 缓存穿透 定义 原因 缓存穿透问题解决方案 缓存空对象 布隆过滤器 缓存同时失效 缓存同时失效解决方案 缓存雪崩 缓存雪崩的解决方案 缓存击穿 ( 热点缓存key重建优化 ) 缓存击穿的解决 ...

  5. Redis进阶-Redis安全相关操作

    文章目录 Pre port command lua script SSL proxy 小结 Pre 这里我们主要谈一下使用 Redis 需要注意的安全风险以及防范措施,避免数据泄露和丢失,避免所在主机 ...

  6. Redis进阶 - Redis主从工作原理详解

    文章目录 主从配置 主从工作原理 全量复制 增量复制 主从复制风暴 主从配置 简要回顾一下,Redis的主从配置 复制一份redis.conf文件 将相关配置修改为如下值: port 6380pidf ...

  7. Redis进阶-Redis持久化原理

    文章目录 Pre 快照原理 fork( 多进程) AOF 原理 AOF 重写 fsync 运维 Redis 4.0 混合持久化 Pre Redis-16Redis备份(持久化) Redis 的数据全部 ...

  8. Redis进阶-Redis使用建议一二事

    文章目录 命令使用 客户端使用 命令使用 [推荐] O(N)命令关注N的数量 例如hgetall.lrange.smembers.zrange.sinter等并非不能使用,但是需要明确N的值.有遍历的 ...

  9. Redis进阶-Redis键值设计及BigKey问题

    文章目录 键值设计 key设计 value设计 big key 定义 反例 bigkey的产生 如何优化bigkey 删除bigKey的注意事项 bigkey的危害 键值设计 key设计 (1)[建议 ...

最新文章

  1. 白血病孕妇产子继母子双双安然
  2. Hive用户权限管理理解
  3. 查看docker运行状态_docker商业版受限?请了解下crio
  4. DataSet转化为DataTable
  5. 使用Azure DevOps Pipeline实现.Net Core程序的CD
  6. php删除文件代码指定,PHP删除指定文件夹所有文件代码
  7. java 文件大小统计工具类_Java获取文件大小,文件夹内文件个数的工具类
  8. 视频(avi)转换为图片(Python代码实现)
  9. [文摘]Eclipse中如何批量替换
  10. 集成学习 Bagging, Boosting, Stacking
  11. MySQL性能优化的最佳20+套经验
  12. 国外手机短信验证码接收神器(转自美国华人网FuninUSA)
  13. Windows驱动之电源管理
  14. mac foxmail html签名,Foxmail怎么设置签名?Foxmail个性签名设置方法
  15. oracle禁用系统用户登录,关闭系统 - 在 x86 平台上引导和关闭 Oracle Solaris
  16. win10访问服务器共享文件夹密码不对,WIN10 Samba文件共享的设置方法,解决不能访问和密码错误的问题...
  17. 双系统重启进入GRUB解决方案
  18. Linux系统简介分区基础命令(ADMIN01-2)
  19. 范美忠的逃生本能需要一种理性伪饰吗?
  20. homeassistant搭建_Centos7搭建Home Assistant

热门文章

  1. 2002无法连接mysql阿里云_2002无法登录MySQL服务器
  2. 树莓派:交叉编译,以及带wiringPi库的如何交叉编译
  3. C++ 重载运算符和重载函数(一)
  4. C++基类和派生类的析构函数
  5. keil lib 只调用自己的函数_C语言学习篇(28)——函数库
  6. DPVS_DPVS配置说明
  7. 找到指定的新类型字符
  8. python 笔记:time calendar
  9. 李宏毅线性代数笔记13:SVD分解
  10. c语言 二级菜单_收下计算机二级秘笈,考场上说好不哭!