Redis和MongoDB

本文最后更新于:2022年12月5日 晚上

姓名:张家亮 学号:19020031106 班级:2019级计算机科学与技术2班
授课老师:刘洁、刘艳艳 实验名称:Redis和MongoDB的应用 完成日期:2022年12月5日

Redis

下载安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#下载网址,网速不好也可以直接下载,然后winscp上传到服务器  建议到/opt/module目录下
#下面命令不好用,就去软件包中找redis压缩包
cd /opt/module
wget https://download.redis.io/releases/redis-6.2.6.tar.gz

# 如果这个压缩包是 -rw-r--r-- root root 权限
sudo chown hadoop:hadoop redis-6.2.6.tar.gz
chmod 777 redis-6.2.6.tar.gz

#解压
tar -zxvf redis-6.2.6.tar.gz
chmod -R 777 redis-6.2.6
cd redis-6.2.6

#安装基本环境
sudo yum install gcc-c++
#查看版本,确定安装成功
gcc -v

make
sudo make install

redis默认安装路径/usr/local/bin

修改配置文件

1
2
3
#/usr/local/bin 目录下创建一个文件夹,存放配置文件
sudo mkdir bconfig
sudo cp /opt/module/redis-6.2.6/redis.conf bconfig/

redis默认不是后台启动,修改配置文件为后台启动, 后面需要远程连接redis ,所以添加IP和本地两种

1
2
3
4
5
cd bconfig
sudo chmod 777 redis.conf
vim redis.conf
#找到 daemonize no 修改为damonize yes
bind 127.0.0.1 192.168.10.100 #建议参照redis.conf

启动redis服务

1
2
3
#回到/usr/local/bin下 ,使用我们自己的配置文件启动
redis-server bconfig/redis.conf
redis-cli -p 6379

用Redis的哈希结构设计出学生表Student

(键值可以用student.zhangsan和student.lisi来表示两个键值属于同一个表);

1
2
3
4
5
6
7
8
9
#先启动redis服务
# 执行下述命令
#Hash(哈希)类型(key map)
hset student.zhangsan English 69
hset student.zhangsan Math 86
hset student.zhangsan Computer 77
hset student.lisi English 55
hset student.lisi Math 100
hset student.lisi Computer 88

image-20221205113127651

用hgetall命令分别输出zhangsan和lisi的成绩信息;

1
2
hgetall student.zhangsan
hgetall student.lisi

image-20221205113756396

用hget命令查询zhangsan的Computer成绩;

1
hget student.zhangsan Computer

修改lisi的Math成绩,改为95。

1
hset student.lisi Math 95

根据上面已经设计出的学生表Student,用Redis的JAVA客户端编程(jedis)

  1. 使用IDEA创建一个Maven项目

  2. 添加依赖pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.example</groupId>
<artifactId>Redis</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.3.1</version>
</dependency>

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.20</version>
</dependency>
</dependencies>
</project>

如果只使用API操作,则只需开启服务

1
redis-server bconfig/redis.conf

添加数据:English:45 Math:89 Computer:100

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package org.Redis;

import redis.clients.jedis.Jedis;

import java.util.Map;

public class redistrict {
public static void main(String[] args) {
// TODO Auto-generated method stub
Jedis jedis = new Jedis("192.168.10.100", 6379);
// System.out.println(jedis.ping());
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());
}

}
}

image-20221205115449951

获取scofield的English成绩信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package org.Redis;

import redis.clients.jedis.Jedis;

import java.util.Map;

public class redistest {
public static void main(String[] args) {
// TODO Auto-generated method stub

Jedis jedis = new Jedis("192.168.10.100", 6379);
// System.out.println(jedis.ping());
String value = jedis.hget("student.scofield", "English");
System.out.println("scofield's English score is: " + value);

}
}

image-20221205115519878

MongoDB

下载安装

1
2
3
4
5
6
7
8
#下载到/opt/module
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.2.12.tgz

#解压到/opt/module
tar -zxvf mongodb-linux-x86_64-3.2.12.tgz

#进入mongodb中
cd /opt/module/mongodb-linux-x86_64-3.2.12

配置系统文件profile

1
sudo vim /etc/profile

