摘要: 一,为什么我们要使用规则引擎
二,我们要怎么样实现规则引擎
2, 数据库是怎么读懂Sql,为什么数据库能将Sql自动转化为高效的算法。
3, 为什么数据库能用有限的内存处理无限外存数据,数据库怎么处理内存与外存的交换关系。
4, Page是什么东西,B-tree与Page是怎么联系起来的。
5, Index是什么东西,它是怎么添加上去的,为什么加上它sql就查的特别快。
阅读全文
posted @ 2010-11-05 23:24 konyel 阅读(1581) 评论(2)
编辑
摘要: 注 本文为原创文章,作者konyel享有著作权,欢迎转载,请注明出处和原文地址。
阅读全文
posted @ 2010-10-27 21:57 konyel 阅读(252) 评论(0)
编辑
摘要: 许多人听到内存数据库第一印象就是大型的电信企业,银行的解决方案,但其实内存数据的应用相当广泛,从中型网站并发到批量文件处理都可以有很有效 的 应用。 在商业领域的内存数据库主要ALTIBASE,与Oracle,TimesTen,但其昂贵的授权费(数十万$)令许多普通用户望而却步。 在这里希望能整合在自身对数据处理业务的,开发并商业化一款面向普通用户的内存数据库,整合文件数据处理,和数据库数据处理,并发高效率处理的内存数据库解决方案。 而开发我们数据库的方向,当然不在于与有十多年根基的TimesTen们竞争,在于开发一款拥有基本功能,具备二次开发的价值 的内存数据处理软件,并提供在批量数据处理,
阅读全文
posted @ 2009-06-30 11:26 konyel 阅读(8276) 评论(25)
编辑
刚刚跟朋友讨论单体模式的实现,以下是我为公司写的基类的实现,应该是经过很多项目的考验的,拿出来跟大家探讨下,
/**
* @author konyel lin
* @version 0.1
* @brief Singleton
*/
#include <cassert>
#ifndef EXPORT_H
#define EXPORT_H
#define Export _declspec(dllexport)
#endif
#ifndef _SINGLETON_H__
#define _SINGLETON_H__
template <typename T> class Singleton
{
protected:
static T* ms_Singleton;
public:
Singleton( void )
{
assert( !ms_Singleton );
//vc编译器
#if defined( _MSC_VER ) && _MSC_VER < 1200
int offset = (int)(T*)1 - (int)(Singleton <T>*)(T*)1;
ms_Singleton = (T*)((int)this + offset);
#else
ms_Singleton = static_cast<T*>( this );
#endif
}
~Singleton( void )
{ assert( ms_Singleton ); ms_Singleton = 0; }
static T& getSingleton( void )
{
assert( ms_Singleton );
return ( *ms_Singleton );
}
static T* getSingletonPtr( void )
{ return ms_Singleton; }
};
#endif
posted @ 2011-07-28 22:21 konyel 阅读(652) 评论(0)
编辑
摘要: 这里回到文章主目录 [置顶]内存数据库内核开发探索 之前由于考虑到使用Page的内存和磁盘互换的机制实现了B-tree做为数据库的键值索引,在真实的生产环境下2000万以上的数据建立索引会使到B-tree层数增多,效率明显下降,在运算工程中使用AIX大型机都用了数天才将2000多万的数据生成出来,效果非常不理想。 全新的框架采用了纯内存的红黑树作为数据的索引,效果很好,性能测试中,用thinkpad 201i 电脑建立1000万的红黑树只用了3分钟,消耗内存270M这在电信项目的生产环境是完全可以接受的。 该代码使用内存池和红黑树的技术,参考主要文献包括: http://zh.wikiped.
阅读全文
posted @ 2011-06-23 20:13 konyel 阅读(1970) 评论(14)
编辑
为了提高效率和有效的监控内存的实时状态,我们采取了内存池的思想来解决效率与对内存实现监控的问题。
网上查找到了一些方案,根据自己的理解实现了应用。
我们什么时候要调用到内存池,
1,当我们频繁的申请释放同样数据大小的内存空间,我们可以用比动态new更有效方式来管理内存时,我们应该用内存池来提高效率。
2,当我们需要知道内存实时的申请状态,以便于对于服务器内存状态做实时预警时,我们可以用内存池的接口,来给内存增加监控。
实现的特点:
1,内存池内存单元大小可以动态定义,实现多级内存池。
2,申请效率很高,单元测试下是普通new/delete的4倍左右,当然具体性能还应机器类别而异。
MemoryPool.h 的实现
//该内存池理论来自于IBM文章,http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html
//作者冯宏华,徐莹,程远,汪磊享有论文著作权,由2011-06-06 konyel lin根据相关代码和理论进行优化修改。
#include <string>
#include <malloc.h>
//内存对齐值,可以根据机器取指长度进行设置
#define MEMPOOL_ALIGNMENT 4
#define USHORT unsigned short
#define ULONG unsigned long
struct MemoryBlock
{
USHORT nSize;
USHORT nFree;
USHORT nFirst;
USHORT nDummyAlign1;
MemoryBlock* pNext;
char aData[1];
static void* operator new(size_t,USHORT nTypes, USHORT nUnitSize){
return ::operator new(sizeof(MemoryBlock) + nTypes * nUnitSize);
}
static void operator delete(void *p, size_t){
::operator delete (p);
}
MemoryBlock (USHORT nTypes = 1, USHORT nUnitSize = 0);
~MemoryBlock() {}
};
class MemoryPool
{
private:
MemoryBlock* pBlock;
USHORT nUnitSize;
USHORT nInitSize;
USHORT nGrowSize;
public:
MemoryPool( USHORT nUnitSize,
USHORT nInitSize = 1024,
USHORT nGrowSize = 256 );
~MemoryPool();
void* Alloc();
void Free( void* p );
};
MemoryPool.cpp 的实现
#include "MemoryPool.h"
MemoryPool::MemoryPool( USHORT _nUnitSize,
USHORT _nInitSize, USHORT _nGrowSize )
{
pBlock = NULL;
nInitSize = _nInitSize;
nGrowSize = _nGrowSize;
if ( _nUnitSize > 4 )
nUnitSize = (_nUnitSize + (MEMPOOL_ALIGNMENT-1)) & ~(MEMPOOL_ALIGNMENT-1);
else if ( _nUnitSize <= 2 )
nUnitSize = 2;
else
nUnitSize = 4;
}
void* MemoryPool::Alloc()
{
MemoryBlock* pMyBlock;
if ( !pBlock ){
//第一次调用初始化内存块
pMyBlock =new(nGrowSize, nUnitSize) MemoryBlock(nGrowSize, nUnitSize);
pBlock = pMyBlock;
return (void*)(pMyBlock->aData);
}
pMyBlock = pBlock;
while (pMyBlock && !pMyBlock->nFree )
pMyBlock = pMyBlock->pNext;
if ( pMyBlock ){
printf("get a mem from block\n");
char* pFree = pMyBlock->aData+(pMyBlock->nFirst*nUnitSize);
//aData记录实际的内存单元标识
pMyBlock->nFirst = *((USHORT*)pFree);
pMyBlock->nFree--;
return (void*)pFree;
}
else{
printf("add a new block\n");
if (!nGrowSize)
return NULL;
pMyBlock = new(nGrowSize, nUnitSize) MemoryBlock(nGrowSize, nUnitSize);
if (!pMyBlock )
return NULL;
pMyBlock->pNext = pBlock;
pBlock = pMyBlock;
return (void*)(pMyBlock->aData);
}
}
void MemoryPool::Free( void* pFree ){
MemoryBlock* pMyBlock = pBlock;
MemoryBlock* preMyBlock;
//确定该待回收分配单元(pFree)落在哪一个内存块的指针范围内,大于起始节点,小于终止节点。
while ( ((ULONG)pMyBlock->aData > (ULONG)pFree) ||
((ULONG)pFree >= ((ULONG)pMyBlock->aData + pMyBlock->nSize))){
//不在内存块范围内,则历遍下一个节点
preMyBlock=pMyBlock;
pMyBlock=pMyBlock->pNext;
}
pMyBlock->nFree++;
*((USHORT*)pFree) = pMyBlock->nFirst;
pMyBlock->nFirst = (USHORT)(((ULONG)pFree-(ULONG)(pBlock->aData)) / nUnitSize);
//判断内存块是否全部为自由状态,是则释放整个内存块
if (pMyBlock->nFree*nUnitSize == pMyBlock->nSize ){
preMyBlock->pNext=pMyBlock->pNext;
delete pMyBlock;
}
}
MemoryBlock::MemoryBlock (USHORT nTypes, USHORT nUnitSize)
: nSize (nTypes * nUnitSize),
nFree (nTypes - 1),
nFirst (1),
pNext (0)
{
char * pData = aData;
for (USHORT i = 1; i < nTypes; i++) {
//将内存块的前2个字节用来存放内存单元的标识
*reinterpret_cast<USHORT*>(pData) = i;
pData += nUnitSize;
}
}
posted @ 2011-06-06 15:05 konyel 阅读(1889) 评论(5)
编辑
摘要: 一,为什么我们要使用规则引擎
二,我们要怎么样实现规则引擎
2, 数据库是怎么读懂Sql,为什么数据库能将Sql自动转化为高效的算法。
3, 为什么数据库能用有限的内存处理无限外存数据,数据库怎么处理内存与外存的交换关系。
4, Page是什么东西,B-tree与Page是怎么联系起来的。
5, Index是什么东西,它是怎么添加上去的,为什么加上它sql就查的特别快。
阅读全文
posted @ 2010-11-05 23:24 konyel 阅读(1581) 评论(2)
编辑
注 本文为原创文章,作者konyel享有著作权,欢迎转载,请注明出处和原文地址。


