一、MySQL关系型数据库

mysql主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。

mysql用于持久化的存储数据到硬盘,功能强大,速度较慢,基于磁盘,读写速度没有Redis快,但是不受空间容量限制,性价比高

mysql和redis因为需求的不同,一般都是配合使用。
需要高性能的地方使用Redis,不需要高性能的地方使用MySQL。存储数据在MySQL和Redis之间做同步

缺点海量数据处理的时候效率会显著变慢

二:Redis非关系型数据库

redis是将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限。

redis用于存储使用较为频繁的数据到缓存中,读取速度快,基于内存,读写速度快,也可做持久化,但是内存空间有限,当数据量超过内存空间时,需扩充内存,但内存价格贵

由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。

redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),另外一种是AOF(append only file)持久化(原理是将Reids的操作日志追加的方式写入文件)。
 

三、mangoDB非关系型数据库

数据是存储在硬盘的,只不过需要经常读取的数据会被加载到内存中,将数据存储在物理内存中,从而达到高速读写。

    存储方式虚拟内存+持久化。
    查询语句:是独特的MongoDB的查询方式。
    适合场景:事件的记录,内容管理或者博客平台等等。
    架构特点:可以通过副本集,以及分片来实现高可用

优点:
    1、在适量级的内存的MongoDB的性能是非常迅速的,它将热数据存储物理内存中,使得热数据的读写变得十分快。
    2、MongoDB的高可用集群架构拥有十分高的扩展性
    3、在副本集中,当主库遇到问题,无法继续提供服务的时候,副本集将选举一个新的主库继续提供服务。
    4、MongoDB的BsonJSon格式的数据十分适合文档格式的存储与查询

缺点:
    1、 不支持事务操作。MongoDB本身没有自带事务机制,若需要在MongoDB中实现事务机制,需通过一个额外的表,从逻辑上自行实现事务。
    2、 应用经验少,由于NoSQL兴起时间短,应用经验相比关系型数据库较少。
    3、MongoDB占用空间过大

四、PostgreSQL关系型数据库管理系统

MySQL存储引擎PostgreSQL存储引擎,包括InnoDB、MyISAM等。

PostgreSQL稳定性非常强,InnoDB即使是在断电这种场景下,PostgreSQL也是相当稳定的。

PostgreSQL多进程MySQL是多线程。PostgreSQL支持大多数命令类型上触发的触发器。MySQL异步复制PostgreSQL支持同步异步半同步复制

优点:

      在SQL的标准实现上要比MySQL完善,而且功能实现比较严谨;
      存储过程的功能支持要比MySQL好,具备本地缓存执行计划的能力;
      对表连接支持较完整,优化器的功能较完整,支持的索引类型很多复杂查询能力较强
      PG主表采用堆表存放,MySQL采用索引组织表,能够支持比MySQL更大的数据量。
      PG主备复制属于物理复制,相对于MySQL基于binlog的逻辑复制,数据的一致性更加可靠,复制性能更高,对主机性能的影响也更小。
      MySQL的存储引擎插件化机制,存在锁机制复杂影响并发的问题,而PG不存在。

五、ETCD:

etcd是由CoreOS开源,采用Go语言编写分布式高可用Key/Value存储系统,主要用于服务发现配置共享

etcd提供mini-transaction的功能。etcd的数据存储在B+树中。

ETCD经典的应用场景有:

1、Key/Value存储:etcd支持HTTP RESTful API,提供强一致性(raft 一致性算法)、高可用的数据存储能力。

2、服务注册与发现:通过在ETCD中注册某个服务的目录,服务实例连接Etcd并在目录下发布对应的IP和port,以供调用方使用,可以有效地实现服务注册与发现功能。

3、消息发布与订阅:通过ETCD的Watcher机制,可以使订阅者订阅他们关心的目录。当消息发布者修改被监控的目录内容时,可以将变化实时通知给订阅者。

4、负载均衡分布式锁

5、分布式队列

6、集群监控与Leader竞选

ETCD优点:

  1. 简单。使用Go语言编写部署简单;使用HTTP作为接口使用简单;使用Raft算法保证强一致性让用户易于理解。
  2. 数据持久化。etcd默认数据一更新就进行持久化。
  3. 安全。etcd支持SSL客户端安全认证

etcd提供的APIs:

1、Put(key, value)/Delete(key)      插入、删除键值对

2、Get(key)、/Get(keyForm,keyEnd)    获取键值对

3、Watch(key/keyPrefix)  //监控键值对

4、Transactions事务

六:LevelDB

LevelDB是Google传奇工程师Jeff DeanSanjay Ghemawat开源的KV存储引擎

LevelDB的数据是存储在磁盘的,采用LSM-Tree的结构实现。LSM-Tree将磁盘的随机写转化为顺序写,从而大大提高了写速度。

内存数据的Memtable,分层数据存储的SST文件,版本控制的Manifest、Current文件,以及写Memtable前的WALWrite-Ahead Logging预写日志系统)。

    Memtable:
  对应Leveldb中的内存数据,LevelDB的写入操作会直接将数据写入到Memtable后返回。读取操作又会首先尝试从Memtable中进行查询,允许写入和读取。当Memtable写入的数据占用内存到达指定数量,则自动转换为Immutable Memtable,等待Dump到磁盘中,系统会自动生成新的Memtable供写操作写入新数据。

    WAL: Write-Ahead Logging预写日志系统
        数据库中一种高效的日志算法,对于非内存数据库而言,磁盘I/O操作是数据库效率的一大瓶颈。在相同的数据量下,采用WAL日志的数据库系统在事务提交时,磁盘写操作只有传统的回滚日志的一半左右,大大提高了数据库磁盘I/O操作的效率,从而提高了数据库的性能。

LevelDb 的特点:
首先,LevelDb是一个持久化存储的KV系统,和Redis这种内存型的KV系统不同,LevelDb不会像Redis一样狂吃内存,而是将大部分数据存储到磁盘上。

其次,LevelDb在存储数据时,是根据记录的key值有序存储的,就是说相邻的key值在存储文件中是依次顺序存储的,而应用可以自定义key大小比较函数,LevelDb会按照用户定义的比较函数依序存储这些记录。

再次,像大多数KV系统一样,LevelDb的操作接口很简单,基本操作包括写记录,读记录以及删除记录。也支持针对多条操作的原子批量操作。

另外,LevelDb支持数据快照(snapshot)功能,使得读取操作不受写操作影响,可以在读操作过程中始终看到一致的数据。

除此外,LevelDb还支持数据压缩等操作,这对于减小存储空间以及增快IO效率都有直接的帮助。
 

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