zoukankan      html  css  js  c++  java
  • Redis03——Redis是如何删除你的数据的

    众所周知Redis针对每一个key都能单独设置过期时间,那么Redis是怎么处理这些key的过期时间的呢?当同一时间有大量Key同时到期时,Redis又是怎么处理的呢?会不会影响到我的线上业务呢?如果Redis存储数据超出物理限制了,又是怎么处理的呢?本文将详细为你介绍Redis的过期&淘汰策略。

    过期策略

    首先针对每一个设置了过期时间的key,Redis都会将其放入一个统一的字典中进行管理。具体管理策略分为以下两种:

    定时扫描策略:Redis会定时扫描存储含有过期时间key字典,遍历删除已经过期的key。

    惰性删除策略:当客Redis读一个key的,Redis首先会校验key的过期时间,如果已经过期,将会对其进行过期删除操作。

    定时扫描策略

    Redis会对设置了过期时间的key字典定时进行一次过期扫描,扫描采取的是贪心策略,具体实现如下:

    1. 从过期字典中随机挑选一批key(有说20个的);
    2. 遍历这一批key,并删除已经过期的key;
    3. 如果过期的key超过一定比例(有说1/4的),重复步骤1。

    当有大量key同时过期时,将会导致Redis重复执行扫描并删除的任务,这将导致Redis的读写请求出现延迟、阻塞的现象。所以要尽量避免大批量key同时过期的情况,如果存在大批量的过期key,最好在目标过期时间上,设置一个合理的随机时间范围。

    惰性过期策略

    从定时扫描策略的实现步骤中,我们可以看到,其实内存中还可能存在已经过期的key。这时为了解决这一问题,Redis引入了惰性过期这一策略,通过在取值的时候做过期校验,删除过期key,这样能保证每一个key的有效性,避免了脏数据的产生。

    从节点过期策略

    为了保证主从数据一致性,Redis从节点不会执行定扫扫描策略去主动删除key。但是主节点在删除过期key的时候,会向主节点的AOF日志文件添加一条del操作指令,随后将该指令同步到从节点,从节点通过执行del指令以此来达到删除从节点过期key的目的。

    淘汰策略

    当Redis内存的使用达到限制时,Redis会将多余的key写入到磁盘中,然后从磁盘中读取key进行操作,这样无疑就加大了IO开销。为了避免这一问题,Redis也提供了几种数据淘汰策略供我们选择:

    1. noeviction:阻塞写请求,其他请求可用
    2. volatile-lru:淘汰过期key集合中,最少被使用的key
    3. volatile-ttl:淘汰过期key集合中,ttl最小的key
    4. volatile-random:淘汰过期key集合中,随机key
    5. allkeys-lru:淘汰所有key中,最少被使用key
    6. allkeys-random:淘汰所有key中,随机key

    删除策略

    我们知道Redis在key过期时候会删除过期key,在淘汰key的时候也会删除key。但是具体是怎么删除的呢?

    直接删除

    通过del指令直接,可以直接删除指定key,并释放key相关的对象。

    懒删除

    在大部分情况下del指定都是很快的,但是当需要删除一个很大的key对象是,del指令就会产生明显延迟,导致线程卡顿。所以需要使用unlink指令对其进行懒删除。

    理解unlink其实可以将整个Redis看做一个链表(当然Redis并不是链表,此处只是为了方便理解unlink)。当执行unlink的时候,会将该key所在的对象从链表中移除。等待Redis的异步线程来进行内存释放。

    Redis内部并不是只有一个主线程,还有其他异步线程,通常我们所说的Redis是单线程,指的是其网络请求模块为单线程,即一个线程处理所有网络请求。所以在非特指的情况下,Redis是还是单线程。

    Redis系列推荐

    Redis02——Redis内存数据如何保存到磁盘

    Redis01——Redis究竟支持哪些数据结构

  • 相关阅读:
    docker logs-查看docker容器日志
    初探 Elasticsearch,学习笔记第一讲
    Centos7 环境下设置固定IP
    强制使用索引查询方法
    linux 常用命令
    MySQL 调优
    docker 常用命令
    mysql 创建临时表
    mysql or in union all 使用方法
    mysql 创建存储过程
  • 原文地址:https://www.cnblogs.com/weechang/p/12457604.html
Copyright © 2011-2022 走看看