存储系统
存储系统:一个提供了读写,控制类接口,能有效安全地将数据持久化的软件,就可以叫做存储系统(非官方定义)
user--存储数据--。。。。(network非单机的需要)
特点:需要高性能,受硬件影响极大,IO类的代码需简洁(确保高性能,延迟低),
- 需要高性能
- 受硬件影响极大
- IO类的代码需简洁(确保高性能,延迟低)
- 非io类的代码要复杂(确保没什么漏洞,对可能出现的异常情况进行错误处理)
缓存 很重要
拷贝 CPU花销大,慎用
需要抽象统一的接入层以对应各种硬件设备
RAID技术
目的:高性能,高可靠性(备份),便宜
RAID 0:多块小容量磁盘的简单组合,没有容错处理
RAID 1:一块磁盘对应一块备份数据的镜像磁盘,真实空间利用率为50%
RAID 0+1 :同时具备上面两个的特点,但是需要2倍于0或1的磁盘
数据库
分为关系型数据库和非关系型数据库
都为存储系统,但具有更加强大的功能
关系:集合,任意元素组成的若干有序偶对,体现事物间的关系
关系代数:对关系作运算的抽象查询语言
SQL:一种领域特定语言,关系代数表达形式
关系型数据库
结构化数据友好,表的形式管理,更加清晰明了
支持事务(ACID):
- A:原子性,指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
例:银行转钱事务:两个用户A和B
A转账给B:A少钱,B多钱同时成功或同时失败
- C:一致性,事务前后数据的完整性必须保持一致,符号逻辑运算
A转账200给B,那么A就-200,B就+200,而不是+300,总数不变
- I:隔离性,是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
要设置隔离级别
读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)
- 读未提交,也就是会读取其他事务还未提交的数据,也就是脏读
- 读已提交,也就是只读取其他事务已经提交的数据。但是会出现的问题是不可重复读,也就是在一个事务里,读取数据1,原来数据1=a,但是另一个事务同时修改了数据1,改成了b,那么第一个事务再读取一下这个数据1,这个数据1就=b
- 可重复读,也就是在一个事务里,不管读这个数据几次,无论这个数据是否被其他事务修改,读取都是返回一样的值,但是会出现的问题是幻读,幻读则是数据行数可能会变更,例如我读取字段1=a的值,一开始读到两行数据,如果这个时候另一个事务插入了一行,那么可能再次读取时就会读到3行数据
- 可串行化,也就是可以看作这些事务是串行执行的,不会出现上面的任何问题,当然性能也是最差的
- D:持久性,一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
支持复杂查询语言如SQL
非关系型数据库
不严格的结构化,半结构化