资本与技术的“豪赌”70亿赌资, 押宝 AI 数据底座赛道,谁能赢?
是谁不能说,咱们对事不对人。我就说最近遇到的一个MongoDB的使用案例,看过我这个MongoDB系列的老看客,知道我对MongoDB的热爱。
TTL的索引这个功能是MongoDB,我个人觉得最棒的功能之一,通过TTL索引来自动删除过期的数据,这点在MongoDB使用者的手里那是用的很溜。
但今天要说的是另一个问题,就是把TTL给用到业务里面的事情。这点我非常非常不同意,且我不认为这是一个好的使用方法。
这里我们梳理一下TTLS的基本知识,先给一些不懂的同学,然后咱们往下说。
1 TTL 目前仅仅支持Date类型,但你的日期的表达形式必须是ISODate,也就是必须是BSON的Date类型,因为ISODate是在javascript中的一种的时间表现形式,必须是这样的格式的时间,如ISODate("2024-06-09T10:00:00Z"),如果是文本类型的时间是无法创建TTL索引的。
2 在MongoDB中会有一个后台的线程,每60秒扫描一次所有TTL索引,并删除过期文档。通过将过期的expireAfterSeconds 对比时间的value来判断到底这个document是否应该被删除。
3 这里可以通过ttlMonitorSleepSecs 调整这个参数作为删除数据之间的间隔,但不建议调整的太大,这样会导致一个问题,就是每次删除数据会有更多的数据在触发点上,增加删除时的量。
下面我们做一个小例子来说明TTL 索引的一些使用的命令
use ttl_test_db
db.createCollection("ttl_test_collection")
const bulk = [];
for (let i = 0; i < 100000; i++) {
bulk.push({
name: "user_" + i,
createdAt: new Date(), // 当前时间,10秒后会被删除
data: Math.random().toString(36).substring(2)
});
if (bulk.length === 1000) {
db.ttl_test_collection.insertMany(bulk);
bulk.length = 0;
}
}
//通过程序来观察剩余的文档数
setInterval(() => {
print(new Date(), "Count:", db.ttl_test_collection.countDocuments());
}, 5000)
// 创建一个 TTL 索引:100 秒后自动过期
db.ttl_test_collection.createIndex(
{ createdAt: 1 },
{ expireAfterSeconds: 100 }
)
导入10万数据
删除10万数据
删除10万数据很快,这里我们还可以调整并查看后台的检测数据的频率
ongo7 [direct: primary] ttl_test_db> db.adminCommand({ getParameter: 1, ttlMonitorSleepSecs: 1 })
{
ttlMonitorSleepSecs: 60,
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1749537178, i: 1 }),
signature: {
hash: Binary(Buffer.from("f50f9b18a88845808544681a72616d491fc4211e", "hex"), 0),
keyId: Long("7514181421930381314")
}
},
operationTime: Timestamp({ t: 1749537178, i: 1 })
}
mongo7 [direct: primary] ttl_test_db>
或者修改这个参数,但这个参数在session中修改后,只能维持到下次MONGODB重启之前。
db.adminCommand({ setParameter: 1, ttlMonitorSleepSecs: 10 })
这样修改就会每10秒来判断一次,方便一些要快速密集删除数据的任务。
这里我们来最后说我为什么说,通过TTL来满足业务删除数据的做法是不合适的
1 TTL删除有延迟,或者不确定性,这点不是我们可控的 2 TTL删除可是不能审计的,且我们无法阻止在特殊情况下 3 TTL是不能进行复杂的数据删除的,没有条件这个思路 4 TTL删除数据中性能的问题,可能会发生 5 部署的隐秘性,以及排查问题的不便利性
所以真正有数据删除需求的应通过程序来完成,而不是通过TTL来完成业务的删除数据的需求,且还要保证业务的正确性。那么TTL到底适合删除什么数据,在什么业务中。
1 日志数据,日志数据的自动清理
2 会话的缓存数据,且不在使用的数据
竹板这么一打,芒果数据库,好用又先进,你可的学会,分布存储架构,很灵活,AI,时序与地理,咱们都能玩得转!
本文分享自 AustinDatabases 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!