mormot当作内存数据库(缓存)使用

mormot的TSQLRestStorageInMemory可以作为内存数据库来使用。

上图是在笔者4代I5笔记本上做的测试,增加10万记录,耗时:562毫秒。

增加的数据如下图所示(默认是JSON,当然也可以存为二进制格式的):

下面附上测试代码:

/// <author>cxg 2018-9-17</author>
/// mormot 数据缓存 unit Unit1; interface uses
SynCommons, SynDB, mORMot, mORMotDB, SynDBSQLite3, SynSQLite3Static, Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ToolWin, Vcl.ComCtrls; type
/// <summary>
/// 缓存的记录
/// </summary>
TPerson = class(TSQLRecord)
private
FNo: integer;
FName: string;
published
property No: Integer read FNo write FNo;
property Name: string read FName write FName;
end; type
TForm1 = class(TForm)
Label1: TLabel;
edtId: TEdit;
Label2: TLabel;
edtName: TEdit;
ToolBar1: TToolBar;
btnAdd: TToolButton;
btnAdds: TToolButton;
btnUpdate: TToolButton;
btnFind: TToolButton;
btnDelete: TToolButton;
btnDeleteAll: TToolButton;
mmo1: TMemo;
procedure btnAddClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btnFindClick(Sender: TObject);
procedure btnAddsClick(Sender: TObject);
procedure btnUpdateClick(Sender: TObject);
procedure btnDeleteAllClick(Sender: TObject);
procedure btnDeleteClick(Sender: TObject);
private
{ Private declarations }
FMemDB: TSQLRestStorageInMemory;
FModel: TSQLModel;
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btnAddClick(Sender: TObject);
var
LPerson: TPerson;
begin
try
LPerson := TPerson.Create;
LPerson.No := StrToInt(edtId.Text);
LPerson.Name := edtName.Text;
if FMemDB.Add(LPerson, True) = 0 then
begin
ShowMessage('增加失败');
end
else
begin
edtId.Clear;
edtName.Clear;
edtId.SetFocus;
end;
finally
LPerson.Free;
end;
end; procedure TForm1.btnAddsClick(Sender: TObject);
var
a, b, c: Cardinal;
i: Integer;
LPerson: TPerson;
begin
a := GetTickCount;
try
LPerson := TPerson.Create; for i := 0 to 100000 do
begin
LPerson.no:= i;
LPerson.Name := RandomGUID.ToString;
if FMemDB.Add(LPerson, True) = 0 then
begin
mmo1.Lines.Add('失败: ' + i.ToString);
end;
end;
b := GetTickCount;
c := b - a;
mmo1.Lines.Add('耗时: ' + c.ToString + ' 毫秒');
finally
LPerson.Free;
end;
end; procedure TForm1.btnDeleteAllClick(Sender: TObject);
begin
FMemDB.DropValues;
end; procedure TForm1.btnDeleteClick(Sender: TObject);
var
LNo: string;
begin
LNo := '';
if FMemDB.Delete(TPerson, LNo) then
begin
mmo1.Lines.Add('删除成功');
end else
begin
mmo1.Lines.Add('删除失败');
end; end; procedure TForm1.btnFindClick(Sender: TObject);
var
LPerson: TPerson;
begin
LPerson := TPerson.Create(FMemDB, 'Id=?', [edtId.Text]);
if LPerson <> nil then
begin
edtId.Text := LPerson.no.ToString;
edtName.Text := LPerson.Name;
end;
end; procedure TForm1.btnUpdateClick(Sender: TObject);
var
LPerson: TPerson;
begin
LPerson := TPerson.Create;
LPerson.no := StrToInt(edtId.Text);
LPerson.Name := edtName.Text; if FMemDB.Update(LPerson) then
begin
mmo1.Lines.Add('更新成功: ' + LPerson.no.ToString);
end
else
begin
mmo1.Lines.Add('更新失败: ' + LPerson.no.ToString);
end;
LPerson.Free;
end; procedure TForm1.FormCreate(Sender: TObject);
begin
FModel := TSQLModel.Create([TPerson]);
FMemDB := TSQLRestStorageInMemory.Create(TPerson, nil, 'test.db');
end; procedure TForm1.FormDestroy(Sender: TObject);
begin
FModel.Free;
FMemDB.Free;
end; end.

  

