我开发的产品的模块中,近期增加了一个“日志索引”功能,用于快速在多个大文件中定位运行日志。
找到一个关键模块的开源软件 mapdb,这是一个好东西啊
将map的快速与持久化(或半持久化)功能融合在一起,就是一个JAVA嵌入式的 Redis
mapdb与Redis区别:
Redis也能完全相同的工作,但必竟其独立于JVM之外通过Socket交互,能达到10万次/秒就很不了不起了
mapdb可直接嵌入到JVM运行空间,运行效率是Redis没法比的,单线程能达到 30万次/秒
mapdb的使用场景:
1、用于JVM内部的缓存,全内存操作,在标准Java map的基本上,增加过期时间、最大记录数等限制
2、用于将Map中的内容持久化,可调用 db.commit()提交到文件
3、用于大量map数据的持久化或半执久化(提升性能)
本系统中用于日志索引的数据即为半持久化操作,每分钟提交一次即可,中间丢一部份数据也无所谓,设计上下次会进行“断点继续”
本次从mapdb.org发布网站上下载了最新的版本,性能测试了一下,很优秀,API也比较人性化。
遇到问题:
集成到本系统中后,日志索引功能运行正常,对增量的日志建索引也比较快,每秒处理日志量 150M
在系统做了其它多个功能模块修改后,最后集成的版本在日志索引这块运行有问题:
每次启动时,mapdb模块报异常:
java.lang.ArrayIndexOutOfBoundsException: 2
at org.mapdb.StoreDirect.recidToOffset(StoreDirect.java:1639)
at org.mapdb.StoreWAL.get2(StoreWAL.java:450)
at org.mapdb.Store.get(Store.java:253)
at org.mapdb.HTreeMap.recursiveDirCount(HTreeMap.java:529)
at org.mapdb.HTreeMap.sizeLong(HTreeMap.java:500)