MongoDB 麻烦专业点,不懂可以问,别这么用行吗 ! --TTL

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共3000人左右 1 + 2 + 3 + 4 +5 + 6 + 7 + 8 +9)(1 2 3 4 5 6 7群均已爆满,开8群350+ 9群 100+)

资本与技术的“豪赌”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万数据
删除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,时序与地理,咱们都能玩得转!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值