mormot当作内存数据库(缓存)使用的更多相关文章

  1. 用redis当作LRU缓存

    原文地址:https://redis.io/topics/lru-cache Redis可以用来作缓存,他可以很方便的淘汰(删除)旧数据添加新数据,类似memcached.LRU只是其中的一种置换算法 ...

  2. Redis 详解 (一) StackExchange.Redis Client

    这期我们来看StackExchange.Redis,这是redis 的.net客户端之一.Redis是一个开源的内存数据存储,可以用来做数据库,缓存或者消息代理服务.目前有不少人在使用ServiceS ...

  3. StackExchange.Redis Client

    StackExchange.Redis Client 这期我们来看StackExchange.Redis,这是redis 的.net客户端之一.Redis是一个开源的内存数据存储,可以用来做数据库,缓 ...

  4. Spring Data Redis 让 NoSQL 快如闪电 (1)

    [编者按]本文作者为 Xinyu Liu,详细介绍了 Redis 的特性,并辅之以丰富的用例.在本文的第一部分,将重点概述 Redis 的方方面面.文章系国内 ITOM 管理平台 OneAPM 编译呈 ...

  5. 前端学HTTP之重定向和负载均衡

    前面的话 HTTP并不是独自运行在网上的.很多协议都会在HTTP报文的传输过程中对其数据进行管理.HTTP只关心旅程的端点(发送者和接收者),但在包含有镜像服务器.Web代理和缓存的网络世界中,HTT ...

  6. redis该如何分区-译文(原创)

    写在最前,最近一直在研究redis的使用,包括redis应用场景.性能优化.可行性.这是看到redis官网中一个链接,主要是讲解redis数据分区的,既然是官方推荐的,那我就翻译一下,与大家共享. P ...

  7. PHPExcel中文开发手册翻译版(2)

    2016年8月18日12:45:14 请注意这个是粗翻译版,仅供参考,不是精校版 精校版后面才会更新 PHPExcel开发者文档 1.目录 2. 4先决条件 2.1.软件要求4 2.2.安装说明4 2 ...

  8. 控制器层(Controllers)

    本章译者:@freewind 业务逻辑代码通常位于模型(model)层.客户端(比如浏览器)无法直接调用其中的代码,所以模型对象提供的功能,必须作为资源以URI方式暴露给外部. 客户端使用HTTP协议 ...

  9. Linux内存管理原理

    本文以32位机器为准,串讲一些内存管理的知识点. 1. 虚拟地址.物理地址.逻辑地址.线性地址 虚拟地址又叫线性地址.linux没有采用分段机制,所以逻辑地址和虚拟地址(线性地址)(在用户态,内核态逻 ...

随机推荐

  1. Mget is available.

    Table of Contents 1. Introduction 2. Use tmget in gentoo 3. About MTU 1 Introduction MulityGet to sp ...

  2. python类、类继承

    yield: 简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab( ...

  3. 红黑树:个人理解与Python实现

    红黑树:个人理解与Python实现 [基本事实1] 红黑树是一种平衡的二叉查找树,无论插入还是删除操作都可以在O(lg n)内实现,而一般的二叉查找树则在极端情况下会退化为线性结构.红黑树之所以是平衡 ...

  4. GridLayout 计算器

    <?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android=" ...

  5. lnmp 一键安装包

    系统需求: CentOS/RHEL/Fedora/Debian/Ubuntu/Raspbian Linux系统 需要5GB以上硬盘剩余空间 需要128MB以上内存(如果为128MB的小内存VPS,Xe ...

  6. 决策树 (decision tree)

    内容学习于 ApacheCN github 定义: 分类决策树模型是一种描述对实例进行分类的树形结构.决策树由结点(node)和有向边(directed edge)组成.结点有两种类型:内部结点(in ...

  7. modCount干嘛的

    在ArrayList.LinkedList.HashMap等等的内部增删改中我们总能看到modCount的身影,modCount字面意思就是修改次数,但为什么要记录modCount的修改次数呢? 大家 ...

  8. java jdbc深入理解(connection与threadlocal与数据库连接池和事务实)

    1.jdbc连接数据库,就这样子 Class.forName("com.mysql.jdbc.Driver");java.sql.Connection conn = DriverM ...

  9. Python 中的面向对象和异常处理

    在之前我们已经说过了 Python 中内置的主要的几种对象类型,(数,字符串,列表,元组和字典).而面向对象的核心人物还没出场呢 .那么我们常说的对象是什么类型的呢,其实他的类型就是“类”.继承封装和 ...

  10. Revit二次开发示例:ChangesMonitor

    在本示例中,程序监控Revit打开文件事件,并在创建的窗体中更新文件信息.   #region Namespaces using System; using System.Collections.Ge ...