如果辅以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()