后台系统可扩展性学习笔记(十二)NoSQL

文章目录

  • NoSQL定义
  • NoSQL种类
    • 键值存储
    • 文档存储
    • 宽列存储
    • 图形数据库
  • NoSQL 意味着什么
    • ACID vs. BASE
  • SQL or NoSQL

NoSQL定义

不同于关系型数据库,NoSQL 数据库(也叫非 SQL 或非关系型数据库)提供的数据存储、检索机制并不是基于表关系建模的。没有了数据表,自然就没有了多表连查(join操作)的性能顾虑,范式约束和反范式化的抉择也就不复存在了。
对于 NOSQL,另一种有趣的理解是 Not Only SQL,在关系型数据库之外的广阔世界里,数据不一定非要打平存放到二维表格里,关系也不是只能用主键、外键、关系表来描述。

NoSQL种类

不同于关系型数据库中的表结构,NoSQL 数据库支持一些更灵活的数据结构,使得某些操作更快。

键值存储

键值存储(Key-value store)是最简单的 NoSQL 数据模型,只能存键值对儿,只能按 key 查询,因为所存储的值对数据库系统不透明(类似于 BLOB),无法根据值的特征查找或建立索引。
有些键值数据库能够对 key 进行排序,从而支持范围查询(检索 key 在特定区间内的数据),比如找出工号大于 100000 的新人信息。
数据模型上是个哈希表,因此能够达到O(1)的读写性能,适用于简单、或者频繁更改的数据,经常用作内存缓存,例如MemcachedRedis

文档存储

文档存储(Document store)以文档(XML、JSON 等半结构化数据)为中心建模,相当于增强版的键值存储,面向文档提供更精细的数据操作。与键值存储最大的区别在于数据库能够理解并处理所存储的值(即文档),根据值的特征(即文档的内部结构)查询和建立索引。此外,文档还支持嵌套,甚至MongoDBCouchDB等文档数据库还提供了类 SQL 的查询语言,以支持复杂查询。适用于持久化存储,用来存放不经常更改的数据,作为关系型数据库的一般替代方案。

宽列存储

宽列存储(Wide column store)中,列(column)是最小的数据单元,每一列是个名值对儿(以及用于版本控制和冲突解决的时间戳),在列之上还有一级超级列(super column):
在这里插入图片描述
仅含列的行称为列族(column family),含有超级列的行称为超级列族(super column family),每一行(即,一个列族或超级列族)代表一个实体,包含该实体的所有相关信息:
在这里插入图片描述
数据模型上是个二维 Map,特点是高性能以及良好的扩展性,因此适用于非常大的数据集,被 Twitter、Facebook 等社交网络用来存储海量用户所产生的数据。

图形数据库

数据基于图来建模,图中每个节点代表一条记录,每条边表示节点之间的关系,因此能够轻松描述数据对象之间的复杂关系,比如关系模型中复杂的外键和多对多关系

图形数据库的实际应用还不十分成熟,甚至还没有一种被广泛采用的标准化查询语言,但其连接性优势尤其适用于具有复杂关系的数据模型(比如社交网络),值得期待。

NoSQL 意味着什么

采用简单的 NoSQL 模型(如键值存储),相当于把一部分工作从数据库层转移到了应用层。与数据库层相比,应用层通常更容易(横向)扩展,因此这种工作量转移有助于提升系统的可扩展性,将复杂的数据操作抛给应用层来处理,以求更大的优化空间。
甚至事务等强一致性保证也要由应用层来处理,因为多数 NoSQL 数据库并不提供事务支持。

ACID vs. BASE

关于这两者的定义解释可以看看我以前的文章:
BASE理论(基本可用策略+ 最终一致性实现) 和 什么是ACID理论(二阶段、三阶段提交、TCC)
不同于关系型数据库中追求的ACID(事务的 4 大特性):

  • Atomicity(原子性):一系列操作要么全部成功要么失败全部回滚
  • Consistency(一致性):事务执行前后数据库都必须处于一致性状态(满足既定的所有一致性约束)
  • Isolation(隔离性):并发事务操作的结果状态与按顺序执行一样
  • Durability(持久性):事务一旦提交,对数据的改变就是永久性的,遭遇故障也不会丢失已提交的结果

