spring boot(学习笔记第十课)
- NoSQL(Redis),NoSQL(MongoDB)
学习内容:
- NoSQL(Redis)
- NoSQL(MongoDB)
1. NoSQL(Redis)
Redis
是NoSQL
阵营中的一个常见DB Server
,目前来看NoSQL
和传统的RDS(Relation Database System)
相比,是一个强有力的补充,但是NoSQL
不能替代传统的关系型DB Server
。
-
搭建单
server
版redis
。
因为是在windows上进行学习,所以首先在VMware做成了centos
的虚拟机。-
下载最新版的
redis
。
https://download.redis.io/releases/
这里选择了最新版redis-7.4-rc1.tar.gz
。
-
进入
centos(VMware)
,进行安装。注意,最好在sudo
下进行
VMware
需要设定成NAT
的网络。
之后将NAT
设定应用到该VM
虚拟机。
-
准备进行安装。
mkdir -p /data/install
将安装文件下载到这个文件夹。
mkdir -p /data/local
-
将
redis-7.4-rc1.tar.gz
解压到/data/local
tar -zxvf /data/install/redis-5.0.7.tar.gz -C /data/local/
-
安装需要的gcc等工具包。
yum -y install gcc gcc-c++ tcl automake autoconf libtool make
-
进行编译安装
make && make install
-
对
service
配置文件进行编辑,让他使用本地的redis.conf
进行启动
vim /data/local/redis-7.4-rc1/utils/systemd-redis_server.service
[Service] #ExecStart=/usr/local/bin/redis-server --supervised systemd --daemonize no ## Alternatively, have redis-server load a configuration file: ExecStart=/usr/local/bin/redis-server /data/local/redis-7.4-rc1/redis.conf LimitNOFILE=10032 NoNewPrivileges=yes
其他地方都不用修改,就是
ExecStart
这里,/usr/local/bin/redis-server
的后面加上/data/local/redis-7.4-rc1/redis.conf
,让之后的自定义的redis.conf
能够有效。- 之后将
/data/local/redis-7.4-rc1/utils/systemd-redis_server.service
拷贝到正式的service
配置文件的路径下。注意,为了名字简单,重命名成redis.service。
cp systemd-redis_server.service /usr/lib/systemd/system/redis.service
- 对
/data/local/redis-7.4-rc1/redis.conf/
进行修正。
vim /data/local/redis-7.4-rc1/redis.conf
- 如果有
bind
,那么注释掉。默认(0.0.0.0)让所有的地址都进行bind
。
- 对
protected-mode
进行no
设定。#protected-mode yes protected-mode no
- 设定访问密码,这里是练习,所以设定成
123456
。requirepass 123456
- 进行
redis.service
启动。注意,需要在sudo
下进行。并且这里没有配置开机自动启动,所以每次重启vm虚拟机
需要重新一次执行redis.service
启动
systemctl start redis.service
检查redis.service
的状态。
systemctl status redis.service
如果active(running)
状态,表明正常启动。 - 在本地执行
redis-cli
(redis
的客户端程序)来确认service
状态。redis-cli -a 123456
注意,密码就是上面设定的密码- 在
localhost上可以执行如下的命令确认(get)和设定(set)各种参数。
[finlay@master ~]$ redis-cli -a 123456 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 127.0.0.1:6379> config get protected-mode 1) "protected-mode" 2) "no" 127.0.0.1:6379> config get requirepass 1) "requirepass" 2) "123456" 127.0.0.1:6379> config get bind 1) "bind" 2) "* -::*" 127.0.0.1:6379>
- 如果有
-
-
进行
spring boot
的配置,访问redis server
。- 对
application.properties
进行配置之前,double shift
快捷方式来看看RedisProperties.java
的配置。@ConfigurationProperties(prefix = "spring.data.redis") public class RedisProperties {
- 对
application.properties
进行配置
其中spring.data.redis.database=0 spring.data.redis.host=192.168.12.129 spring.data.redis.port=6379 spring.data.redis.password=123456 spring.data.redis.lettuce.pool.max-active=8 spring.data.redis.lettuce.pool.max-idle=8 spring.data.redis.lettuce.pool.max-wait=-1ms spring.data.redis.lettuce.pool.min-idle=0
spring.redis.database
是redis db
的需要,可以配置一个以上。
spring.redis.host
是ip
地址,这里是VMware
虚拟机的ip
地址。 - 向
pom.xml
中增加依赖。<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency>
- 在
controller
中注入redisTemplate
和stringRedisTemplate
。
@Autowired @Qualifier(value = "redisTemplate") private RedisTemplate<Object, Object> redisTemplate; @Autowired private StringRedisTemplate stringRedisTemplate;
-
在
controller中定义方法,对
redis db`数据做成,取得操作。@GetMapping("/redis") @ResponseBody public String redis() { StringBuffer ret = new StringBuffer(); ValueOperations<String, String> ops1 = stringRedisTemplate.opsForValue(); ops1.set("name", "allen"); String name = ops1.get("name"); ret.append(name); ret.append("<br>"); ValueOperations ops2 = redisTemplate.opsForValue(); Book secondBook = new Book(); secondBook.setName("finlay"); secondBook.setPrice(17F); secondBook.setPublicatationDate(new Date()); secondBook.setAuthor("finlay"); ops2.set("second_book", secondBook); Book book = (Book) ops2.get("second_book"); ret.append(book.toString()); return ret.toString(); }
-
上面的执行之后,将
set
方法都去掉,重启redis db
,再次执行,看到数据还是存在的,因此说明redis db
对数据进行了disk persistence
.@GetMapping("/redis") @ResponseBody public String redis() { StringBuffer ret = new StringBuffer(); ValueOperations<String, String> ops1 = stringRedisTemplate.opsForValue(); // ops1.set("name", "allen"); String name = ops1.get("name"); ret.append(name); ret.append("<br>"); ValueOperations ops2 = redisTemplate.opsForValue(); // Book secondBook = new Book(); // secondBook.setName("finlay"); // secondBook.setPrice(17F); // secondBook.setPublicatationDate(new Date()); // secondBook.setAuthor("finlay"); // ops2.set("second_book", secondBook); Book book = (Book) ops2.get("second_book"); ret.append(book.toString()); return ret.toString(); }
- 对
2. NoSQL(MongoDB)
- 在centos上安装
MongoDB
- 下载
MongoDB
到/data/mongodb
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-7.0.11.tgz
- 解压之后
mv
到/opt/mongodb
文件夹
mv mongodb-linux-x86_64-rhel70-7.0.11 /opt/mongodb/
- 常见
logs
和db
文件夹
mkdir /opt/mongodb/db
mkdir /opt/mongodb/logs
- 进入
bin
文件夹,创建mongo.conf文件
cd /opt/mongodb/mongodb-linux-x86_64-rhel70-7.0.11/bin
dbpath=/opt/mongodb/db logpath=/opt/mongodb/logs/log port=27017 fork=true
- 启动
mongodb server
cd /opt/mongodb/mongodb-linux-x86_64-rhel70-7.0.11/bin
./mongod -f mongo.conf --bind_ip_all
注意,在mongo.conf里面指定了fork=true
,因此该命令会fork
一个进程之后,结束当前命令行,类似于开启service
- 之后检查27017端口,是否已经开始由
mongodb
监听。
ss -ltnp |grep ":27017"
LISTEN 0 128 *:27017 *:* users:(("mongod",pid=21275,fd=15))
- 安装mongodb客户端
- 创建一个
vim /etc/yum.repos.d/mongodb-org.repo
。[mongodb-org-4.4] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
- 执行
yum
安装
yum install -y mongodb-org-shell mongodb-org-tools
- 执行
mongo
客户端程序
whereis mongo
-->/usr/bin/mongo
root
用户不写绝对路径不好用,所以要提前whereis
下,确定绝对路径
执行[root@master bin]# /usr/bin/mongo MongoDB shell version v4.4.29 connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb Implicit session: session { "id" : UUID("631f4f15-38f5-4462-b1a6-685f8816e5d8") } MongoDB server version: 7.0.11 WARNING: shell and server versions do not match --- The server generated these startup warnings when booting: 2024-06-23T16:59:44.294+08:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted 2024-06-23T16:59:44.295+08:00: You are running this process as the root user, which is not recommended 2024-06-23T16:59:44.295+08:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never' in this binary version 2024-06-23T16:59:44.295+08:00: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. We suggest setting it to 'never' in this binary version 2024-06-23T16:59:44.295+08:00: Soft rlimits for open file descriptors too low 2024-06-23T16:59:44.295+08:00: currentValue: 1024 2024-06-23T16:59:44.295+08:00: recommendedMinimum: 64000 --- >
db.version()
确定版本。 - 需要shutdown server的时候必须要切到
admin
数据库,默认进入的是test
数据库。use admin; db.shutdownServer(); exit
- 切换到
admin
数据库,创建用户,赋予给test
数据库。> use admin; switched to db admin > db.createUser({user:"finlay",pwd:"123456",roles[{role:"readWrite",db:"test"}]}); uncaught exception: SyntaxError: missing : after property id : @(shell):1:47 > db.createUser({user:"finlay",pwd:"123456",roles:[{role:"readWrite",db:"test"}]}); Successfully added user: { "user" : "finlay", "roles" : [ { "role" : "readWrite", "db" : "test" } ] } >
- 切换到
admin
数据库,进行认证。> use admin; switched to db admin > db.auth("finlay","123456"); 1 >
- 创建一个
- 下载
- 配置
spring boot
,连接mongo db
pom.xml
中加入必要的依赖。<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
application.properties
中加入mongdb
的连接信息。spring.data.mongodb.authentication-database=admin spring.data.mongodb.database=test spring.data.mongodb.host=192.168.12.130 spring.data.mongodb.port=27017 spring.data.mongodb.username=finlay spring.data.mongodb.password=123456
- 在
controller
使用mongoTemplate
进行数据库操作。@Autowired private MongoTemplate mongoTemplate; @GetMapping("/mongo") @ResponseBody public String mongo() { List<Book> books = new ArrayList<>(); Book b1 = new Book(); b1.setId(1); b1.setAuthor("tom"); b1.setName("spring boot"); b1.setPrice(17F); books.add(b1); Book b2 = new Book(); b2.setId(2); b2.setAuthor("allen"); b2.setName("future"); b2.setPrice(27F); books.add(b2); mongoTemplate.insertAll(books); Book book = mongoTemplate.findById(1, Book.class); if (book != null) { return book.toString(); }else{ return ""; } }
- 看到已经保存到
mongo db
了。