在一些实时应用中,如实时产品销售,视频直播弹幕消息等并不希望用户输入太长内容,并且不希望同一用户同一时间发表相同的内容进行刷屏,一般只有一条很短的消息,对于一个十几个字节的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(); }
相关推荐
软件设计方面,主要使用C语言进行实现,包括对A/D转换器的控制逻辑,数据处理算法,以及串口通信协议的编程。软件功能包括初始化设置、数据采集、转换处理、串口通信和状态监控等。 在实际应用中,数据处理系统在...
总结而言,“不到500K超小巧绿色批量压图工具”是一款高效、易用的图片处理软件,它将繁琐的图片操作简化为一键完成,极大地提升了图片处理的工作效率。无论是专业设计师还是普通用户,都可以从中受益,实现图片处理...
标题中的“不足500K的去水印小软件”指的是这款工具的体积小巧,容量小于500KB,这在软件领域意味着它不会占用大量的硬盘空间,方便用户下载和存储。去水印功能通常是指从图像或视频中移除不需要的标识、文字或图案...
中盈nx 500k驱动是nx 500k针式打印机的驱动程序,本驱动适配xp1win7等操作系统,如果您在使用这款打印机时遇到识别错误问题,建议安装该驱动。参数介绍打印方式:双向/单向逻辑选距打印头寿命:5亿次/针行间距:1/6...
在信息技术迅速发展的今天,文件比较工具成为了不可或缺的辅助软件,广泛应用于数据校验、版本控制以及代码审查等众多场景。众所周知,对比两个文件的内容差异,不仅可以帮助开发者及时发现代码中的错误,同样对于...
最近在学习STM32CubeMX软件,平台是用STM32103,通过HAL库配置can通信,500k频率,多个分组接收和发送CAN数据(目前已经添加两个分组),这个代码适应于初学者 高手就算了 不喜勿喷 感谢!
然而,值得注意的是,“ACDSee极小珍藏版500K”可能不包含最新版本的所有特性,例如高级的图像处理工具、更完善的RAW支持等。如果需要更专业的功能,可能需要考虑下载完整版或更高版本的ACDSee。 总的来说,ACDSee...
【500k文件分割器】是一款专门设计用于在上传论坛等有文件大小限制的场合,将大文件拆分为多个500KB的小文件的工具。这个工具通过一个批处理文件(Auto_rar.bat)来实现,使得用户只需简单地将大文件拖放到批处理...
在本文中,我们将深入探讨"数据采集仪500K16路模拟量输入连续模拟量输出带开关量功能[汇编].pdf"的相关知识点,主要围绕数据采集卡PCI8603的功能特性、硬件结构以及其在软件网络技术中的应用。 首先,数据采集卡是...
500K的定时关机小程序,不占资源,绝对好用。
ES-500K储能双向变流器-技术方案.pdf
代码例程双CAN开发板程序 STM32_USART_LED_CAN500K代码例程双CAN开发板程序 STM32_USART_LED_CAN500K代码例程双CAN开发板程序 STM32_USART_LED_CAN500K代码例程双CAN开发板程序 STM32_USART_LED_CAN500K代码例程双...
【TSM12S驱动详解】 TSM12S是一款广泛应用在触摸领域的控制器,尤其在已经批量生产超过500K的设备中表现出...在实际开发中,开发者需要熟练掌握TSM12S的特性,结合tsm12.c和tsm12.h文件,编写出高效、健壮的驱动程序。
数据处理单元根据设计的算法对采样数据进行实时处理;逻辑时序控制单元协调各个模块的工作;主机通信单元负责将处理后的数据传输给上位机;电源模块则为整个系统提供稳定的电源。 最后,由于硬件开发过程中对存储...
"Streambox Ripper"可能是指该软件或工具的一个特定版本或组件,专门用于抓取流媒体音频并进行高效压缩。 MP3压缩是一种常见的音频编码格式,它通过丢弃人耳难以察觉的音频信息来降低文件大小,以便于存储和传输。...
每个消息对象有自己的标识符(ID)和数据长度,可以根据需求配置多个对象。 3. 发送CAN报文:当用户按下按键时,程序应将数据打包成CAN帧,设置正确的ID和数据,并通过CAN控制器发送出去。 4. 接收CAN报文:在接收端...
PCI数据采集卡是一种用于计算机系统中的硬件设备,用于获取、处理和控制各种模拟和数字信号。...其详细的硬件使用说明书为用户提供了全面的安装和操作指南,确保了用户能有效利用这款设备进行精确的数据采集和控制。
标题中的“最小的XP(500K)”指的是一个经过高度精简的Windows XP操作系统,其安装文件大小仅为500KB左右。这样的系统通常是为了在低配置硬件上运行或者进行特定用途定制的,比如旧电脑升级、无盘工作站或者嵌入式...