NoSql和关系数据库 的操作比较

NoSQL

NoSQL是一种不同于关系数据库管理系统设计方式,是对非关系型数据库的统称,它所采用的数据模型并非传统关系数据库的关系模型,而是类似键/值、列族、文档等非关系模型。NoSQL数据库没有固定的表结构,通常也不存在连接操作。
数据库的特点:

  • 扩展性
    传统数据库很难实现横向扩展,NoSQL实现起来比较容易。
  • 数据模型
    关系模型是关系数据库的基石,它以完备的关系代数理论为基础。NoSQL数据库转用键/值、列族等非关系模型,允许在一个数据元素里面存储不同类型的数据。
  • 与云计算紧密结合
    云计算具有很好的水平扩展能力,可以根据资源使用情况进行自由伸缩,各种资源可以动态的加入。

    MySQL数据库

    对于Mysql数据库的学习,这一块就不记录了!
    阿里云安装
    使用

    HBase

    HBase的详细操作
    在这里插入图片描述
  • 3.a
    首先启动shell
    1
    bin/hbase shell

执行创建表的操作(因为我里面有个student了就创建student2)

1
create 'Student2','score'

添加数据

1
put 'Student2','lisi','score:English','55'

查询数据

在这里插入图片描述

  • 3.b
1
get 'Student2','zhangsan','score:Computer'
  • 3.c

在这里插入图片描述

  1. HBase API
    函数在HBase中已经介绍过了,进行如下调用即可
1
2
3
4
init();
insertData("Student2", "scofield", "score", "English", "45");
insertData("Student2", "scofield", "score", "Math", "89");
insertData("Student2", "scofield", "score", "Computer", "100");

查询数据

1
2
3
init();
getData("Student2","scofield","score","English");
close();

Redis

(流泪~~好多软件,心疼我的机子呀!又要含泪安装~~~)

先来简单的了解一下Redis吧

Redis的学习官网
Redis作为一个高性能的键值数据库,不仅在很大程度上弥补了memcached这类键值存储的不足(Redis值的存储最大可以为1GB),而且在部分场合下可以对关系数据库起到很好的补充作用。

Redis的安装

安装软件的下载

1
2
3
$ wget https://download.redis.io/releases/redis-6.0.9.tar.gz
$ sudo tar -zxvf ./redis-6.0.9.tar.gz -C /usr/local
$ sudo mv ./redis-6.0.9 ./redis

更改目录的操作权限

1
sudo chown -R hadoop:hadoop ./redis

接下来,进入“/usr/local/redis”目录,输入以下命令编译和安装Redis

1
2
$ sudo make
$ sudo make install

然后开启redi s的服务

1
2
$ cd /usr/local/redis
$ ./src/redis-server

安装成功后会显示:
在这里插入图片描述
接下来在开一个终端:
启动redis的客户端:

1
2
$ cd /usr/local/redis
$ ./src/redis-cli

会显示:
127.0.0.1:6379>
客户端连上服务器之后,会显示“127.0.0.1:6379>”的命令提示符信息,表示服务器的IP地址为127.0.0.1,端口为6379。现在可以执行简单的操作。
操作任务同上
在这里插入图片描述

Redis shell 的操作:

  • 设计数据表
    lisi的插入操作过程是一样的:
    1
    2
    3
    4
    5
    127.0.0.1:6379> hset student.zhangsan English 69
    (integer) 1
    127.0.0.1:6379> hset student.zhangsan Math 86
    (integer) 1
    127.0.0.1:6379> hset student.zhangsan Computer 77

查询zhangsan的成绩:

1
2
3
4
5
6
7
127.0.0.1:6379> hgetall student.zhangsan
1) "Math"
2) "86"
3) "Computer"
4) "77"
5) "English"
6) "69"

查询lisi的所有成绩:

1
2
3
4
5
6
7
127.0.0.1:6379> hgetall student.lisi
1) "English"
2) "55"
3) "Math"
4) "100"
5) "Computer"
6) "88"
  • 查询
    zhangsan的computer成绩
1
127.0.0.1:6379> hget student.zhangsan Compute
  • 修改
    修改lisi的math成绩为95
    1
    hset student.lisi Math 95

Redis 的java API操作

使用Redis在本机上进行操作需要首先添加一个Jedis的jar包
在里面进行搜索相应的版本即可。我这里用的是3.3.0版本.
a) 添加数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package ConnTest;
import java.util.Map;
import redis.clients.jedis.Jedis;