posted @ 2010-10-27 22:07 konyel 阅读(395) 评论(0)
编辑
注 本文为原创文章,作者konyel享有著作权,欢迎转载,请注明出处和原文地址。



posted @ 2010-10-27 21:57 konyel 阅读(252) 评论(0)
编辑
摘要: QQREADERC0DE2DE38D506198
阅读全文
posted @ 2010-05-08 14:49 konyel 阅读(103) 评论(0)
编辑
摘要: 内存数据库内核开发 工作日志(innodb的原理,算法详细剖析)(九) 几个星期来一直在数据库文档的大海中浸泡,突然发现我还是没能深入到数据库内核开发的真正核心,始终停留在sqlite这个简单的框架无法突破,我需要重新思考一个新的切入点,最开始研究SQLite数据库,收获是数据库引擎开发的基本原理,虚拟机,代码生成,B-tree的各种算法,但当我考虑拓展其功能时我傻眼了,我没有一种专业的手法去扩展...
阅读全文
posted @ 2009-07-09 10:06 konyel 阅读(3435) 评论(10)
编辑
摘要: 经过几天好好地查看的Mysql的源码及文档,以上是Mysql大致的结构图,我们剖析mysql的目的是从中我们去借鉴他数据处理的一些方法,对于sql虚拟机我们前面已经解析过SQLite构建SQL虚拟机的做法,在我们查看Mysql内部机制,的时候,我们发现Mysql的做法跟SQLite是一样的只不过将Lemen代码生成器换成yacc.那我们的工作就放到存储引擎中,重点去了解, 1,Mysql中的并发...
阅读全文
posted @ 2009-07-07 15:06 konyel 阅读(1677) 评论(0)
编辑
摘要: 从官方文档中翻译出Oracle Times Ten的强大功能Times Ten体系结构 并发管理: 支持多线程访问。 支持不同的事务隔离级别:Read committed Serializable 支持不同级别的锁控制:库级,表级,行级 支持拴:用于保护内部数据结构 自动死锁检测和解除 完整的事务控制机制,包括commit/rollback 数据一致性:数据库总是保持数据一致状态,并且在掉电等情况...
阅读全文
posted @ 2009-07-02 11:03 konyel 阅读(866) 评论(0)
编辑