开源项目ets_cache分析

1 背景

  当在程序中,有大量的数据需要读写,数据库的响应会延迟,甚至阻塞。缓存可以缓解对数据库访问的压力,而且在内存中数据的读写要比读写硬盘上的数据快。

2 目的

  ets_cache是用erlang实现的简单的缓存应用,它的结构简单,但功能强大支持百万级的数据量。其主要是用来存储一些公共访问的数据,这些数据存放在ets表中,借助ets表的高性能对数据进行操作。

3 结构

  3.1 源码目录

下图是ets_cache的源码目录截图:

  include:主要是一些宏定义和引入的一些包。其中定义了默认缓存ets表(ets_cache_data)

  test:主要是测试代码

  src:是源代码文件

  ets_cache_app.erl        
          应用程序启动文件

  ets_cache_sup.erl     
             ets_cache的supervisor行为

  ets_cache.erl     
              
     ets_cache的对外接口

  ets_cache_manager_sup.erl 
  ets_cache_manager的supervisor行为

  ets_cache_manager.erl     
     ets_cache的管理进程,是gen_server行为,维护着每个ets缓存表

  3.2
监控树结构

下图是ets_cache的监控结构:

      

从图中我们当我们启动ets_cache应用并创建缓存表,创建的缓存表都被ets_cache_manager_sup的子节点,并对其进行维护。

4 核心

  ets_cache虽然简单,但是有两点值得借鉴:

1.每个ets表专属一个进程。当我们存储新的一类数据时,就可以创建新的进程,创建ets表,单进程维护ets表,保证了ets表的独立性。

2.ets表会定时清理冷数据。ets表的数据应该是访问频率较高的数据,每次访问玩数据都会更新数据的过期时间,而且每个一段时间进程就会对ets表进行一次清理,清理过时的数据,避免ets表的数据过于臃肿。

源码如下:

 1  handle_info(cleanup, #state{
 2
 3                          table = Table,
 4
 5                          clean_interval = CleanInterval
 6
 7                         } = State) ->
 8
 9      Now = ets_cache:unixtime(),
10
11      %% error_logger:info_msg("cleanup now ~p~n", [Now]),
12
13      MS = ets:fun2ms(
14
15             fun({_, _, Timeout}) when is_integer(Timeout)->
16
17                     Timeout =< Now
18
19             end),
20
21      ets:select_delete(Table, MS),
22
23      erlang:send_after(CleanInterval, self(), cleanup),
24
25      {noreply, State};

5 总结

  ets_cache虽然设计简单,但是实用。能支持不同类型的数据,创建不同的ets表,而且读写效率高,实用与大量数据的缓存。并可以稍加改动就可以作为数据库和程序之间的缓存。但是,对于数据一致性要求较高的数据要慎用。当所有数据访问频率不高时,清除掉冷数据会产生ets空表。

ets_cache源码地址:https://github.com/roowe/ets_cache

优秀的代码是艺术品,它需要精雕细琢!

时间: 2024-11-08 08:58:25

开源项目ets_cache分析的相关文章

开源项目成熟度分析工具-利用github api获取代码库的信息

1.github api github api是http形式的api,功能还是比较丰富的,博主因为项目的原因主要用到的是提取project信息这项功能,返回的数据是JSON格式. api页:https://developer.github.com/v3/ Options: (H) means HTTP/HTTPS only, (F) means FTP only --anyauth Pick "any" authentication method (H) -a, --append Ap

Android开源项目pulltorefresh分析与简单使用

在Android开发中有时我们需要访问网络实时刷新数据,比如QQ好友在线状态最新信息,QQ空间需要显示更多的好友动态信息,EOE论坛客户端显示更多的文章帖子信息等.android-pulltorefresh开源项目提供一个向下滑动即刷新列表的功能,将该项目稍作修改即可应用到自己的项目中. 1.下载地址 https://github.com/johannilsson/android-pulltorefresh 该项目为 Android 应用提供一个向下滑动即刷新列表的功能. 2.工程组成 Pull

DiyCode开源项目 TopicActivity 分析

1.首先看看TopActivity效果.    2.TopicActivity是一个继承BaseActivity的.前面分析过BaseActivity了.主要有一个标题栏,有返回的图标. 3.贴一下TopicActivity源代码. /* * Copyright 2017 GcsSloop * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file exc

开源项目成熟度分析工具-利用github api获代替码库的信息

1.github api github api是http形式的api,功能还是比較丰富的,博主由于项目的原因主要用到的是提取project信息这项功能.返回的数据是JSON格式. api页:https://developer.github.com/v3/ Options: (H) means HTTP/HTTPS only, (F) means FTP only --anyauth Pick "any" authentication method (H) -a, --append Ap

Diycode开源项目 NodeListFragment分析

1.一些示例文字 第一段 2.一些示例文字 第二段 3.一些示例文字 第三段 4.一些示例文字 第四段 5.一些示例文字 第五段 6.一些示例文字 第六段

C#.NET开源项目、机器学习、商务智能

所以原谅我,不能把所有的都发上来,太杂了,反而不好. 1..NET时间周期处理组件 这个组件很小,主要是对时间日期,特别是处理时间间隔以及时间范围非常方便.虽然.NET自带了时间日期的部分功能,但可能还不强大.这个组件就是增强版本.详细功能可以看项目主页的介绍.在CodeProject: http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET 2.OxyPlot绘图组件 OxyPlot是一个.NET跨平台的绘图

ospaf-开源项目成熟度分析工具

1.概述 软件成熟度评估的最终目标是帮助软件的可持续发展,并为用户应用提供必要的技术参考.开放源代码软件成熟度评估也不例外.我们通过软件的成熟度评估,形成全面的涉及技术.应用.法律等层面的评价报告,帮助那些正在或潜在的开源软件使用者准确的了解软件的技术特性和应用特性,从而为他们选择适合自身需求的开源软件提供参考.同时报告中涉及的大量评测数据,为开源软件的开发者提供帮助,促进他们有效的改善软件在技术方面和使用方面的质量,使软件不断成熟和可持续的发展. 开放源代码软件由于开发模式和运作模式的独特性,

100offer举办的「寻找实干和坚持的技术力量」开源项目投票排名分析程序

由于100offer举办的「寻找实干和坚持的技术力量」开源项目投票活动没有按照票数排序的功能,所以本文写了个小程序来实现这个功能,代码如下: import org.jsoup.Jsoup; import org.jsoup.nodes.Element; import java.net.URL; import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; /**

Android 开源项目源码分析第一期正式发布

由 Trinea 发起.几十名 Android 开发者参与的Android 开源项目源码分析第一期正式发布. 从简介.总体设计.流程图.详细设计全方面分析开源库源码,第一期包括 10 个著名开源库及 5 个公共技术点的全面介绍. 分析文档 作者 Volley 源码解析 grumoon Universal Image Loader 源码分析 huxian99 Dagger 源码解析 扔物线 EventBus 源码解析 Trinea xUtils 源码解析 Caij ViewPagerindicat