DCache-CacheServer分析(二)

2019年12月2日

本篇文章给大家介绍DCache的CacheServer中,过期线程-ExpireThread和删除线程-DeleteThread的处理流程。

ExpireThread

作用:定时作业,清理过期数据

在cache 配置列表的第2页:

#是否启动过期清除线程
StartExpireThread=Y
#是否清除后端数据库
ExpireDb=Y
#每次清除过期数据的时间间隔(秒)
ExpireInterval=300
#清除频率, 0 表示不限制
ExpireSpeed=0
StartExpireThread清除线程的总开关,配置成”Y”或”y”才会开启功能;
ExpireInterval清除时间间隔,每隔300s执行一次
ExpireSpeed

清除频率,即瞬时清除的数据量。假设配置成1000,则下一个ExpireInterval到来时,删除了1000条过期数据后,会休眠10秒再执行删除

ExpireDb

是否清除后端数据库,在清除缓存的同时,删除数据库中的记录(这里只是将数据的标识置位delSetBit,由Delete线程删除)

说明:

每一条数据在Set到内存时都可以设置过期时间(在msyql中对应表中的字段为sDCacheExpireTime),ExpireThread就会以此为依据,判断是否设置清理标识。


DeleteThread

作用:定时清理内存(和数据库)中已被标记为delete的数据

脏数据:未同步到后端数据库的内存数据。

配置解析

#是否启动删除线程
StartDeleteThread=Y
#delete线程操作时间间隔(秒)
DeleteInterval=300
#delete线程删除速度,0表示不限速
DeleteSpeed=0
StartDeleteThreadserver启动时判断,是否启动删除线程
DeleteIntervaldelete线程初始化后读取,每个 DeleteInterval 秒,执行一次
DeleteSpeed

每个周期删除的记录数,达到该值后会休眠10s(usleep(10000))

还有一部分配置与其他线程共享:

#屏蔽回写时间段(例:0900-1000;1600-1700)
SyncBlockTime=0000-0000
#解除屏蔽回写的脏数据比率
SyncUNBlockPercent=60

#回写db的按天日志文件名后缀
DbDayLog=db

#是否存在DB,Y/N
DBFlag=Y
#DbAccess的obj名称
ObjName=DCache.TestDbAccessServer.DbAccessObj
SyncBlockTime屏蔽删除的时间段,在这个时间段内,不执行删除线程;如果有多个时间段,分号”;”分隔
SyncUNBlockPercent当 脏数据 和 要删除的数据比率大于 SyncUNBlockPercent 时, 解除屏蔽时间(SyncBlockTime失效),正常执行删除
DbDayLog

与db相关的操作,会写到独立的日志文件中,例如:DCache.TestAppSSMMKVCacheServer1-1_db_20191129.log

处理逻辑总结

  1. StartDeleteThread=N,不开启删除线程
  2. 如果在屏蔽时间(SyncBlockTime)段,则不执行删除
  3. 如果在屏蔽时间段内,但脏数据+应删除数据的比率大于 SyncUNBlockPercent 时,也会执行删除操作
  4. 每DeleteInterval秒执行一次删除线程
  5. 如果本周期内 瞬时删除的记录数超过DeleteSpeed,则立即休眠10秒,再执行删除;DeleteSpeed=0时,无此限制
  6. 如果要删除的数据正处于迁移状态,则删除该主key,继续下一条记录
  7. 当该条记录的 deleteTime 不为0,且当前时间大于deleteTime时,才会执行删除
  8. 在DBFlag=Y时,当该记录的mkey在本分片时,只有主节点会执行 删除db中的信息。调用 dbAcess服务(_dbaccessPrx ),删除mysql中的数据
  9. 删除cache内的数据
  10. 删除待清理链表中的主key(earseDeleteKey),继续下一条记录

总结

DCache具备自动清理过期数据的能力,异步流程:

  • 先由过期线程定期轮询,判断数据是否过期;过期的数据就会被设置标识位(此时未删除!)
  • 删除线程会定期获取hash桶中的设置了标识位的数据,之后会调用dbAcess服务清理后端数据库,并清理本地内存和hash桶。

这两个线程都可以灵活配置轮询时间和清理频率(每个批次处理的数据量),除此之外还提供了丰富的配置能力,供开发人员根据业务实际情况进行调整:

  • 当过期的数据量较大时,可以通过调整DeleteInterval和DeleteSpeed,来减轻后端数据库的压力
  • 当业务高峰时,为保证内存的高效处理,可以设置SyncBlockTime参数来屏蔽内存清理行为
  • 当内存压力较大时,可以调整SyncUNBlockPercent参数,来强制删除内存数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员柒叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值