- 若文章内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系博主删除。
- 本人写这篇博客旨在制作学习笔记,巩固知识。同时方便个人在线阅览,回顾知识。
- 这篇博客中主要参考了【瑞吉外卖项目】视频中的内容,略有增删。
- 推荐博客
- 本人于 2022 年 4 月 7 日发布过的博客:《Centos7 的下载安装》。
文章目录
- 前言
- 0.总目录链接
- 1.Linux 简介
- 1.1.不同应用领域的主流操作系统
- 1.2.Linux 发展历史
- 1.3.Linux 系统版本
- 2.Linux 安装
- 2.1.安装方式
- 2.2.安装 Linux
- 2.3.网卡设置
- 2.4.安装 SSH 连接工具
- 2.5.使用 FinalShell 连接到 Linux
- 2.6.Linux 和 Windows 目录结构对比
- 2.7.Linux 目录介绍
- 3.Linux 常用命令
- 3.1.Linux 命令初体验
- 3.1.1.几个常用命令
- 3.1.2.注意事项
- 3.1.3.使用技巧
- 3.1.4.命令格式
- 3.2.文件目录操作命令
- 3.2.1.ls
- 3.2.2.cd
- 3.2.3.cat
- 3.2.4.more
- 3.2.5.tail
- 3.2.6.mkdir
- 3.2.7.rmdir
- 3.2.8.rm
- 3.3.拷贝移动命令
- 3.3.1.cp
- 3.3.2.mv
- 3.4.打包压缩命令 tar
- 3.5.文本编辑命令
- 3.5.1.vi
- 3.5.2.vim
- 3.6.查找命令
- 3.6.1.find
- 3.6.2.grep
- 4.Linux 软件安装
- 4.1.软件安装方式
- 4.2.安装 JDK
- 4.3.有关防火墙的操作
- 4.4.安装 Tomcat
- 4.5.安装 MySQL
- 4.6.安装 lrzsz
- 5.Linx 中的项目部署
- 5.1.手工部署项目
- 5.2.通过 Shell 脚本自动部署项目
- 6.Redis 基础
- 6.1.Redis 入门
- 6.1.1.Redis 简介
- 6.1.2.Redis 的下载与安装
- 6.1.3.Redis 服务启动与停止
- 6.1.4.Redis 设置密码
- 6.1.5.Redis 设置远程连接
- 6.2.数据类型
- 6.3.常用命令
- 6.3.1.字符串 string 操作命令
- 6.3.2.哈希 hash 操作命令
- 6.3.3.列表 list 操作命令
- 6.3.4.集合 set 操作命令
- 6.3.5.有序集合 sorted set 操作命令
- 6.3.6.通用命令
- 7.在 Java 中操作 Redis
- 7.1.介绍
- 7.2.在 Idea 中使用 Jedis
- 7.3.Spring Data Redis
- 7.3.1.简单介绍
- 7.3.2.项目准备工作
- 7.3.3.string 类型数据操作
- 7.3.4.hash 类型数据操作
- 7.3.5.list 类型数据操作
- 7.3.6.set 类型的数据操作
- 7.3.7.zset 类型的数据操作
- 7.3.8.通用的数据类型操作
前言
【瑞吉外卖】项目课程:Linux 学习
- 该课程在某站视频下的简介
- 【瑞吉外卖项目】 课程 以当前热门的外卖点餐为业务基础,业务真实、实用、广泛。
- 基于流行的 Spring Boot、MyBatis Plus 等技术框架进行开发,带领学习者体验真实项目开发流程、需求分析过程、代码实现过程。
- 学完本课程可以锻炼需求分析能力、编码能力、bug 调试能力,增长开发经验。
- 黑马瑞吉外卖实战项目的相关链接
- 在线观看:https://www.bilibili.com/video/BV13a411q753
- 百度网盘链接:https://pan.baidu.com/s/1bxEy2bHiCYQtouifUppsTA
- 提取码:1234
- 阿里云盘链接:https://www.aliyundrive.com/s/DS2XMVojBjH
官方所给的资料链接中是没有视频中出现的 PPT 的,本博客的主要内容就是摘抄自其视频中出现的 PPT 内容。
- Linux 部分的教学视频:P117 ~ P140
- Redis 部分的教学视频:P141 ~ P154
0.总目录链接
还没写完,写了再补上。这里占个位置先。
1.Linux 简介
1.1.不同应用领域的主流操作系统
- 桌面操作系统
- 服务器操作系统
- 移动设备操作
- 系统嵌入式操作系统
- 桌面操作系统
- Windows(用户数量最多)
- Mac OS(操作体验好,办公人士首选)
- Linux(用户数量少)
- 服务器操作系统
- UNIX(安全、稳定、付费)
- Linux(安全、稳定、免费的版本很多、占有率高)
- Windows Server(付费、占有率低)
- 移动设备操作
- Android(基于 Linux、开源。主要用于智能手机、平板电脑和智能电视)
- iOS(苹果公司开发、不开源,用于苹果公司的产品,诸如 iphone、iPad)
- 系统嵌入式操作系统
- Linux(机顶盒、路由器、交换机)
1.2.Linux 发展历史
- 时间:1991年
- 地点:芬兰赫尔辛基大学
- 人物:Linus Torvalds ( 21岁)
- 语言:C语言、汇编语言
- logo:企鹅
- 特点:免费、开源、多用户、多任务
1.3.Linux 系统版本
- 内核版
- 由 Linus Torvalds 及其团队开发维护
- 免费且开源
- 复制控制硬件
- 发行版
- 基于 Linux 内核进行拓展
- 由各个 Linux 产商开发、维护
- 有收费版本,也有免费版本
- Linux 系统发行版
- Ubuntu:以桌面应用为主
- RedHat:应用最为广泛
- CentOS:RedHat 的社区版 ,免费
- openSUSE:对个人完全免费、图形界面华丽
- Fedora:功能完备、快速更新、免费
- 红旗 Linux:北京中科红旗软件技术有限公司开发
- 本次课程的操作使用的 LInux 的发行版就是 CentOS。
2.Linux 安装
- 本人在 2022 年 4 月 7 日发布过的博客《Centos7 的下载安装》有着详细的介绍。
2.1.安装方式
- Linux 系统的安装方式
- 物理机安装:直接将操作系统安装到服务器硬件上
- 虚拟机安装:通过虚拟机软件安装
- 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能、运行在完全隔离环境中的计算机系统。
- 常用的虚拟机软件:VMware、VirtualBox、VMLite WorkStation、Qemu、HopeddotVOS。
- 课程中使用的虚拟机软件是 VMware。
2.2.安装 Linux
- 资料链接:https://pan.baidu.com/s/1bxEy2bHiCYQtouifUppsTA(提取码:1234 )
- 我们只需要点击 VMware 软件的安装程序,根据提示完成安装即可,非常简答。
- 之后我们可以使用资料中提供的 CentOS 的镜像文件来完成安装。
- 安装的具体细节可见我之前写过的博客:《Centos7的下载安装》
2.3.网卡设置
- 按照我之前写过的博客(Centos7的下载安装)中的操作来的话,是不会发生以下的情况的。
如果诸位在启动服务器时未加载网卡,则会导致 IP 地址初始化失败。
可以采用以下的方式来解决。
- 首先使用 ip addr 来查看服务器的 ip 地址。
- 修改网络初始化配置,设定网卡在系统启动时初始化。
cd / # 进入根目录 cd etc # 进入 etc 目录 cd sysconfig # 进入 sysconfig 目录 cd network-scripts # 进入 network-scripts vi ifcfg-ens33 # 编辑 ifcfg-en33 文件
- 这里补充一下关于 vi 的按键操作
- 按 键,进入光标状态。
- 移动光标,找到要修改的部分,再修改内容。
- 按
键,退出光标状态。 - 再敲 :wq --> 最后按
键,成功保存退出
可以看到 BOOTPROTO=dhcp ,ONBOOT=no。我们把其改为 ONBOOT=yes 就行。
- ONBOOT 是指明在系统启动时是否激活网卡,只有在激活状态的网卡才能去连接网络,进行网络通讯。
之后重启虚拟机即可。
2.4.安装 SSH 连接工具
- SSH (Secure Shell),建立在应用层基础上的安全协议。
- 常用的 SSH 连接工具
- putty
- secureCRT
- xshell
- finalshell
- 通过 SSH 连接工具就可以实现从本地连接到远程的 Linux 服务器。
2.5.使用 FinalShell 连接到 Linux
- 课程中使用的软件时 FinalShell,资料中也都有提供。
- 直接按照提示安装就行,非常简单。
安装好 finalshell 之后,如下图操作即可。
这里输入我们之前查到的 ip 地址。
最后单击一下这个就行。
连接成功。
2.6.Linux 和 Windows 目录结构对比
- Linux系统中的目录
- / 是所有目录的顶点
- 目录结构像一颗倒挂的树
2.7.Linux 目录介绍
- bin 存放二进制可执行文件
- boot 存放系统引导时使用的各种文件
- dev 存放设备文件
- etc 存放系统配置文件
- home 存放系统用户的文件
- lib 存放程序运行所需的共享库和内核模块
- opt 额外安装的可选应用程序包所放置的位置
- root 超级用户目录
- sbin 存放二进制可执行文件,只有 root 用户才能访问
- tmp 存放临时文件
- usr 存放系统应用程序
- var 存放运行时需要改变数据的文件,例如日志文件
3.Linux 常用命令
3.1.Linux 命令初体验
3.1.1.几个常用命令
| 序号 | 命令 | 对应英文 | 作用 |
|---|---|---|---|
| 1 | ls | list | 查看当前目录下内容 |
| 2 | pwd | print work directory | 查看当前目录 |
| 3 | cd [目录名] | change directory | 切换目录 |
| 4 | touch [文件名] | touch | 若文件不存在,则新建文件 |
| 5 | mkdir | make directory | 创建目录 |
| 6 | rm [文件名] | remove | 删除指定文件 |
3.1.2.注意事项
在执行 Linux 命令时,若提示信息显示为乱码,一般多为编码问题导致。
只需要修改 Linux 的编码即可
- 把 'LANG="en_us.UTF-8"' 追加到 /etc/profile 中去。
echo 'LANG="en_us.UTF-8"' >> /etc/profile
- 重新加载配置文件,使得新增的配置生效
source /etc/profile
3.1.3.使用技巧
- Tab 键自动补全
- 连续两次 Tab 键,给出操作提示
- 使用上下箭头快速调出曾经使用过的命令
- 使用 clear 命令或者 Ctrl + l 快捷键实现清屏
3.1.4.命令格式
command [-options] [parameter]
命令格式的说明
- command:命令名
- [-options]:选项,可用来对命令进行控制,也可以省略
- [parameter]:传给命令的参数,可以是零个、一个或者多个
- 其中 [] 代表可选,且命令名 ,选项 ,参数之间需用空格进行分隔
3.2.文件目录操作命令
3.2.1.ls
- 作用:显示指定目录下的内容
- 语法:ls [-al] [dir]
- 说明
- -a 显示所有文件及目录(像 .文件名 这样的 隐藏文件 也会列出)
- -l 除文件名称外,同时将文件型态(d 表示目录,- 表示文件)、权限、拥有者、文件大小等信息详细列出
- 注意:由于我们使用 ls 命令时经常需要加入 -l 选项,所以 Linux 为 ls -l 命令提供了一种简写方式,即 ll
3.2.2.cd
- 作用:用于切换当前工作目录,即进入指定目录
- 语法:cd [dirName]
- 特殊说明
- ~ 表示当前用户的 home 目录
- 不同用户的 home 目录可能不同,Linux 中的 root 用户的 home 目录即为 /root
- . 表示目前所在的目录
- .. 表示目前目录位置的上级目录
- ~ 表示当前用户的 home 目录
- 举例
- cd ..:切换到当前目录的上级目录
- cd ~:切换到用户的 home 目录
- cd /usr/local: 切换到 /usr/local 目录
3.2.3.cat
- 作用:用于显示文件内容
- 语法:cat [-n] filaName
- 说明: -n 表示由 1 开始对所有输出行数编号
- 举例:cat /etc/profile 查看 /etc 目录下的 profile 文件内容
3.2.4.more
- 作用:以分页的形式显示文件内容
- 语法:more fileName
- 操作说明:
- 回车键:向下滚动一行
- 空格键:向下滚动一屏
- b:返回上一屏
- q 或者 Ctrl + C:退出 more
- 举例:more /etc/profile:以分页方式显示 /etc 目录下的 profile 文件内容
3.2.5.tail
- 作用:查看文件末尾的内容
- 语法:tail [-f] fileName
- 说明
- -f:动态读取文件末尾内容并显示,通常用于日志文件的内容输出
- 举例
- tail /etc/profile:显示 /etc 目录下的 profile 文件末尾 10 行的内容
- tail -20 /etc/profile:显示 /etc 目录下的 profile 文件末尾 20 行的内容
- tail -f /itcast/my.log:动态读取 /itcast 目录下的 my.log 文件末尾内容并显示
- 操作说明
- tail [-f] fileName 动态读取时会霸屏,使用 Ctrl + C 退出即可。
3.2.6.mkdir
- 作用:创建目录
- 语法:mkdir [-p] dirName
- 说明
- -p:确保目录名称存在,不存在的就创建一个。通过此选项,可以实现多层目录同时创建。
- 举例
- mkdir itcast:在当前目录下,建立一个名为 itcast 的子目录
- mkdir-p itcast/test
- 在工作目录下的 itcast 目录中建立一个名为 test 的子目录,若 itcast 目录不存在,则建立一个
3.2.7.rmdir
- 作用:删除空目录
- 语法:rmdir [-p] dirName
- 说明
- -p:当子目录被删除后使父目录为空目录的话,则一并删除
- 举例
- rmdir itcast:删除名为 itcast 的空目录
- rmdir-p itcast/test
- 删除 itcast 目录中名为 test 的子目录。若 test 目录删除后 itcast 目录变为空目录,则也被删除
- rmdir itcast:删除名称以 itcast 开始的空目录
3.2.8.rm
- 作用:删除文件或者目录
- 语法:rm [-rf] name
- 说明
- -r:将目录及目录中所有文件(目录)逐一删除,即递归删
- -f:无需确认,直接删除
- 举例
- rm -r itcast/:删除名为 itcast 的目录和目录中所有文件,删除前需确认
- rm -rf itcast/:无需确认,直接删除名为 itcast 的目录和目录中所有文件
- rm -f hello.txt:无需确认,直接删除 hello.txt 文件
3.3.拷贝移动命令
3.3.1.cp
- 作用:用于复制文件或目录
- 语法:cp [-r] source dest
- 说明
- -r:如果复制的是目录需要使用此选项,此时将复制该目录下所有的子目录和文件
- 举例
- cp hello.txt itcast/:将 hello.txt 复制到 itcast 目录中
- cp hello.txt ./hi.txt:将 hello.txt 复制到当前目录,并改名为 hi.txt
- cp -r itcast/ ./itheimal:将 itcast 目录和目录下所有文件复制到 itheima 目录下
- cp -r itcast
public class JedisTest {
@Test
public void testRedis(){
//1.获取连接
Jedis jedis = new Jedis("localhost",6379);
//2.执行具体的操作
jedis.set("username","xiaoming");
String value = jedis.get("username");
System.out.print("username:");
System.out.println(value);
//jedis.del("username");
jedis.hset("myhash","addr","bj");
String hValue = jedis.hget("myhash", "addr");
System.out.print("key:myhash,field:addr,value:");
System.out.println(hValue);
Set
keys = jedis.keys("*"); for (String key : keys) { System.out.println(key); } //3.关闭连接 jedis.close(); } }
- 控制台输出结果
7.3.Spring Data Redis
7.3.1.简单介绍
- 在 Spring Boot 项目中,可以使用 Spring Data Redis 来简化 Redis 操作。
- 相关 maven 坐标
org.springframework.boot spring-boot-starter-data-redis
- Spring Data Redis 中提供了一个高度封装的类:RedisTemplate
- 其针对 jedis 客户端中大量 api 进行了归类封装,并将同一类型操作封装为 operation 接口
- operation 接口的具体分类如下
- ValueOperations:简单 K-V 操作
- setOperations:set 类型数据操作
- ZSetOperations:zset 类型数据操作
- HashOperations:针对 map 类型的数据操作
- ListOperations:针对 list 类型的数据操作
7.3.2.项目准备工作
- 首先创建好这样的项目结构
- pom.xml
4.0.0 org.springframework.boot spring-boot-starter-parent 2.4.5 com.itheima springdataredis_demo 1.0-SNAPSHOT 1.8 org.springframework.boot spring-boot-starter-test test junit junit org.springframework.boot spring-boot-starter-data-redis org.springframework.boot spring-boot-maven-plugin 2.4.5
- application.yml
resources 目录下的 application.yml
spring: application: name: springdataredis_demo # Redis 相关配置 redis: host: localhost port: 6379 # password: 123456 database: 0 # 操作的是 0 号数据库(redis 默认是一共有 16 个数据库) jedis: # Redis 连接池配置 pool: max-active: 8 # 最大连接数 max-wait: 1ms # 连接池最大阻塞等待时间 max-idle: 4 # 连接池中的最大空闲连接 min-idle: 0 # 连接池中的最小空闲连接
- SpringBoot 项目的启动类 App.java
com/itheima/App.java
package com.itheima; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }
- 配置类:RedisConfig.java
使用 springboot 整合 redis 的专用客户端接口操作
此处使用的是 SpringBoot 框架提供的 RedisTemplate
RedisTemplate 在处理 key 和 value 时,会对其进行序列化操作
这就会导致一些问题。
比如:输入的 key 值是 city,但 redis 获得到的 key 值却是 xac]xedx00x05tx00x04city。
此处提供了一个配置类,来专门处理 RedisTemplate 默认的序列化处理所导致的问题
com/itheima/config/RedisConfig.java
package com.itheima.config; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration public class RedisConfig extends CachingConfigurerSupport { @Bean public RedisTemplate其实使用 stringRedisTemplate 也可以解决这个问题,而且可以和客户端同步。
不过 stringRedisTemplate 只能存储 string 类型的数据。
- 测试类:SpringDataRedisTest.java
com/itheima/test/SpringDataRedisTest.java
package com.itheima.test; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.connection.DataType; import org.springframework.data.redis.core.*; import org.springframework.test.context.junit4.SpringRunner; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; @SpringBootTest @RunWith(SpringRunner.class) public class SpringDataRedisTest { @Autowired private RedisTemplate redisTemplate; }
7.3.3.string 类型数据操作
com/itheima/test/SpringDataRedisTest.java
@Test public void testString() { redisTemplate.opsForValue().set("city123", "beijing"); String value = (String) redisTemplate.opsForValue().get("city123"); System.out.println(value); //设置值的同时,指定超时时间 redisTemplate.opsForValue().set("key1", "value1", 10l, TimeUnit.SECONDS); //这里旨在 setNX 的功能 //若设置的 key 值存在,该命令就不生效;反之,则生效 Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city1234", "nanjing"); System.out.println(aBoolean); }最终控制台输出的结果
不过 10 秒后,key1 就不存在了。
有兴趣的话,可以自行去 redis 客户端输入 keys * 命令来查看信息。
7.3.4.hash 类型数据操作
com/itheima/test/SpringDataRedisTest.java
@Test public void testHash() { HashOperations hashOperations = redisTemplate.opsForHash(); //存值 hashOperations.put("002", "name", "xiaoming"); hashOperations.put("002", "age", "20"); hashOperations.put("002", "address", "bj"); //取值 String age = (String) hashOperations.get("002", "age"); System.out.println(age); //获得 hash 结构中的所有字段 Set keys = hashOperations.keys("002"); for (Object key : keys) { System.out.println(key); } //获得 hash 结构中的所有值 List values = hashOperations.values("002"); for (Object value : values) { System.out.println(value); } }idea 控制台输出的结果
7.3.5.list 类型数据操作
com/itheima/test/SpringDataRedisTest.java
@Test public void testList() { ListOperations listOperations = redisTemplate.opsForList(); //存值 listOperations.leftPush("mylist", "a"); listOperations.leftPushAll("mylist", "b", "c", "d"); //取值 System.out.println("【mylist 的值】"); Listmylist = listOperations.range("mylist", 0, -1); for (String value : mylist) { System.out.println(value); } //获得列表长度 llen Long size = listOperations.size("mylist"); int lSize = size.intValue(); System.out.println("【返回 mylist ,且删除掉元素】"); for (int i = 0; i < lSize; i++) { //出队列 String element = (String) listOperations.rightPop("mylist"); System.out.println(element); } } idea 控制台输出的结果
7.3.6.set 类型的数据操作
com/itheima/test/SpringDataRedisTest.java
@Test public void testSet() { SetOperations setOperations = redisTemplate.opsForSet(); //存值 setOperations.add("myset", "a", "b", "c", "a"); //取值 System.out.println("【第一次取值】"); Setmyset = setOperations.members("myset"); for (String o : myset) { System.out.println(o); } //删除成员 setOperations.remove("myset", "a", "b"); System.out.println("【第二次取值】"); //取值 myset = setOperations.members("myset"); for (String o : myset) { System.out.println(o); } } idea 控制台输出的结果
7.3.7.zset 类型的数据操作
com/itheima/test/SpringDataRedisTest.java
@Test public void testZset() { ZSetOperations zSetOperations = redisTemplate.opsForZSet(); //存值 zSetOperations.add("myZset", "a", 10.0); zSetOperations.add("myZset", "b", 11.0); zSetOperations.add("myZset", "c", 12.0); zSetOperations.add("myZset", "a", 13.0); //取值 System.out.println("[第一次取值]"); SetmyZset = zSetOperations.range("myZset", 0, -1); for (String s : myZset) { System.out.println(s); } //修改分数 zSetOperations.incrementScore("myZset", "b", 20.0); //取值 System.out.println("[第二次取值]"); myZset = zSetOperations.range("myZset", 0, -1); for (String s : myZset) { System.out.println(s); } //删除成员 zSetOperations.remove("myZset", "a", "b"); //取值 System.out.println("[第三次取值]"); myZset = zSetOperations.range("myZset", 0, -1); for (String s : myZset) { System.out.println(s); } } idea 控制台输出的结果
7.3.8.通用的数据类型操作
com/itheima/test/SpringDataRedisTest.java
@Test public void testCommon() { //获取 Redis 中所有的 key System.out.println("[keys *]"); Setkeys = redisTemplate.keys("*"); for (String key : keys) { System.out.println(key); } //判断某个 key 是否存在 System.out.println("[exists key]"); Boolean itcast = redisTemplate.hasKey("itcast"); System.out.println(itcast); //删除指定 key redisTemplate.delete("myZset"); //获取指定 key 对应的 value 的数据类型 System.out.println("[type key]"); DataType dataType = redisTemplate.type("myset"); System.out.println(dataType.name()); } idea 控制台输出的结果



