Redis学习拓展篇----懒惰删除

懒惰删除

Redis内部除了一个主线程还有几个异步线程专门用作处理一些耗时的操作
将Redis中的数据比作为一颗大树

1、Redis为什么使用懒惰删除

删除指令del会直接释放对象的内存,一般会很快,如果删除很大的key时删除操作会导致单线程卡顿,redis4.0中为了解决这个问题引入了unlink指令,可以对删除操作进行懒处理,丢给后台的线程来异步回收内存。
多线程中安全性的保证:当要吧数据(大树的分枝) 交给异步线程时,这些数据将不会被主线程访问到了。

2、flush和异步队列

flushdb和flushhall指令用来清空数据库,使用指令后加async参数将整个数据(整颗大树)放入后台线程中
异步队列:主线程将对象的引用从大树中摘除后,将整个key的内存回收操作包装成一个任务,放入异步任务队列,后台线程会从中取任务,队列必须是一个线程安全队列。

3、AOF Sync也很慢

由于Redis的AOF Sync耗时很久,会导致主线程效率下降,同步工作实在异步线程中完成的。
AOF Sync有自己的操作线程和懒惰删除不是一个线程,也有一个自己的任务队列,队列中只有AOF Sync任务

4、异步删除点

del指令,flush操作,key的过期,LRU淘汰,rename指令过程中都会实施内存回收
特殊的flush操作:在flush在发生时正在进行全量同步的从节点中,要在接受完整的rdb文件后,将当前内存一次性清空,以加载整个rdb文件的内容到内存
Redis4.0中下面的删除点可以使用异步删除机制:

  1. slave-lazy-flush: 从节点接受完rdb文件后的flush操作
  2. lazyfree-lazy-eviction: 内存达到maxmemory时进行淘汰
  3. lazyfree-lazy-expire key:过期删除
  4. lazyfree-lazy-server-del rename :指令删除destKey

猜你喜欢

转载自blog.csdn.net/alvin_666/article/details/90741757