`

使用KeyOnly特性进行500K对象每秒高效数据处理

阅读更多

在一些实时应用中,如实时产品销售,视频直播弹幕消息等并不希望用户输入太长内容,并且不希望同一用户同一时间发表相同的内容进行刷屏,一般只有一条很短的消息,对于一个十几个字节的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(); }

分享到:
评论

相关推荐

    基于ARM的数据处理系统设计.pdf

    软件设计方面,主要使用C语言进行实现,包括对A/D转换器的控制逻辑,数据处理算法,以及串口通信协议的编程。软件功能包括初始化设置、数据采集、转换处理、串口通信和状态监控等。 在实际应用中,数据处理系统在...

    不到500K超小巧绿色批量压图工具

    总结而言,“不到500K超小巧绿色批量压图工具”是一款高效、易用的图片处理软件,它将繁琐的图片操作简化为一键完成,极大地提升了图片处理的工作效率。无论是专业设计师还是普通用户,都可以从中受益,实现图片处理...

    不足500K的去水印小软件

    标题中的“不足500K的去水印小软件”指的是这款工具的体积小巧,容量小于500KB,这在软件领域意味着它不会占用大量的硬盘空间,方便用户下载和存储。去水印功能通常是指从图像或视频中移除不需要的标识、文字或图案...

    中盈NX-500K打印机驱动 v1.1 官方最新版

    中盈nx 500k驱动是nx 500k针式打印机的驱动程序,本驱动适配xp1win7等操作系统,如果您在使用这款打印机时遇到识别错误问题,建议安装该驱动。参数介绍打印方式:双向/单向逻辑选距打印头寿命:5亿次/针行间距:1/6...

    500K大小的绿色文本文件对比工具df

    在IT领域,文件对比工具是不可或缺的辅助软件,它们帮助用户快速识别两个或多个文件之间的差异,以便于数据校验、版本控制或者代码审查。"500K大小的绿色文本文件对比工具df"就是这样的一个实用工具,特别适合...

    STM32F103TB_CAN_500K.zip

    最近在学习STM32CubeMX软件,平台是用STM32103,通过HAL库配置can通信,500k频率,多个分组接收和发送CAN数据(目前已经添加两个分组),这个代码适应于初学者 高手就算了 不喜勿喷 感谢!

    ACDSee极小珍藏版500K

    然而,值得注意的是,“ACDSee极小珍藏版500K”可能不包含最新版本的所有特性,例如高级的图像处理工具、更完善的RAW支持等。如果需要更专业的功能,可能需要考虑下载完整版或更高版本的ACDSee。 总的来说,ACDSee...

    500k文件分割器

    【500k文件分割器】是一款专门设计用于在上传论坛等有文件大小限制的场合,将大文件拆分为多个500KB的小文件的工具。这个工具通过一个批处理文件(Auto_rar.bat)来实现,使得用户只需简单地将大文件拖放到批处理...

    数据采集仪500K16路模拟量输入连续模拟量输出带开关量功能[汇编].pdf

    在本文中,我们将深入探讨"数据采集仪500K16路模拟量输入连续模拟量输出带开关量功能[汇编].pdf"的相关知识点,主要围绕数据采集卡PCI8603的功能特性、硬件结构以及其在软件网络技术中的应用。 首先,数据采集卡是...

    500K的定时关机小程序,不占资源,绝对好用。

    500K的定时关机小程序,不占资源,绝对好用。

    ES-500K储能双向变流器-技术方案.pdf

    ES-500K储能双向变流器-技术方案.pdf

    STM32H750VBT6 CAN通信收发

    每个消息对象有自己的标识符(ID)和数据长度,可以根据需求配置多个对象。 3. 发送CAN报文:当用户按下按键时,程序应将数据打包成CAN帧,设置正确的ID和数据,并通过CAN控制器发送出去。 4. 接收CAN报文:在接收端...

    代码例程双CAN开发板程序 STM32-USART-LED-CAN500K

    代码例程双CAN开发板程序 STM32_USART_LED_CAN500K代码例程双CAN开发板程序 STM32_USART_LED_CAN500K代码例程双CAN开发板程序 STM32_USART_LED_CAN500K代码例程双CAN开发板程序 STM32_USART_LED_CAN500K代码例程双...

    TSM12S驱动(已批量500K以上的成熟应用)

    【TSM12S驱动详解】 TSM12S是一款广泛应用在触摸领域的控制器,尤其在已经批量生产超过500K的设备中表现出...在实际开发中,开发者需要熟练掌握TSM12S的特性,结合tsm12.c和tsm12.h文件,编写出高效、健壮的驱动程序。

    基于FPGA的实时数据采集与处理系统.pdf

    数据处理单元根据设计的算法对采样数据进行实时处理;逻辑时序控制单元协调各个模块的工作;主机通信单元负责将处理后的数据传输给上位机;电源模块则为整个系统提供稳定的电源。 最后,由于硬件开发过程中对存储...

    小巧实用的桌面日历(500k)

    这个桌面日历软件设计的目标是高效且不消耗过多的系统资源,确保用户在使用时电脑性能不会受到明显影响。 在描述中提到的“占用极少的系统资源”进一步强调了这款日历应用的优化程度。通常,这样的程序会精心编写...

    手机MP3压缩王(10倍500k)-Streambox Ripper.rar

    "Streambox Ripper"可能是指该软件或工具的一个特定版本或组件,专门用于抓取流媒体音频并进行高效压缩。 MP3压缩是一种常见的音频编码格式,它通过丢弃人耳难以察觉的音频信息来降低文件大小,以便于存储和传输。...

    PCI数据采集卡500K12位16路模拟量数据采集卡带模拟量输出及开关量控制功能[汇编].pdf

    PCI数据采集卡是一种用于计算机系统中的硬件设备,用于获取、处理和控制各种模拟和数字信号。...其详细的硬件使用说明书为用户提供了全面的安装和操作指南,确保了用户能有效利用这款设备进行精确的数据采集和控制。

Global site tag (gtag.js) - Google Analytics