Redis入门 删除策略与逐出算法

1. 删除策略 

  Redis数据分类

  redis是一种内存级别的数据库,所有数据均存放在内存中。redis中数据可分为具有时效性的数据、永久有效的数据、已经      过期的数据或被删除的数据或未定义的数据。
       我们可以通过redis的TTL指令查询数据的状态:
        . XX: 具有时效性的数据
        . -1: 永久有效的数据
        . -2: 已经过期的数据 或 被删除的数据 或未定义的数据

  过期数据是如何在Redis中删除呢?

  • redis服务删除过期数据并不是立即删除,redis删除数据有三种删除策略:定时删除惰性删除定期删除

Redis入门 删除策略与逐出算法_第1张图片

  为什么redis需要那么多删除策略,直接删除不就完了吗?

实际上Redis的删除操作也需要占用redis服务器的性能。如果redis正在高负载的工作进行删除数据,那么就会发生上图可怕的情况。正是基于如此,redis才需要多种删除策略,相互配合实现redis的过期数据删除。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  谈谈redis的删除策略 :定时删除、惰性删除、定期删除

  • 定时删除

         在创建数据时同时创建一个定时器,当key设置有过期时间,且过期时间达到时,由定时器任务立即执行对key的删除操作

         优点:节约内存,到时就删除,快速释放掉不必要的内存占用

          缺点:CPU压力很大。频繁的删除任务会占用CPU的性能,会影响Redis服务器响应时间和指令吞吐量

  • 惰性删除

         数据到达过期时间,不做处理。没错就是不理你,等下次再次访问的时候,就直接删除干掉。

         优点:节约CPU性能

         缺点: 内存压力大,出现长期占用内存的数据

  •  定期删除

          定时删除和惰性删除都比较极端,而定期删除就是比较折中的方案。

          周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度。

       定期删除过程

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

          redis启动服务器初始化时,读取配置server.hz的值,默认值为10

          每秒执行server.hz次serverCron( )   ---> databaseCron( )   ----->   activeExpireCycle( )

          activeExpireCycle( )对每个数据分区进行逐一检测,每次执行250ms/server.hz

          对数据分区检测时,随机挑选W个key检测:

                      数据分区中的过期数据会被删除

                      如果一轮删除过期数据的数量>W*25%,循环该过程

                      如果一轮删除的过期数据数量<=W*25%, 检查下一个数据分区

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

       定期删除的特点

                    特点1:CPU性能占用设置有峰值,检测频度可自定义设置

                    特点2:内存压力不是很大,长期占用内存的冷数据会被持续清理

 

2. 逐出算法

     redis是内存级的数据库,当redis不断存储数据,数据满了导致内存不足,如果再次储存数据,怎么办呢?这就用到了逐出算法。redis要临时删除一些数据为当前指令清理内存空间,清理数据的策略叫做逐出算法。

    逐出算法的八大策略

         对于易失数据:

                 volatile-lru :挑选最近最少使用的数据淘汰

                 volatile-lfu :挑选最近使用次数最少的数据淘汰

                 volatile-ttl  :挑选将要过起的数据淘汰

                 voatile-random: 任意选择数据淘汰

         检测全库数据

                 allkeys-lru :挑选最近使用最少的数据淘汰

                 allkeys-lfu :挑选最近使用次数最少的数据淘汰

                 allkeys-random: 任意选择数据淘汰

         放弃数据驱逐

                  no-enviction   放弃驱逐

 

你可能感兴趣的:(Redis,redis)