引言:

nosql 的兴起和革命,在我看来已经开始逐渐影响到了传统的sql的地位,但是仅仅是影响而已,取代是不太可能的。


正文:

两年前,一个偶然的机会开始接触到 nosql ( mongodb )。用来作数据挖掘的存储容器,第一次接触到nosql,真的被它惊艳到了。鄙人受到传统的SQL的思维定势,甚至一时间难以接受。

mongodb是一个非关系型文档数据库,非常适合文档类型的数据的存储,查询也十分方便,支持动态的横向和纵向的数据扩展。爱不释手。下个用几行shell来展示一下mongodb的魅力

show dbs;//无则会创建
use mydb;show collections;//新建集合,相当于mysql中的表
db.createCollection('mycollection');//插入数据.
db.mycollection.insert({'username':'chenqimiao','age':23})db.mycollection.insert({'username':'cqm','age':23,'sex':'男'})//查询
db.mycollection.find({"age":23});

类比mysql的话,最大的区别可能在于表结构或者说集合结构的定义了,mysql的列是预定义的,而mongodb是在插入数据的时候才确定这条数据的列。

所以mongodb可以支持动态扩展列,在mongo中可能不叫列,要叫作域(field)吧。


后来花了一点时间了解了一下 HBase , Habase   诞生于 Hadoop的子项目,受大数据的遗传。单表可以非常的大,同样Habase也是基于列的。

印象中HBase 中有一个非常特别的特性,HBase 的数据覆盖,并不是实际的覆盖。HBase 有一个时间维度的概念,所有的数据都是基于这个维度进行存储的,

简单点说,同样的key  可能在HBase 中存在两个value。它是怎么做到的?因为它给每一条记录都偷偷记录了一个timestamp,每次你去覆盖键值对的时候,你以为你已经删除了旧值,替换成了新

值,而实际上只是再添加了一条记录而已,两条记录共存在一个时间维度上。每次get(key)默认取最新的一个value,仅此而已。

你还可以手动设置失效时间TTL,这样每一个值就会有一个有效期,过了有效期都值是不能get出来了,但是值还是存储在HBase中并未丢失。


再后来接触到了 redis ,相信大家对这个都相当的熟悉,基于内存的缓存数据库,简单的set()  get()就可以了缓存一些经常使用到的值,之前我也专门介绍过 redis的安装,shell命令,多实例部署,读写分离,主从复制,哨兵 等等问题。

当数据超过一定量 , redis会把数据swap到文件中去,如果使用到swap中的文件的值,redis会把文件在swap到内存中,进行读写,十分智能。支持的数据类型也比较多 ,除了k-v 还有hset ,hash  ,zset等等


最近在做在线课堂,用到了 Memcache ,这个东西基本和redis的使用场景相似,基于内存的nosql。但是支持的数据类型只有k-v的形式。这是不同于redis的一点。

其二的话, Memcache 不支持文件持久化。

其三, memcache 的多实例,是基于客户端的,这个比较有意思要好好聊一聊了,象我们平常接触的mysql,redis,多实例同步基本是读写分离,主从复制,主机写,从机读,这样的模式。可以说是基于服务端的多实例方案。但是 memcache 有点好玩了,它的多实例之间不进行同步,那它是怎么做到负载均衡的时候保证数据的完整性呢?

说到这里,我想先介绍一下memcache的主流的客户端程序(JAVA)

  • 官方提供的基于传统阻塞io由Greg Whalin维护的客户端

     较早推出的客户端,稳定,持久运行。

  • Dustin Sallings实现的基于java nio的Spymemcached

    A simple, asynchronous, single-threaded memcached client written in java. 支持异步,单线程的memcached客户端,用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常 报timeOut等相关异常。

  • XMemcache

