当前位置: 首页 > 操作系统&&数据库, 数据库 > 正文

C++自制Redis数据库 (一)

前言

最近在学C++,想写个什么小项目来练练手,一般就是造轮子嘛,所以我也是准备使用C++来写一个Redis 非关系型数据库。这就开始准备了,但是这毕将是一个逐渐庞大的工程,所以我想要一步一步的开展。这次主要是分三个阶段,最终的代码和文档都会在github上。但是文档的部分,博客也会有,这就是。

三个部分:

是什么

为什么

怎么做

非关系型数据库的应用

1. BerkeleyDB是一种极为流行的开源嵌入式数据库,在更多情况下可用于存储引擎,比如BerkeleyDB在被Oracle收购之前曾作为 MySQL的存储引擎,由此可以预见,该产品拥有极好的并发伸缩性,支持事务及嵌套事务,海量数据存储等重要特征,在用于存储实时数据方面具有极高的可用价值。然而需要指出的是,该产品的Licence为GPL,这就意味着它并不是在所有情况下都是免费使用的。

2. 对MongoDB的定义为Oriented-Document数据库服务器,和BerkeleyDB不同的是该数据库可以像其他关系型数据库服务器那样独立的运行并提供相关的数据服务。从该产品的官方文档中我们可以获悉,MongoDB主要适用于高并发的论坛或博客网站,这些网站具有的主要特征是并发访问量高、多读少写、数据量大、逻辑关系简单,以及文档数据作为主要数据源等。和BerkeleyDB一样,该产品的License同为GPL。

3. Redis,典型的NoSQL数据库服务器,和BerkeleyDB相比,它可以作为服务程序独立运行于自己的服务器主机。在很多时候,人们只是将 Redis视为Key/Value数据库服务器,然而事实并非如此,在目前的版本中,Redis除了Key/Value之外还支持List、Hash、 Set和Ordered Set等数据结构,因此它的用途也更为宽泛。对于此种误解,Redis官网也进行了相应的澄清。和以上两种产品不同的是,Redis的License是 Apache License,就目前而言,它是完全免费。

4. memcached,数据缓存服务器。为什么在这里要给出该产品的解释呢?很简单,因为笔者认为它在使用方式上和Redis最为相似。毕竟这是一篇关于 Redis的技术系列博客,有鉴于此,我们将简要的对比一下这两个产品。首先说一下它们之间的最大区别,memcached只是提供了数据缓存服务,一旦服务器宕机,之前在内存中缓存的数据也将全部消失,因此可以看出memcached没有提供任何形式的数据持久化功能,而Redis则提供了这样的功能。再有就是Redis提供了更为丰富的数据存储结构,如Hash和Set。至于它们的相同点,主要有两个,一是完全免费,再有就是它们的提供的命令形式极为接近。
Redis 是什么

Redis 是 Remote Dictionary Server 的缩写,主要就是一个key-value 存储系统。它提供了很多丰富的数据结构,包括string,Lists,Hashes,Setes 和 Orderd Sets 以及 Hashes.

Redis 可以代替Memcached,并且解决了断电后数据完全丢失的问题。
Redis 的优点

1.性能很高,支持每秒10万次的读写频率
2.丰富的数据类型及对应操作
3.支持事务操作
4.丰富的特性
官方测试数据

50个并发,请求10W次,读写大小为256B字符串,Linux 2.6 Xeon X3320 本机接口执行

写的次数11W次每秒 读的速度8.1W次每秒
常用数据结构

redis 内部是用一个核心对象表示所有的基本对象

数据类型
编码方式
数据指针
虚拟内存
其他信息等

根据数据类型的不同,其他的属性也会不同,如果我们设计一个基类,然后其它的类去继承基类,也是一个不错的方法。

仅仅对与它的几种主要的数据类型它有如下实现:

1.String

实现方式是一个字符串,普通的key/value 实现
2.Hash
实现方式就是HashMap 这里分两种情况,当这个Hash 的成员比较少的时候,就采取数组的形式存储起来,当成员数据量增大的时候就会自动转换成真正的HashMap.
3.List

它实现的方式是一个双向链表,及表示支持反向查找和遍历,更方便的操作,但是带来了额外的内存开销,其内部的发送缓冲队列也都是使用这个数据结构。
4.Set

集合功能,其实Set 的实现识一个HashMap.类似与位图。
5.Sorted set

内部使用的是HashMap 和 跳跃表来保证数据的存储和有序。
6.内存优化
Redis 为不同的数据结构分别提供了一组参数来控制内存的使用。
在redis.conf 配置文件中下面两项
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
当value 内部有64个以下的成员的时候使用线性存储,当超过就自动转换成Hashmap.

7.Redis 数据过期设置
redis 可以按照Key 设置过期时间,过期后将被自动删除。
8.数据快照
数据快照是将真各个Redis 内存中所有数据遍历一遍存到一个扩展名为rdb的数据文件。快照可以手动的设置每次发生时间。
9.AOF
数据快照的缺点是持久化之后如果出现crash 则会丢失一段数据,因此作者增加了另外的一种追加的操作日志记录,叫append only file ,其日志文件为.aof 这个配置如果不开启,可能在断电的一段时间内导致数据丢失,所以一般设置是每秒同步一次。

10.数据恢复
当服务器挂掉后,数据库会按照以下优先级恢复数据
1.如果只配置了AOF,重启加载AOF文件恢复
2.如果同时配置了RDB和AOF,启动时只加载AOF文件恢复数据
3.如果只配置了RDB,启动时将加载dump文件恢复数据
11.主从复制
在配置文件中写入IP 和 端口,就可以将数据拷贝走,比如读写分离,数据备份,灾难恢复。
当有多个客户端请求文件的时候,只有一个后台进程会准备镜像然后发送给所有的请求者。主从复制在这个过程中不会被阻塞。

 

 

本文固定链接: http://zmrlinux.com/2016/02/02/c%e8%87%aa%e5%88%b6redis%e6%95%b0%e6%8d%ae%e5%ba%93-%ef%bc%88%e4%b8%80%ef%bc%89/ | Kernel & Me

该日志由 root 于2016年02月02日发表在 操作系统&&数据库, 数据库 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: C++自制Redis数据库 (一) | Kernel & Me
【上一篇】
【下一篇】