C++ 自制Redis 数据库(十一)哈希类与数据库类

来源:互联网 发布:淘宝优惠券怎么使用 编辑:程序博客网 时间:2024/06/10 12:00

总结下这一周的东西,开始写的时候真心头大,C++这语言确实不容易被驯服,我承认我现在还无法完全掌控它,曾一度我怀疑我的C++ 是体育老师教的,无奈阿。只好硬着头皮写,有问题就查,实在头大了就问学长。

现在数据结构类的东西基本稳定,下来就是逐渐补充。这里贴上几个类就好啦,我还要不断的补充东西,数据库存储引擎总算有个demo 了,

Redis 哈希表的类设计(部分主体),这里只说类,函数体没有写上来

/Hash_Map_Redis.h 中有键值对类

键值对类为最基本的类:
template <typename T>

class Key_Val{

private:
std::string Key_string; /*每一个键都是一个在字符串类型,存在*/
unsigned int Key ; /*键的id*/
std::shared_ptr<T> val; /*一个智能指针,通用的值*/
public:
Key_Val(){}
Key_Val(const std::string & str,unsigned int key,T data); /*构造函数,根据key 的字符串,哈希值,具体类型的值构成*/
~Key_Val(){};
bool Key_Val_Show();
T & Key_Val_getval();
unsigned int & Key_Val_getkey();
};
接着是哈希表的主体数据结构类
/Hash_Map_Rredis.h
template <typename T>

class Hash_Map_V{
private:
std::string name; /*哈希表的名字*/
std::list<std::shared_ptr<Key_Val<T> > > data[4]; /*用来散列的四条链表,相当于索引*/
std::list<std::shared_ptr<Key_Val<T> > > data_rehash[4]; /*rehash 时的数据结构*/
int key_count; /*统计键的个数*/
int len;
int mask; /*窗口值,索引值*/
public:
Hash_Map_V(){}
Hash_Map_V(const std::string & hash_name):name(hash_name){} /*构造函数开始只需要知道这个哈希表的名字*/
bool Hash_Map_V_add(const char * elem,T da); /*添加键值对的函数,@键字符串@预订义类型的值*/
unsigned int GetKey_int(unsigned int key); /*根据键的值返回哈希值*/
unsigned int GetKey_char(const void *);
Key_Val<T> & Find(const void *); /*查找函数*/
int & Get_hash_mask(int m){mask = m;} /*返回窗口值*/
bool Get_hash_show(); /*一个测试函数*/
};

 

整数集合:

这个整数集合我仅仅简单的做了设计
template <typename T>

class Set_Int{
private:
unsigned int N; /*整数的个数*/
std::vector<T> data; /*这里使用了vector ,也是出与简化*/
unsigned int Typename;
unsigned int count;
public:
Set_Int(){}
Set_Int(unsigned int n,unsigned int Type,T *da); /*初始化需要提供整数集的元素个数,整型类型,数据元素组*/
bool Set_Int_set(T *da);
T & Set_Int_back(unsigned int index);
bool Set_Int_up(T update,unsigned int index);
bool Set_Int_bzero(unsigned int index);
bool Set_Int_exit(T obj);
bool Set_Int_sort();
unsigned int Set_Int_mm();
unsigned int Set_Int_balance();
bool Set_Int_show();
};
基本数据结构已经明晰了,我们开始构建数据库的结构,但是我们在构建数据库的结构之前我们必须想到命令如何实现,怎么实现从哪里实现,所以我们先开始做命令分析,与类型确定。
我决定使用整数来表示具体类型,具体看头文件/DSAA.h
#define INT32_R                            1
#define STRING_R                     (1 << 1)
#define LONG_R                         (1 << 2)
#define SHORT_ R                       (1 << 3)
#define DOUBLE_R                       (1 << 4)
#define LIST_R                                      (1 << 6)
#define INT_SET_R                               (1 << 7)
#define HASH_MAP_R                        ( 1 << 8)
#define HASH_MAP_RV                        (1 << 9)
像这样,还支持组合的方式

数据库大体结构

class Key_Val_Node{

private:
void * data;
int type ;
unsigned int hash;
std::string Key;
unsigned int create_time;
unsigned int cut_time;
int Server_ID ;
int data_type ;

public:
Key_Val_Node * next;
Key_Val_Node * prev;
Key_Val_Node(){}
Key_Val_Node(unsigned int Hash,std::string key_name,void * obj,int type_data,int elem);
~Key_Val_Node(){delete (char*)data;}
bool add_elem(void *obj,int type_data,unsigned int index,const char *key_name);
bool del_elem(void *obj,int type_data,unsigned int index,const char * key_name);
bool set_elem(void *obj,int type_data,unsigned int index,const char * key_name);
bool find_elem(void *obj,int type_data,unsigned int index,const char * key_name,void *getbuff);
bool find_type(int type_obj);

};
class Data_Table{

private:
mutable std::mutex mutex_;
Key_Val_Node *head;
Key_Val_Node *tail;
int keys_count;
public:
Data_Table();
bool Data_Table_Init();
bool Data_Table_add();
bool Data_Table_del();
bool Data_Table_find();
bool Data_Table_set();
int Data_Table_count();
};

class Data_Base{

private:
Data_Table[16]; /*这是一个数据库的实例,具有16张表*/
int mask;
int key_count;
public:
Data_Base();
bool Data_Base_add();
bool Data_base_del();
bool Data_base_find();
bool Data_base_set();
unsigned int Data_base_getkey();

};

 

查看原文:http://zmrlinux.com/2016/02/18/c-%e8%87%aa%e5%88%b6redis-%e6%95%b0%e6%8d%ae%e5%ba%93%ef%bc%88%e5%8d%81%e4%b8%80%ef%bc%89%e5%93%88%e5%b8%8c%e7%b1%bb%e4%b8%8e%e6%95%b0%e6%8d%ae%e5%ba%93%e7%b1%bb/

0 0
原创粉丝点击