"过期不候"--具备生命周期的数据的技术实现方案

"过期不候"--具备生命周期的数据的技术实现方案

1   引言

本文可以作为之前的一个 原理性文章 对应的 技术实现部分 。

此处给出其上文的直达电梯:

http://www.cnblogs.com/beer/p/6029861.html

基于token的多平台身份认证架构设计

2   数据生命周期

所谓的 “数据生命周期” 是指:为数据设定一定的生存期限,过了这个时间后, 此数据就被删除掉(失效)。

在进行web开发的时候,有很多需求场景是要求数据是具有一定的生命周期,比如:

  • 具有一定时效的用户登录会话
  • 邀请码系统的时效控制
  • 具有时效的二维码/短信/邮件验证系统
  • 接口调用认证的token有效期
  • 第三方授权的期限控制
  • 分享内容的时效控制
  • 记录一段时间的日志

本文将以如下两种数据库特性为例子来对此功能的实现进行介绍:

  • mongodb
  • redis

3   mongodb

3.1   实现方法

在mongodb中有个 TTL(Time To Live 生存时间)索引 功能:

TTL索引是一种特殊索引,通过这种索引 MongoDB 会过一段时间后自动移除集合中的文档。 这对于某些类型的信息来说是一个很理想的特性,例如: 机器生成的事件数据,日志,会话信息等,这些数据都只需要在数据库中保存有限时间。

  • 如果你可以设定这个生命周期是多久他只要过了这段时间之后,它就会自动删除掉
  • 删除的周期就是一分钟左右(和mongodb服务的负载有关),mongodb后台会进行周期性地检查这些索引字段

在 mongodb 中的实现方式:

db.ttl_log_session.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } )

主要解释如下:

  • 对 ttl_log_session 合集建立索引
  • 索引字段为 lastModifiedDate
  • 索引顺序是 升序
  • 有效生存周期为 3600 秒

达到的效果:以 lastModifiedDate 时刻开始,经过 3600 秒之后,此文档会失效被删除掉。

3.2   过期时间精度

删除操作的一些注意事项:

  • TTL索引 不能 保证过期数据会被立刻删除 在文档过期和MongoDB从数据库中删除文档之间,可能会有延迟。
  • 删除过期数据的后台任务每隔60秒运行一次 在文档过期之后和后台任务运行或者结束之前,文档会依然存在于集合中(删除操作还没有完成)。
  • 删除操作的持续实际取决于您的 mongod 实例的负载 在两次后台任务运行的间隔间,过期数据可能会继续留在数据库中超过60秒。

4   redis

redis是一个内存数据库,它具备快速IO的特点。在性能上会比Mongodb进行大幅度提升。

4.1   实现方式

通过如下方式:

EXPIRE key seconds

为给定的key设置生存时间,当key过期时(生存时间为0),它会被自动删除。

如下是一些设置生存时间相关的基本操作:

redis> SET cache_page "www.google.com"
OK

redis> EXPIRE cache_page 30  # 设置过期时间为 30 秒
(integer) 1

redis> TTL cache_page    # 查看剩余生存时间
(integer) 23

redis> EXPIRE cache_page 30000   # 更新过期时间
(integer) 1

redis> TTL cache_page
(integer) 29996

注意事项:

  • 生存时间可以通过使用 DEL 命令来删除整个 key 来移除,或者被 SET 和 GETSET 命令覆写(overwrite)
  • 如果使用 RENAME 对一个 key 进行改名,那么改名后的 key 的生存时间和改名前一样
  • 将一个带生存时间的 key 改名成另一个带生存时间的 another_key ,这时旧的 another_key (以及它的生存时间)会被删除,然后旧的 key 会改名为 another_key

4.2   过期时间精度

  • 在 Redis 2.4 版本中,过期时间的延迟在 1s 之内 就算key已经过期,但它还是可能在过期之后一秒钟之内被访问到
  • 在新的 Redis 2.6 以后的版本中,延迟被降低到 1ms 之内

5   小结

在进行web开发过程中,很多场合都需要用到数据的生命周期的功能。 关于如何实现此功能时,可以参考如下结论后再进行相应的技术选型:

本文关于 "数据生命周期" 主题的主要结论如下:

  • 可以通过在web应用层上面做一些定时任务,但是那样的效率远没有直接在数据库层做操作要效率高
  • 内存数据库(Reids)在过期时间精度上面的控制要远比磁盘数据库(MongoDB)要强得多,可能达到6万倍

在进行技术选型时注意在如下几个特性上进行比较:

  1. IO速度
  2. 数据持久化
  3. 数据的备份和复制集
  4. 数据库对多核心的利用
  5. 数据库集群的部署的成本和难度
  6. 开发的成本和难度

最终能够得出合适自己的技术方案,实现自己系统的功能。

作者:

Harmo哈莫

作者介绍:

https://zhengwh.github.io

Email:

dreamzsm@gmail.com

QQ:

1295351490

时间:

2016-02

版权声明:

欢迎以学习交流为目的读者随意转载,但是请 【注明出处】

支持本文:

如果文章对您有启发,可以点击博客右下角的按钮进行 【推荐】

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏重庆的技术分享区

创建一个微服务?首先回答这10个问题

原文地址:https://articles.microservices.com/creating-a-microservice-answer-these-10-...

2472
来自专栏携程技术中心

[技术分享]携程App的网络性能优化实践

在4月23日~25日举行的QCon全球软件开发大会(北京站)上,携程技术中心无线开发总监陈浩然分享了《移动开发网络性能优化实践》,总结了携程在App网络性能优化...

27410
来自专栏云计算

微服务的模式 - 同步与异步

微服务是一种架构范例。在这种架构中,多个小型独立组件协同工作,从而构成一个系统。尽管它的操作复杂性较高,但这种范式已经被迅速采用。这是因为它有助于...

1.1K4
来自专栏匠心独运的博客

过来人的经验,谈谈一致性处理方案—分布式事务(DTS)

传统事务是使用数据库自身的事务属性(ACID),而数据库自身的事务属性是局限于当前实例,不能实现跨库。而对于大型分布式/微服务集群系统中,不仅存在着跨库的事务,...

2854
来自专栏机器学习算法与Python学习

Python中常用的一些架构

在各种语言平台中,python涌现的web框架恐怕是最多的,是一个百花齐放的世界,各种micro-framework、framework不可胜数;猜想原因应该是...

4554

使用IBM云功能构建无服务器应用程序

在Serverlessconf一文中,IBM宣布了IBM云服务器的一项新功能(作为IBM Research预览版)。使用新的工具Composer,可以创建包含多...

2109
来自专栏子勰随笔

SDK开发经验之文档

1888
来自专栏EAWorld

微服务来了,配置怎么办?

配置管理是个简单的小话题,程序员都已经非常熟悉,咋就跟微服务挂上钩了呢? 前些年没提微服务架构的时候,大家也都会做配置管理相关的事情,比如我接触过的很多项目都做...

3426
来自专栏顾宇的研习笔记

AWS 上的生产环境架构优化案例

在AWS 上的生产环境性能分析案例一文中,记录了我对客户应用生产环境的一次性能分析。接下来,我们要根据所发现的性能问题进行架构优化,以提升可用性和性能。同时,这...

1311
来自专栏携程技术中心

干货 | 携程App网络服务通道治理和性能优化

编者:本文作者为携程无线开发总监陈浩然。陈浩然,计算机博士,2008年iOS SDK发布后,投身移动互联网。先后在外企、创业型和国内一线旅游公司从事无线App的...

3995

扫码关注云+社区