导入环境变量,并使之生效

1
2
3
4
5
6
# 在最后面添加即可
export MONGODB_HOME=/opt/module/mongodb-linux-x86_64-3.2.12
export PATH=$PATH:$MONGODB_HOME/bin

# 使之生效
source /etc/profile

配置部署

创建用于存放数据和日志文件的文件夹,并修改其权限增加读写权限

1
2
3
4
5
6
7
8
9
10
cd /opt/module/mongodb-linux-x86_64-3.2.12
sudo mkdir -p data/db
sudo chown -R hadoop:hadoop data/
sudo chmod -R 777 data/db

sudo mkdir logs
cd logs
sudo touch mongodb.log
cd ..
sudo chown -R hadoop:hadoop logs

mongodb启动配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#添加配置文件,并填入配置信息
cd /opt/module/mongodb-linux-x86_64-3.2.12/bin
sudo vim mongodb.conf


#配置信息如下
dbpath = /opt/module/mongodb-linux-x86_64-3.2.12/data/db
#数据文件存放目录
logpath = /opt/module/mongodb-linux-x86_64-3.2.12/logs/mongodb.log
#日志文件存放目录
port = 27017
#端口
fork = true
#以守护程序的方式启用,即在后台运行
nohttpinterface = true

启动mongod服务,以配置文件的方式启动

1
2
3
cd /opt/module/mongodb-linux-x86_64-3.2.12/bin
sudo chown hadoop:hadoop mongodb.conf
./mongod -f mongodb.conf

image-20221205122257417

连接mongodb数据库

image-20221205122331941

前提知识

数据库database是一个仓库,在仓库中存放集合

集合collection类似于数组,在集合中可以存放文档

文档document是文档型数据库的最小单位,我们存储和操作的都是文档

在mongodb中数据库和集合不需要自己创建,没有会自动创建

前提指令

1
2
3
4
5
6
7
8
9
10
11
#显示所有的数据库
show dbs

#使用某个数据库,没有数据库,会自己创建数据库
use student

#查询当前处于哪一个数据库
db

#显示当前数据库下所有集合
show collections

任务要求

{ “name”: “zhangsan”, “score”: { “English”: 69, “Math”: 86, “Computer”: 77 } }

{ “name”: “lisi”, “score”: { “English”: 55, “Math”: 100, “Computer”: 88 } }

用MongoDB Shell设计出student集合;

首先,切换到student集合,命令如下:

1
2
3
mongo

use student

其次,定义包含上述两个文档的数组,命令如下:

1
2
var stus=[
{"name":"zhangsan","scores":{"English":69,"Math":86,"Computer":77}},{"name":"lisi","score":{"English":55,"Math":100,"Computer":88}} ]

最后调用如下命令插入数据库:

1
db.student.insert(stus)

image-20221205123653145

用find()方法输出两个学生的信息;

1
db.student.find().pretty()

image-20221205123735606

用find函数查询zhangsan的所有成绩(只显示score列);

1
db.student.find({"name":"zhangsan"},{"_id":0,"name":0})

image-20221205123812371

修改lisi的Math成绩,改为95

1
db.student.update({"name":"lisi"}, {"$set":{"score.Math":95}} )

image-20221205123853152

java api 实验

创建一个maven工程(完全可以和上面的Redis用一个项目,本人也正是这样做的)

添加依赖项:

1
2
3
4
5
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.12.11</version>
</dependency>

用MongoDB的Java客户端编程,实现如下操作

添加数据:English:45 Math:89 Computer:100

创建一个类名为mongodbtest的类,实现上述添加数据操作的Java代码如下

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 org.mongoDB;

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 mongodb_data {

public static void main(String[] args) {
// TODO Auto-generated method stub
//实例化一个mongo客户端
MongoClient mongoClient = new MongoClient("192.168.10.100", 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("文档插入成功");

}
}

image-20221205124337381

获取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
package org.mongoDB;

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


public class mongodb_test {

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

}

image-20221205124549246


Redis和MongoDB
https://jialiangz.github.io/2022/12/05/Redis&MongoDB_exp/
作者
爱吃菠萝
发布于
2022年12月5日
更新于
2022年12月5日
许可协议