青训营实践作业,golang实现简单kv存储系统|青训营

154 阅读2分钟

如果辅以Real-Time Search Engine(实时搜索引擎)进行复杂条件检索、全文检索),就可以替代并发性能较低的MySQL等关系型数据库,达到高并发、高性能,节省几十倍服务器数 量的目的。以MemcacheDB、Tokyo Tyrant为代表的key-value分布式存储,在上万并发连接下,轻松地完成高速查询。而MySQL,在几百个并发连接下,就基本上崩溃了。

key value 根据关键字取值

key是关键字

value是值

主要特点

具有极高的并发读写性能

Key-value数据库是一种以键值对存储数据的一种数据库,类似Java中的map。可以将整个数据库理解为一个大的map,每个键都会对应一个唯一的值

下面我们用golang来实现一个简单的key-value存储系统,因为个人精力和能力有限,所以很抱歉这个系统并未开发完善

Kv存储系统应该用键去寻找到特定的值

每个值都可以通过特定的键去访问

我们可以通过键来对数据进行增删改查

先要定义一个结构体用于存放键值对

type kv struct {
num   int
key   string
value string
next  *kv
}

这个结构体用num来作为键,用value作为值,key也能当成键使用

键值对系统通常支持一些增删改查的操作

我们先写一个方法来新建一个键值对数组

`func CreateNewChain(a *kv, key string, value string) *kv {
//a = new(kv)
a.num = 0
a.key = key
a.value = value
a.next = new(kv)
a.next.num = 1
a.next.key = "tail"
a.next.value = "tail"
a.next.next = nil

   return a
}`

这个键值对数组定义了一个键值对链表的头指针和尾指针,尾指针采用了特定的key字段为“tail”,当出现这个key时说明这是整个键值对链表的最后一个元素,这个尾指针并没有实际意义,仅仅用于表示链表的结束

我们在采用这个方法时需要写一下以下语句var a *kv     a = new(kv)

这两个语句为头指针分配地址,为值的地址分配空间

然后还有新键元素的方法,因为我们已经定义了尾指针所以只要把尾指针给换成新的元素

并且在这个元素的next上再接上一个尾指针就行了

 

func AddNewPoint(head *kv, value string) *kv {    var i *kv    i = head    i = new(kv)    i.next = new(kv)    i.next.next = new(kv)    for ; i.next.key == "tail"; i = i.next {    }    i.next.num = i.num + 1    i.next.next.num = i.num + 2    i.next.key = head.key    i.next.value = value    i.next.next.key = "tail"    return i.next }

我们还想要打印结点,但是普通的打印会把next的地址一并打印出来,我们不想这样,所以可以再写一个方法,输入节点然后返回节点中我们想要打印的东西,然后用fmt.println方法就可以打印我们想要的信息了
`func printlnkv(a *kv) (int, string, string) {
return a.num, a.key, a.value
}

`

这个方法相当于java里面的构造方法get()