在一些实时应用中,如实时产品销售,视频直播弹幕消息等并不希望用户输入太长内容,并且不希望同一用户同一时间发表相同的内容进行刷屏,一般只有一条很短的消息,对于一个十几个字节的Value数据,如果每条使用Key-Value插入,Key-Value读取有点浪费。在iBoxDB中有一种新特性KeyOnly,可以直接把Value压入到Key中,只需要一个Key就可以取得所需要的全部,下面介绍如何在iBoxDB数据库中使用这种KeyOnly的特性。
在iBoxDB中使用KeyValue特性只需要在表名前面加一个'/'符号,引擎就会自动按KeyOnly处理,其它相关操作基本与普通表一致,只有一点小区别就是不会保存非Key的内容,因为没有Value值,所以Update()函数在KeyOnly时总是返回False。可以使用先Delete再Insert模拟更新,也就是KeyValue操作类似字典,KeyOnly操作类似集合。
因为数据库引擎直接支持ORM,使用KeyOnly也可以把Key作为一个对象,下面定义这个Key
public static class ShortMSG { public long productId; public java.util.Date time; public long userId; public String msg; }
productId是产品id, time是发表时间, userId是用户id, msg是短消息。这是一个纯Java类。
然后在数据库里定义一个与这个类关联的表,表名使用'/'字符开头,如果定义为KeyOnly表,没定义为Key的字段不会被保存。
db.getConfig() .ensureTable(ShortMSG.class, "/shortmsg", "productId", "time", "userId", "msg(30)");
"msg(30)"代表字符串的最大长度是30个字符。一般在应用程序中检测长度,减少数据库的处理。
if ( mymsg.length() <= 30 ){ shortmsg.msg = mymsg; }else{ ... }
其它操作与操作普通数据表一样,在这个测试例子中,使用了100个产品,100个时间点,100个用户发送消息,也就是1,000,000(一百万) 条消息。
数据插入代码
try (Box box = auto.cube()) { for (long userid = 1; userid <= count; userid++) { ShortMSG smsg = new ShortMSG(); smsg.productId = fproId; smsg.time = new Date(fakeTime + fft); smsg.userId = userid; smsg.msg = smsg.productId + "-" + (fakeTime + fft) + "-" + smsg.userId; box.d("/shortmsg").insert(smsg); } if (box.commit().equals(CommitResult.OK)) { total.addAndGet(count); } }
数据读取代码:
try (Box box = auto.cube()) { for (ShortMSG smsg : box.select(ShortMSG.class, "from /shortmsg where productId==?", fproId)) { if (smsg.productId != fproId) { System.out.println("Unreachable"); } String cs = smsg.productId + "-" + (smsg.time.getTime()) + "-" + smsg.userId; if (!smsg.msg.equals(cs)) { System.out.println("Unreachable"); } total.incrementAndGet(); } }
测试结果:
Insert TotalObjects: 1,000,000 FileSize: 158MB Elapsed 10.314s, AVG 96,955 o/sec Select TotalObjects: 2,000,000 Elapsed 2.493s, AVG 802,246 o/sec
结果显示使用KeyOnly特性,处理1,000,000(一百万)条短消息只需要大约160MB的硬盘空间,进行2,000,000(二百万)次对象读取只需要2.5 秒,平均每秒读取越过500K个数据对象。
更多资料:
完整代码地址 https://github.com/iboxdb/forjava/tree/master/demos
iBoxDB数据库地址 http://www.iboxdb.com/
如果你在测试中发现超过了1000K对象每秒,这很正常,虚拟机会在运行中优化代码。测试结果在Java8,1G内存下取得,支持Java7,在 Java6下测试只需要把try( box ){ } 修改为 try{ } finally { box.close(); }
相关推荐
中盈nx 500k驱动是nx 500k针式打印机的驱动程序,本驱动适配xp1win7等操作系统,如果您在使用这款打印机时遇到识别错误问题,建议安装该驱动。参数介绍打印方式:双向/单向逻辑选距打印头寿命:5亿次/针行间距:1/6...
最近在学习STM32CubeMX软件,平台是用STM32103,通过HAL库配置can通信,500k频率,多个分组接收和发送CAN数据(目前已经添加两个分组),这个代码适应于初学者 高手就算了 不喜勿喷 感谢!
很小巧的去水印工具 我没分了大家帮帮忙好吧谢谢
500K的定时关机小程序,不占资源,绝对好用。
ES-500K储能双向变流器-技术方案.pdf
代码例程双CAN开发板程序 STM32_USART_LED_CAN500K代码例程双CAN开发板程序 STM32_USART_LED_CAN500K代码例程双CAN开发板程序 STM32_USART_LED_CAN500K代码例程双CAN开发板程序 STM32_USART_LED_CAN500K代码例程双...
500K12位32路模拟量数据采集卡带DIO开关控制功能参照.pdf
用于上传论坛时,把大文件分割为500k的小文件。把文件直接拖到批处理文件即可。
PCI数据采集卡500K12位16路模拟量数据采集卡带模拟量输出及开关量控制功能[汇编].pdf
可以批量处理图片、批量加水印、批量加入特效(对比度、亮度、饱和度、色相、模糊、锐化、变黑白、变棕色、反色等等、批量反转)。并可以设置压缩算法和图片质量等。
数据采集仪500K16路模拟量输入连续模拟量输出带开关量功能[汇编].pdf
最小的XP(500K),恐怖的精简程度!
虽然CAN协议本身具有一定的复杂度,但实际上使用CAN进行基本的数据收发是非常简单的,因为大部分工作都是硬件帮我们完成的,我们要做的仅仅是使用库函数往FIFO(CAN外设的某几个寄存器)中写入/读取数据而已。
ACDSee极小珍藏版,500K的东西,这个就不用多说了吧,下个收藏一下吧。
此款键盘是骨伽500k机械键盘驱动官方最新版,骨伽500k键盘,采用樱桃红轴、键盘与手托一体设计使用起来更舒适。推荐入手此款键盘的玩家下载安装。驱动安装:下载完毕后解压缩,将键盘与电脑链接,点击驱动文件夹中的...
df是非常好用的一个文本比对工具,支持目录比较,绿色免安装,500K大小,适用于任何微软window系统。欢迎下载使用!
小巧实用的桌面日历,才500k,占用极少的系统资源。
StealthMail 2.21 EXE file with setup (500K) A secure E-mail/file encryption program. (but no public key crypto) Combines my StealthMail 2.1 and my BlowfishVB. Freeware. Personal use only. Requires ...
3D效果字幕制作软件,不足500K免安装,上百种效果
极速浏览器,仅仅500k,绿色免安装,就一个文件