NoSQL 在CAP 的抉择中对 C 做了妥协,允许最终一致性,即BASE:

  • Basically Available(基本可用):读写操作尽可能保证可用,但不保证任何一致性
  • Soft state(软状态):由于没有一致性保证,在一段时间后,只是有可能读到最新状态,因为可能还没收敛
  • Eventual consistency(最终一致性):如果系统运行正常,等待足够长的时间后,最终能够读到最新状态

也就是说,在分布式环境下,(大多数)NoSQL 数据库仅保证最终一致性,可能无法立即读到最新的数据。

SQL or NoSQL

相比之下,SQL 数据库(关系型数据库)的优势在于:

  • 支持事务操作
  • 有明确的扩展模式
  • 开发人员、社区、工具等相对成熟

主要缺陷是:

  • 复杂的连表查询导致数据读取性能不佳
  • 不太容易扩展(手动分片)
  • 关系模型与 OOP 之间存在较大差异(Object-relational impedance mismatch)
  • 只支持存取结构化数据,关系模式(如表结构)必须预先定义,并且修改成本高

而 NoSQL 数据库(非关系型数据库)的优势集中在:

  • 不存在复杂的连表查询
  • 容易扩展(一些 NoSQL 数据库支持自动分片)
  • 与 OOP 数据模型一致,易于使用
  • 不必预先定义数据模式,支持存取快速变化的结构化、半结构化和非结构化数据
  • 读写性能(IOPS)很高,适合数据密集型工作

主要缺陷在于:

  • 缺少强一致性保证
  • 开发人员、社区、工具等没那么成熟

因此,NoSQL 数据库适用于:

  • 快速变化数据,如点击流(click stream)数据或日志数据
  • 排行榜或评分数据
  • 临时数据,如购物车数据
  • 频繁访问的热点数据
  • 元数据(metadata),以及查找表(lookup tables)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android2.2应用开发之IccCard(sim卡或USIM卡)

tyle"margin:20px 0px 0px; font-size:14px; line-height:26px; font-family:Arial; color:rgb(51,51,51)"> 如果要做android通讯录的联系人的机卡混排显示,由于手机卡类型的不同,导致手机卡存储容量以及可以存储信息不同,就要涉…

后台系统可扩展性学习笔记(十三)缓存

文章目录在哪儿加缓存缓存什么内容缓存原始查库结果缓存数据对象怎么查询缓存结果预留缓存模式直读模式直写模式回写式缓存绕写式缓存提前刷新模式缓存满了如何处理参考读写分离、分库分表、反范式化、采用 NoSQL……如果这些扩展手段全都上了,数据响应依旧越来越慢…

[linux]gdb调试

使用gdb可以在命令行方便地调试,并且能以命令程序的方式调试源代码。 常用命令简写print-p,step-s,next-n 进入gdb //方式一 gdb test//test 为可执行文件,使用-g编译得到 //方式二 gdb -q //不显示版权信息 file test //file命令打开文件 退出gdb quit …

后台系统可扩展性学习笔记(十四)异步机制与MQ

对于 Web 服务而言,提升可扩展性的主要途径是将耗时的同步工作改成异步处理,从而允许将这些工作“外包”给多个 Worker 去做,或者提前完成能够预知的部分。 异步机制与可扩展性之间的关系需要从(异步)并行处理的优势说…

RegisterClientScriptBlock与 RegisterStartupScript区别

Page.ClientScript.RegisterClientScriptBlock而用Page.ClientScript.RegisterStartupScript是因为:RegisterStartupScript 把script放置在ASP.NET page的底部,而RegisterClientScriptBlock把script放置在ASP.NET page的顶部,用RegisterClien…

【Web后端笔记】SQL Server与java数据类型对应

编号数据库类型JDBC类型JDBC索引描述1intjava.lang.Integer4 2varcharjava.lang.String12 3charjava.lang.String1 4ncharjava.lang.String1 5nvarcharjava.lang.String12 6textjava.lang.String-1 7ntextjava.lang.String-1 8tinyintjava.lang.Integer-6 9intjava.lang.Intege…

后台系统可扩展性学习笔记

整理了一下笔记目录,将以前学习的一些知识串联起来了,比如cdn、负载均衡、中间件,以前只是各自了解了一点,现在大概理清了后台系统设计中他们各自的作用。 后台系统可扩展性学习笔记(一)概要 后台系统可扩展…

TFS 强制删除锁定文件(数据库)

