储存系统,顾名思义,自然是一个提供数据存储、查询的系统。
那么,一个储存系统,具体要做哪些事儿呢?在我看来主要是如下六个方面
* 数据格式
* 数据结构
* 单点or分布式
* 高可用
* 数据一致性
* 查询优化
数据格式
所谓数据格式,便是对数据存储格式的定义。比如mysql等关系数据库,便是通过表这种格式来表达数据。比如
MongoDB,以文档格式来表达数据。比如Redis,以key,values来表达数据。不同的格式,也导致了储存系统各自的
特性。
试想一下,关系型数据库,定义一个字符串字段,为何要在创建时限制字段长度?
要解释这个问题,不妨假设下,如果字符串字段不需要限制长度。假如有一个市民表,储存市民信息。现在想要
储存市民房屋信息,应该怎么办呢?
如果可以不限制长度,很多人为了偷懒,就会直接在市民表加一个字段,但由于一个人可以由多个房子,那么就可以用
JSON格式来保存市民的房屋数据。
这样并非不可,但是与关系型数据库的风格不符。最好的方案,便是再创建一个房屋表,其中一个字段,储存市民ID(假设
一个房子只会属于一个市民)。这,便是典型的关系型数据库。
这种设计,有利有弊,关系型数据库由于在表达复杂的事务关系时,需要多张表,就使得连表变得很频繁,带来的直接后果
,便是查询性能的低下。正因为如此,基于文档格式的MongoDB,才有了自己的一席之地。
数据结构
数据结构,即数据如何储存。比如mysql,是以B+树的数据结构储存在文件中。Redis,则是以跳表、Hash等数据结构储存在
内存中。MongoDB,是以B树储存在文件之中。
mysql选择B+树,主要是为了降低树高,减少硬盘IO次数;同时,提升范围查询的效率。
MongoDB选择B树,主要为了提升热点数据的查询效率(由于非叶子节点也保存数据,性能高于B+树),但是整体树高是高于
B+树的,且范围查询性能低。
Redis,数据储存在内存之中,对树高不敏感。所以,选择了跳表这种数据结构。
单点or分布式
严格讲,mysql这类数据库,是单点数据库。只不过为了保证高可用,设计了主备结构;为了降低主库压力,由设计了主从结构。
Redis,则是分布式数据库,需要做数据分区,且有主从数据备份的设计。再比如Zookeeper,也是分布式数据库。
高可用
mysql,通过主备来保证高可用。Redis,通过从库来保证高可用。
数据一致性
mysql的Innodb,通过两阶段提交保证Binlog和Redolog的一致性。
查询优化
mysql提供了索引特性。
标签:储存,需要,哪些,存储系统,Redis,mysql,数据结构,数据,数据库 From: https://www.cnblogs.com/kingcode/p/18223478