Memcached同样是基于java nio的客户端,java nio相比于传统阻塞io模型来说,有效率高(特别在高并发下)和资源耗费相对较少的优点。传统阻塞IO为了提高效率,需要创建一定数量的连接形成连接 池,而nio仅需要一个连接即可(当然,nio也是可以做池化处理),相对来说减少了线程创建和切换的开销,这一点在高并发下特别明显。因此 XMemcached与Spymemcached在性能都非常优秀,在某些方面(存储的数据比较小的情况下)Xmemcached比 Spymemcached的表现更为优秀,具体可以看这个Java Memcached Clients Benchmark。

根据上面的介绍,大概可以了解到,官方提供的是阻塞的客户端,要利用线程池来实现并发,但是官方提供的包还有一个非常致命的问题,不提供 CAS 的同步功能。

什么是 CAS ?

了解过java下面的 java.util.concurrent.atomic; 下面的类的同学应该知道, CAS (check and swap),这是一种乐观锁的实现,程序陷入一个循环,得到旧值,执行CAS方法,传入旧值,新值,若旧值未发生变化 ,则用旧值,换出新值。

while(true){Object oldValue = atomicObject.get("key1") ;Object newValue = new Object();Object value  =   checkAndSwap("key1",oldValue,newValue) ;if(value!=null&&oldValue.equals(value))  break;}

解释完 CAS ,回到刚才的问题,为什么没有实现 CAS ,是官方包一个致命的弱点,明白了 CAS 原理的同学,应该发现其实它就是一个同步的手段,那为什么不能使用 syncronized 的。那是因为数据并发发生在不同项目里面,没有办法给多个项目之前共用一个 syncronized 。这个时候只能利用memcache提供的锁,利用 CAS 作为同步手段。

庆幸spyMemcache和xmemcache都提供了 CAS 的操作。

那么问题来了,刚刚最早提出的问题如何解答?( CAS 多实例同步问题。)其实啊memcache根本不需要进行多实例同步,它的多实例是依赖于客户端程序实现的。

比如spymemcache:

para.memcache.server=192.168.202.121:11211,192.168.202.121:11210 配置两个server即可。其余的操作和操作一个memcache是一摸一样的,客户端会根据Hash散列算法( HashMap 的实现算法)将键值对放到对应的 memcache 中,由于算法一致性,所以存取双方都能得知键值在哪一个 memcache 中。这样就实现了多实例了。

另外spymemcache客户端还有一个比较厉害的地方,它能直接将java对象序列化,作为k-v中的v,get(k)的时候自动反序列化成对象,无需直接操作JSONObject,当然前提是对象实现

Serializable 接口,并给定一个 serialVersionUID 。redis也可以直接存储二进制文件,但是官方提供的客户端程序,并没有封装好序列化和反序列化,需要自己实现。


说了这么多nosql,好像传统sql无用武之地一般。其实传统的sql才是最稳定的,适用面积最广,最安全,并且提供了事务回滚,保证数据一致性,这是nosql为了提高速度,增强扩展性,所要面临的一部分舍弃。

转载于:https://www.cnblogs.com/think-in-java/p/5910477.html