TFS:TFS2010 VS:VS2012 OS:Windows2008 DB:Sqlserver2008 R2 我们在团队开发当中,版本控制是一个不可忽略的工具。我们团队使用的是TFS2010这个版本控制器。 但在团队实际协作开发当中,团队成员难免有电脑损坏或人员离职情况&…

【转】Java:String、StringBuffer和StringBuilder的区别

1 String String:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。 String类的包含如下定义: [java]view plaincopy /** The value is used for character storage. */ private final char value[]…

Linux中exit与_exit的区别

在exit,_exit的区别 - exit()与_exit()函数的区别(Linux系统中)2012-03-20 15:19:53 分类: LINUX 注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出&…

光标闪烁问题的解决办法

在调用Windows API函数SetCursor设置光标时,可能会碰到闪烁的问题:移动鼠标,光标在Class Cursor(即注册窗口类时指定的Cursor)与预设Cursor之间闪烁。 在MSDN上有关SetCursor函数的备注中强调,如果Class Cursor非空,那…

视频编解码基础

文章目录前戏编解码技术流程主流视频编码标准视频传输面临的问题视频传输差错控制视频传输Qos质量保证参数人类视觉系统HVS 以及相应编码措施正餐编码层次与码流结构PB帧编码IBBP序列编码结构图像编码结构条带编码结构宏块编码结构块编码结构预测技术码率控制实例H264前戏 编解…

XShell 屏幕锁定的恢复方法(Ctrl+Q)

操作XShell过程中很多时间大家会习惯性的按CtrlS进行保存. CtrlS在XShell的作用是屏幕锁定,很多朋友会无法操作,会直接把窗口关闭。 解决方法: 快捷键 CtrlQ 即能完成解锁!转载于:https://www.cnblogs.com/liangle/p/3173475.html

adb端口被占用

程序不能执行,kill掉任务管理器里面adb服务,重新连接设备仍然有错 查到可能是adb端口被占用 查看adb用的是哪个端口:C:\Users\wanglin>adb nodaemon server 查看谁占用了这个端口:C:\Users\wanglin>netstat -ano | findstr …

实时语音通讯丢包补偿技术

文章目录基于发送端丢包补偿技术原理与媒体无关的前向差错纠正媒体相关前向差错纠正交织技术基于接受端丢包补偿技术基于插入方法基于插值方法基于重构的方法应用建议非交互式交互式拓展阅读参考丢包补偿技术可以分为两类:基于发送端补偿、基于接受端补偿 基于发送…

取得裝置可以顯示頁面的寬度

利用html中的div元素取得<div id"divGetWidth" width100%></div>Jquery:var width$(#divGetWidth).width(); //获取元素宽度 Javascript:var objdocument.getElementById(divGetWidth);var width obj.offsetWidth转载于:https://www.cnblogs.…

Xcode添加静态库以及编译选项配置常见问题

本文转载至 http://www.cnblogs.com/Quains/archive/2013/08/22/3276425.html 一,Xcode编译出现Link错误,出现"duplicate symbols for architecture i386 clang"提示.问题:链接时,项目有重名文件.解决:根据错误提示,做如下检查:1.Taraget->Build Settings->Li…

关于并发概念的一些笔记

目录1、基于锁的并发数据结构1、并发计数器2、懒惰计数器3、并发链表4、并发队列5、并发散列表总结2、条件变量使用&#xff08;POSIX&#xff09;生产者/消费者 &#xff08;有界缓冲区问题&#xff09;覆盖条件扩展3、信号量使用二值信号量&#xff08;锁&#xff09;0值信号…

MYSQL常见出错代码 mysql error number

1016错误&#xff1a;文件无法打开&#xff0c;使用后台修复或者使用phpmyadmin进行修复。1044错误&#xff1a;数据库用户权限不足&#xff0c;请联系空间商解决1045错误&#xff1a;数据库服务器/数据库用户名/数据库名/数据库密码错误&#xff0c;请联系空间商检查帐户。105…

建立apk定时自动打包系统第三篇——代码自动更新、APP自动打包系统

我们的思路是每天下班后团队各成员在指定的时间&#xff08;例如下午18:30&#xff09;之前把各自的代码上传到SVN&#xff0c;然后服务器在指定的时间&#xff08;例如下午18:30&#xff09;更新代码、执行ant 打包命令、最后将apk包存放在指定目录&#xff08;或者上传指定ft…