前一段时间 GreptimeDB 发布了 v0.1 的版本,虽然还很早期,但已经是一个比较可靠并且可以在实际场景中应用的数据库了。
是的,你已经是一个成熟的数据库,可以去做一些有意义的事情了。
我们都知道,时序数据主要在物联网以及监控领域产生,而且数据量通常很大且非常高频。
那么我一个普通程序员,每天就是坐在工位上敲键盘,哪里能接触到能产生高频海量数据的场景呢?
哎,等一下,敲键盘好像就是在产生时序数据,我也有点好奇每天到底会按多少次按键,以及哪些按键使用的频率更高一些。经常有梗图说程序员每天主要都在用 ctrl+C 和 ctrl+V ,那程序员们到底每天会用多少次复制粘贴呢?
现在,有了 v0.1 版本的数据库,我们只需要写一个脚本,再配合使用 GreptimeDB 统计一下也许就能获得答案。
下载连接 数据库⏬
首先是在本地安装 GreptimeDB,我们最近刚刚上线了下载页,你可以在官网下载编译好的二进制版本,然后使用 greptime standalone start
启动一个单机版,不出意外的话,你应该可以看到:

我们使用 4000 端口的 HTTP 接口对数据库进行请求,只要发送 SQL 语句即可,具体语法参见:https://docs.greptime.com/user-guide/supported-protocols/http-api
编写脚本 记录信息⌨️
比如我们在命令行中输入 curl http://localhost:4000/v1/sql -d "sql=CREATE TABLE keymaster(key STRING, ts TIMESTAMP TIME INDEX) "
就可以创建一个新的表,用于记录按键信息。
接下来就是如何记录按键的信息,这里就用我比较熟悉的 Node.js 来解决了。
const axios = require('axios')
const qs = require('qs')
const { GlobalKeyboardListener } = require('node-global-key-listener')
const v = new GlobalKeyboardListener()
//Log every key that's pressed.
v.addListener(function (e, down) {
if (e.state === 'DOWN') {
let metaKey = Object.entries(down)
.filter(([key, value]) => value === true && key.length > 1 && !/LOCK/.test(key))
.map(([key, value]) => key)
if (e.name.length === 1) metaKey.push(e.name)
metaKey = metaKey.join('+')
saveKeypressEvent(metaKey)
console.log(${metaKey})
}
})
const saveKeypressEvent = async (metaKey) => {
try {
const response = await axios.post(
'http://127.0.0.1:4000/v1/sql?db=public',
qs.stringify({
sql: INSERT INTO keymaster(key, ts) VALUES('${metaKey}', ${new Date().valueOf()}),
})
)
} catch (error) {
console.log(error)
}
}
这里我把多键的情况提取了出来,用来统计所有组合键的频率。
🔍查询 分析
接下来我用了 xbar 运行了一个定时脚本输出查询结果,当然,你们用其他的任何方式运行查询语句都可以。比如 SELECT key , COUNT(*) as times FROM keymaster WHERE LENGTH(key) < 2 GROUP BY key ORDER BY times DESC limit 10
可以查询点击最多的10个单字母按键;
SELECT key , COUNT(*) as times FROM keymaster WHERE key like '%+%' GROUP BY key ORDER BY times DESC limit 10
查询使用最多的10个组合键。
数据结果🤩
这个是在记录了一个多礼拜以后的累积数据,从这个结果可以获得很多有趣的结论:

⌨️ 每天平均按键 10000 次左右
🔙 有超过十分之一的按键是退格
📝 使用最多的字母是 i ,比第二名 e 多出近 20%,应该是因为我日常使用 vim
🪟 大量使用 cmd+w 关闭窗口,因为我是一个没有囤积标签页习惯的人
💪 虽然开启了 auto save ,但是 cmd+s 好像已经形成了肌肉记忆
🆒 cmd+V 比 cmd+C 多出近 20%,因为复制后至少有一次粘贴。
🔛 复制粘贴果然是程序员高频使用的组合键
你们可能发现前面的截图还有一个 APM (Actions Per Minute),这是我用输入时间实时计算后存入另一张表的数据。
📈结果可视化
你可以在浏览器输入:http://localhost:4000/dashboard
打开控制台,输入 SELECT * FROM apm ORDER BY ts DESC LIMIT 1800
就可以查看可视化的数据图表。
Dashboard 是 Greptime 团队开源的另一个项目,用于帮助用户更方便地使用 GreptimeDB。Dashboard 已经被集成到 GreptimeDB 的发行版中,运行数据库后即可以在本地启动使用。

这是最近 30 分钟的每分钟平均输入数(APM,Actions Per Minute),我这个手速还可以吧😎。
哦,你在本地是看不到的这个数据,因为你还没有建立 APM 表,至于如何操作,相信看完前文以后,写一段统计脚本对于你来说应该很简单了吧。
如果在使用 GreptimeDB 以及 Dashboard 的过程中遇到任何问题,或者有建议欢迎为我们的项目提 issue 或者 pr。
这是一个非常简单的例子,也只用到了 GreptimeDB 诸多能力的一小部分,而且这个数据量也太小了,别说是一个人输入,就算是十个人一起用脸滚键盘,GreptimeDB 可以轻松接住。
所以如果大家有更大更多数据的场景,一定要试用一下我司的 GreptimeDB。
关于 Greptime
Greptime 格睿科技专注于为可观测、物联网及车联网等领域提供实时、高效的数据存储和分析服务,帮助客户挖掘数据的深层价值。目前基于云原生的时序数据库 GreptimeDB 已经衍生出多款适合不同用户的解决方案,更多信息或 demo 展示请联系下方小助手(微信号:greptime)。
欢迎对开源感兴趣的朋友们参与贡献和讨论,从带有 good first issue 标签的 issue 开始你的开源之旅吧~期待在开源社群里遇见你!添加小助手微信即可加入“技术交流群”与志同道合的朋友们面对面交流哦~
Star us on GitHub Now: https://github.com/GreptimeTeam/greptimedb
Twitter: https://twitter.com/Greptime
Slack: https://greptime.com/slack