public class jedis_test {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Jedis jedis = new Jedis("127.0.0.1");
jedis.hset("student.scofield", "English","45");
jedis.hset("student.scofield", "Math","89");
jedis.hset("student.scofield", "Computer","100");
Map<String,String> value = jedis.hgetAll("student.scofield");
for(Map.Entry<String, String> entry:value.entrySet())
{
System.out.println(entry.getKey()+":"+entry.getValue());
}
}
}

执行成功之后会显示:
Math:89
Computer:100
English:45
b) 获取英语成绩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package ConnTest;
import java.util.Map;
import redis.clients.jedis.Jedis;

public class jedis_test {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Jedis jedis = new Jedis("127.0.0.1");
String value=jedis.hget("student.scofield", "English");
System.out.println("scofield's English score is: "+value);
}
}

补充:如果想要关闭掉Redis的服务器,可以在服务器的登陆成功的界面执行ctrl+C;如果是不小心关掉了界面,在登陆redis的时候发现服务器是开着的,我们又不想让他占用资源,可以通过执行./src/redis-cli shutdown然后查看是否还有redis的进程在活动ps -ef | grep redis,最后找到redis-server的进程号,执行kill -9 进程号

MongoDB

官方学习网站
MongoDB 是一个是一个基于分布式文件存储的数据库,介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

MongoDB的安装

mongoDB直接通过apt-get install 就可以安装:
首先更新一下软件库。

1
sudo apt-get update

然后在执行安装,这看起来简单多了:

1
sudo apt-get install mongodb

最后,检查一下是否安装成功:

1
mongodb -version

实验操作

实验操作要求与 mysql的实验要求是一样的。

  1. 设计完成数据表
1
2
3
4
5
> use student
switched to db student
> var stus=[
... {"name":"zhangsan","scores":{"English":69,"Math":86,"Computer":77}},{"name":"lisi","score":{"English":55,"Math":100,"Computer":88}}]
> db.student.insert(stus)
  1. 查询两个学生的信息
1
> db.student.find().pretty()

查询到的结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"_id" : ObjectId("5fae58ca036d879c65db8de3"),
"name" : "zhangsan",
"scores" : {
"English" : 69,
"Math" : 86,
"Computer" : 77
}
}
{
"_id" : ObjectId("5fae58ca036d879c65db8de4"),
"name" : "lisi",
"score" : {
"English" : 55,
"Math" : 100,
"Computer" : 88
}
}
  1. 查询zhangsan的成绩,只显示成绩
1
> db.student.find({"name":"zhangsan"},{"_id":0,"name":0})

查询结果显示为:

1
{ "scores" : { "English" : 69, "Math" : 86, "Computer" : 77 } }
  1. 修改lisi的成绩
1
db.student.update({"name":"lisi"}, {"$set":{"score.Math":95}} )

执行结果为:

1
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

用MongoDB的JAVA API编程

Mongo DB的驱动包
将驱动包添加到新创建的项目中。

  1. 添加数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package ConnTest;
import java.util.ArrayList;
import java.util.List;

import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;

public class Mongo_test {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//实例化一个mongo客户端
MongoClient mongoClient=new MongoClient("127.0.0.1",27017);
//实例化一个mongo数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase("student");
//获取数据库中某个集合
MongoCollection<Document> collection = mongoDatabase.getCollection("student");
//实例化一个文档,内嵌一个子文档
Document document=new Document("name","scofield").
append("score", new Document("English",45).
append("Math", 89).
append("Computer", 100));
List<Document> documents = new ArrayList<Document>();
documents.add(document);
//将文档插入集合中
collection.insertMany(documents);
System.out.println("文档插入成功");
}
}

运行成功后显示:文档插入成功

  1. 获取scofield的所有成绩成绩信息(只显示score列)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.util.ArrayList;
import java.util.List;

import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import static com.mongodb.client.model.Filters.eq;
public class mongo_query {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//实例化一个mongo客户端
MongoClient mongoClient=new MongoClient("127.0.0.1",27017);
//实例化一个mongo数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase("student");
//获取数据库中某个集合
MongoCollection<Document> collection = mongoDatabase.getCollection("student");
//进行数据查找,查询条件为name=scofield, 对获取的结果集只显示score这个域
MongoCursor<Document> cursor=collection.find( new Document("name","scofield")).
projection(new Document("score",1).append("_id", 0)).iterator();
while(cursor.hasNext())
System.out.println(cursor.next().toJson());
}
}