开源项目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表的数据过于臃肿。
源码如下:
handle_info(cleanup, #state{
table = Table,
clean_interval = CleanInterval
} = State) ->
Now = ets_cache:unixtime(),
%% error_logger:info_msg("cleanup now ~p~n", [Now]),
MS = ets:fun2ms(
fun({_, _, Timeout}) when is_integer(Timeout)->
Timeout =< Now
end),
ets:select_delete(Table, MS),
erlang:send_after(CleanInterval, self(), cleanup),
{noreply, State};
5 总结
ets_cache虽然设计简单,但是实用。能支持不同类型的数据,创建不同的ets表,而且读写效率高,实用与大量数据的缓存。并可以稍加改动就可以作为数据库和程序之间的缓存。但是,对于数据一致性要求较高的数据要慎用。当所有数据访问频率不高时,清除掉冷数据会产生ets空表。
ets_cache源码地址:https://github.com/roowe/ets_cache
优秀的代码是艺术品,它需要精雕细琢!
开源项目ets_cache分析的更多相关文章
- Diycode开源项目 BaseApplication分析+LeakCanary第三方+CrashHandler自定义异常处理
1.BaseApplication整个应用的开始 1.1.看一下代码 /* * Copyright 2017 GcsSloop * * Licensed under the Apache Licens ...
- Android开源项目pulltorefresh分析与简单使用
在Android开发中有时我们须要訪问网络实时刷新数据.比方QQ好友在线状态最新信息,QQ空间须要显示很多其它的好友动态信息,EOE论坛client显示很多其它的文章帖子信息等.android-pul ...
- 开源项目商业分析实例(1) - MonicaHQ
本来写一篇开源商业模式的稿子,因为有四大主题,这个稿子有点大,导致现在半个月过去了,都还没有憋出来. 今天想想还是采用MVP(minimum viable product,最小化可行产品)模式吧. ...
- Diycode开源项目 ImageActivity分析
1.首先看一下效果 1.1做成了一个GIF 1.2.我用格式工厂有点问题,大小无法调到手机这样的大小,目前还没有解决方案. 1.3.网上有免费的MP4->GIF,参考一下这个网站吧. 1.4.讲 ...
- Diycode开源项目 UserActivity分析
1.效果预览 1.1.实际界面预览 1.2. 这是MainActivity中的代码 这里执行了跳转到自己的用户界面的功能. 1.3.点击头像或者用户名跳转到别人的页面 UserActivity的结构由 ...
- Diycode开源项目 TopicContentActivity分析
1.效果预览以及布局分析 1.1.实际效果预览 左侧话题列表的布局是通过TopicProvider来实现的,所以当初分析话题列表就没有看到布局. 这里的话题内容不是一个ListView,故要自己布局. ...
- Diycode开源项目 LoginActivity分析
1.首先看一下效果 1.1.预览一下真实页面 1.2.分析一下: 要求输入Email或者用户名,点击编辑框,弹出键盘,默认先进入输入Email或用户名编辑框. 点击密码后,密码字样网上浮动一段距离,E ...
- Diycode开源项目 MainActivity分析
1.分析MainActivity整体结构 1.1.首先看一下这个界面的整体效果. 1.2.活动源代码如下 /* * Copyright 2017 GcsSloop * * Licensed under ...
- DiyCode开源项目 AboutActivity分析
1.首先看一下效果 这是手机上显示的效果: 1.1首先是一个标题栏,左侧一个左箭头,然后一个图标. 1.2然后下方是一个可以滑动的页面. 1.3分成了7个部分. 1.4DiyCode的图标. 1.5然 ...
随机推荐
- C# Windows - TabControl
TabControl控件的属性 - 一般用于控制TabPages对象容器的外观,特别是显示的选项卡的外观 属性 说明 Alignment 控制选项卡在选项卡控件的什么位置显示 Appearance 控 ...
- GIS的数学基础
在这里需要说明一点,任何领域的概念.技术都有其特定的适用范围,有其解决的问题,有其发展的历史,所以,抛开应用环境.范围来谈技术就像是没有根系的枝丫,枝丫再粗壮也只是一根木头而已. 那接下来我们来聊聊什 ...
- onClick(View) of type new View.OnClickListener(){} must override a superclass method
原地址:http://blog.csdn.net/aeolus1019/article/details/8014798 Android开发过程中代码错误报错如下: - implements andro ...
- 【C++基础】内存操作 getMemory改错
内存操作的考察点:①指针 ②变量生存期及作用范围 ③动态内存申请和释放 笔试题************************************************************* ...
- Flask, Tornado, GEvent, 以及它们的结合的性能比较
Flask, Tornado, GEvent, 以及它们的结合的性能比较 英文: http://blog.wensheng.com/2011/10/performance-of-flask-torna ...
- python time相关操作
1.获取当前时间的两种方法: 代码如下: import datetime,timenow = time.strftime("%Y-%m-%d %H:%M:%S")print now ...
- Side by Side Assembly介绍--manifest文件的使用
什么是Side-by-Side Assembly? Side-by-Side Assembly(建称SxS)是微软在Visual Studio 2005(Windows 2000?)中引入的技术,用来 ...
- java thread类和runable
java thread 类其实和其他类是一样的.有自己的属性和方法.以及有一个重写的run方法 不同的是:必须重写run()方法. run()方法是线程thread启动后cpu调用运行的程序代码. r ...
- Linux中的栈:用户态栈/内核栈/中断栈
http://blog.chinaunix.net/uid-14528823-id-4136760.html Linux中有多种栈,很容易弄晕,简单说明一下: 1.用户态栈:在进程用户态地址空间底部, ...
- jquery.dataTables插件使用例子详解
DataTables是一个jQuery的表格插件.这是一个高度灵活的工具,依据的基础逐步增强,这将增加先进的互动控制,支持任何HTML表格 效果图 代码 <!doctype html> & ...