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

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
技术博客: http://www.cnblogs.com/beer
Email: dreamzsm@gmail.com
QQ: 1295351490
时间: 2016-02
版权声明: 欢迎以学习交流为目的读者随意转载,但是请 【注明出处】
支持本文: 如果文章对您有启发,可以点击博客右下角的按钮进行 【推荐】

"过期不候"--具备生命周期的数据的技术实现方案的更多相关文章

  1. 感知生命周期的数据 -- LiveData

    感知生命周期的数据 -- LiveData 零. 前言 上篇文章<万物基于Lifecycle> 介绍了整个Lifecycle体系的基石,今天这篇文章咱们来看看Jetpack给我们带来的活着 ...

  2. Vuejs——Vue生命周期,数据,手动挂载,指令,过滤器

    版权声明:出处http://blog.csdn.net/qq20004604   目录(?)[+]   原教程: http://cn.vuejs.org/guide/instance.html htt ...

  3. 【基础篇】activity生命周期及数据保存

    常见的Android 的界面,均采用Activity+view的形式显示的,一提到Activity,立即就能联想到Activity的生命周期与状态的保存. 下面先从Activity的生命周期开始说起  ...

  4. Asp.Net生命周期和Http管道技术

    本篇主要介绍一下内容: 1.ASP.NET生命周期 2.Http运行时 3.Http管道技术 a)inetinfo.exe b)asp.net_isapi.dll c)aspnet_wp.exe d) ...

  5. Vuejs——(2)Vue生命周期,数据,手动挂载,指令,过滤器

    (八)传入的数据绑定 先创建一个对象(假如是obj),然后将他传入Vue实例中,作为data属性的值,那么 ①obj的值的变化,将影响Vue实例中的值的变化: ②相反一样: ③可以在Vue实例外面操纵 ...

  6. 【http】生命周期和http管道技术 整理中

    httpModules 与 httpHandlers  正在写demo public class Httpext : IHttpModule { public void Dispose() { thr ...

  7. Unity 3D Framework Designing(3)——构建View和ViewModel的生命周期

    > 对于一个View而言,本质上是一个MonoBehaviour.它本身就具备生命周期这个概念,比如,Awake,Start,Update,OnDestory等.这些是非常好的方法,可以让开发者 ...

  8. Unity应用架构设计(3)——构建View和ViewModel的生命周期

    对于一个View而言,本质上是一个MonoBehaviour.它本身就具备生命周期这个概念,比如,Awake,Start,Update,OnDestory等.这些是非常好的方法,可以让开发者在各个阶段 ...

  9. Activity组件的生命周期

    一.Activiy组件的三个状态: 1.前台状态(active) : 在屏幕的最上层,页面获得焦点,可以响应用户的操作2.可视状态(paused) : 不能与用户交互,但是还存在于可视区域内,它依然存 ...

随机推荐

  1. dotNET跨平台相关文档整理

    一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...

  2. 在.NET Core 里使用 BouncyCastle 的DES加密算法

    .NET Core上面的DES等加密算法要等到1.2 才支持,我们可是急需这个算法的支持,文章<使用 JavaScriptService 在.NET Core 里实现DES加密算法>需要用 ...

  3. Android 获取meta-data中的数据

    在 Android 的 Mainfest 清单文件中,Application,Activity,Recriver,Service 的节点中都有这个的存在.很多时候我们可以通过 meta-data 来配 ...

  4. android 使用Tabhost 发生could not create tab content because could not find view with id 错误

    使用Tabhost的时候经常报:could not create tab content because could not find view with id 错误. 总结一下发生错误的原因,一般的 ...

  5. const,static,extern 简介

    const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...

  6. Linux学习之文件操作

    Linux,一起学习进步-    mkdir The mkdir command is used to create directories.It works like this: mkdir命令是用 ...

  7. CRL快速开发框架系列教程十(导出对象结构)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  8. 代码的坏味道(15)——冗余类(Lazy Class)

    坏味道--冗余类(Lazy Class) 特征 理解和维护类总是费时费力的.如果一个类不值得你花费精力,它就应该被删除. 问题原因 也许一个类的初始设计是一个功能完全的类,然而随着代码的变迁,变得没什 ...

  9. ABP领域层

    1.实体Entites 1.1 概念 实体是DDD(领域驱动设计)的核心概念之一. 实体是具有唯一标识的ID且存储在数据库总.实体通常被映射成数据库中的一个表. 在ABP中,实体继承自Entity类. ...

  10. BPM配置故事之案例6-条件可见与条件必填

    小明兴奋的告诉大毛自己独立解决了必填和水印问题,腹黑的大毛决定给小明出一个进阶问题刷一下存在感. 大毛:我再考考你,我把表单改成了这样(下图).怎么做到,预算状态为"预算内"时,不 ...