复述的怎么清理没用的数据

介绍

本篇内容主要讲解“复述的怎么清理没用的数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“复述的怎么清理没用的数据”吧!

我们数据平台中有使用复述来给线上提供低延时(20毫秒以内)的高并发读写请求,其中* * *的复述,使用了阿里云的复述,集群(256克),存储的记录超过10个亿,关键的有效期设置为15天,每天写入的记录大概5000年万左右,每秒大概在6万左右。由于过期主要的产生速度大于复述,自动清理的速度,因此在复述中会有大量过期关键未被及时清理。

为什么有过期的关键未被清理呢?这个得先熟悉一下复述的删除策略。

复述,常用的删除策略有以下三种:

<李>

被动删除(惰性删除):当读/写一个已经过期的关键时,会触发惰性删除策略,直接删除掉这个关键;

<李>

主动删除(定期删除):复述,会定期巡检,来清理过期关键;

<李>

当内存达到maxmemory配置时候,会触发关键的删除操作,

另外,还有一种基于触发器的删除策略,因为对复述,压力太大,一般没人使用。

这里先介绍后两种删除策略(网上有很多说明)。

<强>主动删除(定期删除)

在复述中,常规操作由复述。c/serverCron实现,它主要执行以下操作:

<李>

更新服务器的各类统计信息,比如时间,内存占用,数据库占用情况等。

<李>

清理数据库中的过期键值对。

<李>

对不合理的数据库进行大小调整。

<李>

关闭和清理连接失效的客户端。

<李>

尝试进行AOF或RDB持久化操作。

<李>

如果服务器是主节点的话,对附属节点进行定期同步。

<李>

如果处于集群模式的话,对集群进行定期同步和连接测试。

复述,将serverCron作为时间事件来运行,从而确保它每隔一段时间就会自动运行一次,又因为serverCron需要在复述,服务器运行期间一直定期运行,所以它是一个循环时间事件:serverCron会一直定期执行,直到服务器关闭为止。

2.6版在复述本中,程序规定serverCron每秒运行10次,平均每100毫秒运行一次。从复述,2.8开始,,用户可以通过修改赫兹选项来调整serverCron的每秒执行次数,具体信息请参考复述。conf 文件中关于 hz 选项的说明。

也叫定时删除,这里的“定期”指的是Redis定期触发的清理策略,由位于src/redis.c的activeExpireCycle(void)函数来完成。

serverCron是由redis的事件框架驱动的定位任务,这个定时任务中会调用activeExpireCycle函数,针对每个db在限制的时间REDIS_EXPIRELOOKUPS_TIME_LIMIT内迟可能多的删除过期key,之所以要限制时间是为了防止过长时间  的阻塞影响redis的正常运行。这种主动删除策略弥补了被动删除策略在内存上的不友好。

因此,Redis会周期性的随机测试一批设置了过期时间的key并进行处理。测试到的已过期的key将被删除。典型的方式为,Redis每秒做10次如下的步骤:

  • 随机测试100个设置了过期时间的key

  • 删除所有发现的已过期的key

  • 若删除的key超过25个则重复步骤1

这是一个基于概率的简单算法,基本的假设是抽出的样本能够代表整个key空间,redis持续清理过期的数据直至将要过期的key的百分比降到了25%以下。这也意味着在任何给定的时刻已经过期但仍占据着内存空间的key的量最多为每秒的写操作量除以4.

Redis-3.0.0中的默认值是10,代表每秒钟调用10次后台任务。

除了主动淘汰的频率外,Redis对每次淘汰任务执行的***时长也有一个限定,这样保证了每次主动淘汰不会过多阻塞应用请求,以下是这个限定计算公式:

#define ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC 25 /* CPU max % for keys collection */  …  timelimit = 1000000*ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC/server.hz/100;

hz调大将会提高Redis主动淘汰的频率,如果你的Redis存储中包含很多冷数据占用内存过大的话,可以考虑将这个值调大,但Redis作者建议这个值不要超过100。我们实际线上将这个值调大到100,观察到CPU会增加2%左右,但对冷数据的内存释放速度确实有明显的提高(通过观察keyspace个数和used_memory大小)。

可以看出timelimit和server.hz是一个倒数的关系,也就是说hz配置越大,timelimit就越小。换句话说是每秒钟期望的主动淘汰频率越高,则每次淘汰最长占用时间就越短。这里每秒钟的最长淘汰占用时间是固定的250ms(1000000*ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC/100),而淘汰频率和每次淘汰的最长时间是通过hz参数控制的。

复述的怎么清理没用的数据