“NOSQL” 杂谈相关推荐

  1. php杂谈【基础篇】之_7.PHP涉及的所有英文单词

    php杂谈[基础篇]之_7.PHP涉及的所有英文单词 拦路虎 PHP再火,也会让一部同学心生畏惧,因为看到编辑器中那一串串英文单词,担心自己英文不好,从而对能学会PHP的决心产生动摇.其实大可不必,英 ...

  2. 带你入门NoSQL(真的是太全了)

    引子: 在我们开发过程中,数据库是一个很常用的数据存储工具,我们对sql运用的可以说如火纯情了,但不知道大家有没有想过,传统关系型数据库是关系的,而存储结构是面向对象的,这种情况下,每次存储或者查询时 ...

  3. SQL与NoSQL的区别 以MySQL与MongoDB为例

    异同对比 1.语言和结构层面 SQL数据库,是基于表的,并且用结构化语言也就是SQL来定义和操纵数据.一方面,这是非常强大的:SQL是最通用和最广泛使用的选项之一,使其成为一个安全的选择,尤其适用于复 ...

  4. NOSQL图形数据库 - Neo4j

    Neo4j入门指南 1.简介 2.特点 3.安装 4.基础操作 5.Java集成 5.1 内嵌数据库集成方式 5.2 服务器集成方式 5.3 Spring集成方式 参考文档 1.简介 Neo4j是一个 ...

  5. Cassandra 1.2 发布,NoSQL 数据库

    NoSQL 数据库 Cassandra 发布 1.2 正式版,该版本包含 CQL3,这是在 2012年4月发布的 1.1 版本中引入的.CQL 是一个 Cassandra 的建模和查询语言,类似关系数 ...

  6. MongoDB(3)--有关NoSQL及MongoDB的一些概念

    学习任何东西在没有理解的前提下去背熟一些概念是没有用的,就像只背会了几个概念而没有理解的开发人员去面试是经不住面试官的追问的.前面的两篇对MongoDB做了简单的介绍,能够很快上手,对MongoDB有 ...

  7. java 连nosql_浅谈 Java 中 MongoDB NoSQL数据库使用指南

    MongoDB是当今非常流行的一款NoSQL数据库,本文介绍如何使用MongoDB的Java驱动来操作MongoDB. 一.引入MongoDB Java Driver包 如果需要操作MongoDB的J ...

  8. MySQL下的NoSQL解决方案HandlerSocket

    目前使用MySQL的网站,多半同时使用Memcache作为键值缓存.虽然这样的架构极其流行,有众多成功的案例,但过于依赖Memcache,无形中让Memcache成为故障的根源: Memcache数据 ...

  9. Redis初学:1(NoSQL的简介和Redis的安装)

    什么是NoSQL NoSQL数据库意即:Not Only SQL 不仅仅是SQL,它区别于传统的关系型数据库,储存方式按照的是key-value的形式存储数据,这个我们可以联想到我们以前学过的Hash ...

最新文章

  1. leetcode.169 求众数
  2. MySql级联删除和更新
  3. 要尝试着多跟外界交流
  4. 基于c#的相关性分析_开源Math.NET基础数学类库使用(11)C#计算相关系数
  5. powerbi的功能介绍_Power BI:1分钟快速生成可视化报表
  6. java 压缩包添加文件,如何在Java中向现有zip文件添加条目?
  7. 改善代码设计 —— 处理概括关系(Dealing with Generalization)
  8. 锋利的jQuery--Ajax(读书笔记四)
  9. 将Excel数据批量生成条形码
  10. Android APP微信第三方登录踩坑 - 微信开放平台修改应用包名后微信第三方登录失败
  11. 实习生去公司都干些啥
  12. 终于!LeCun发文驳斥Gary Marcus:别把深度学习暂时的困难当撞墙
  13. 【ARM开发】交叉编译Qt源码之(1)编译xcb
  14. android的事件处理和传递机制实例
  15. 大厂HR面试会问什么?
  16. Typora加上搜狗输入法快捷方法
  17. LINUX磁盘分区和添加磁盘的一些命令
  18. linux下使用P4(命令行)
  19. Android基础之十八显示gif动画,动态图片
  20. 半导体设备英文缩写_ETC的系统构成和主要设备、芯片供应商

热门文章

  1. python:分层抽样(取出0和1中70%的数值)
  2. mysql line separator_java输出换行的标准姿势line.separator
  3. 网站劫持问题到底是什么意思?怎么才能解决?
  4. 覆盖淘宝原数据、京东商品详情、1688拍立淘等各大电商平台API数据调用示例
  5. 2015定额企业取费证规费费率核定标准摘录绵建价【2016】3 号
  6. 讲课ppt和其他资料
  7. c# 审批流引擎_C#教程之Slickflow.NET 开源工作流引擎高级开发(二|C#教程
  8. 网络原理之TCP-IP地址 子网掩码
  9. 竖排显示变横排显示的方法
  10. 罗胖2021跨年演讲小结