LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

Linux,Redis,Jedis

2023/11/15 后端

Linux基础入门

Linux操作系统

  • 介绍Linux与CentOS
  • 讲解Linux基础
  • Linux文本工具与命令
  • yum应用安装与卸载
  • CentOS的权限与系统安全
  • 部署OA项目至Linux服务器

主流操作系统

不同领域的主流操作系统,主要分为以下这么几类: 桌面操作系统、服务器操作系统、移动设备操作系统、嵌入式操作系统。接下来,这几个领域中,代表性的操作系统是那些?

1). 桌面操作系统

操作系统 特点
Windows 用户数量最多
MacOS 操作体验好,办公人士首选
Linux 用户数量少(桌面操作系统,Linux使用较少)

2). 服务器操作系统

操作系统 特点
Unix 安全、稳定、付费
Linux 安全、稳定、免费、占有率高
Windows Server 付费、占有率低

3). 移动设备操作系统

操作系统 特点
Android 基于 Linux 、开源,主要用于智能手机、平板电脑和智能电视
IOS 苹果公司开发、不开源,用于苹果公司的产品,例如:iPhone、 iPad

4). 嵌入式操作系统

操作系统 特点
Linux 机顶盒、路由器、交换机

2.2 Linux系统版本

Linux系统的版本分为两种,分别是: 内核版 和 发行版。

1). 内核版

  • 由Linus Torvalds及其团队开发、维护

  • 免费、开源

  • 负责控制硬件

2). 发行版

  • 基于Linux内核版进行扩展

  • 由各个Linux厂商开发、维护

  • 有收费版本和免费版本

我们使用Linux操作系统,实际上选择的是Linux的发行版本。在linux系统中,有各种各样的发行版本,具体如下:

发行版本 Logo 特点
Ubuntu image-20210809001838861 以桌面应用为主
RedHat image-20210809001731378 应用最广泛、收费
CentOS image-20210809001741238 RedHat的社区版、免费
openSUSE image-20210809001750999 对个人完全免费、图形界面华丽
Fedora image-20210809001800676 功能完备、快速更新、免费
红旗Linux image-20210809001814942 北京中科红旗软件技术有限公司开发

除了上述罗列出来的发行版,还有很多Linux发行版,这里,我们就不再一一列举了。

什么是操作系统

  • 操作系统(Operating System)是应用程序运行的基础支撑环境
  • 操作系统作用是管理和控制计算机系统的硬件与软件资源
  • Intel x86架构上常见的操作系统:Windows、Linux、Unix…

Linux操作系统

  • Linux是开源的基于Inter x86架构的类Unix多用户操作系统
  • 支持多任务、多用户、多CPU
  • 高效而灵活
  • 兼容任意x86架构计算机
  • 强大易用的系统命令
  • 完整的应用软件生态

Linux发行版本

  • Linux系统内核(kernel)提供了Linux操作系统的核心功能
  • 不同开发商在内核基础上扩展封装,形成了不同发行版本
  • 常见发行版:Red Hat Linux、CentOS、Ubuntu、SUSE…

Linux发行版选择建议

  • 桌面系统:Ubuntu
  • 服务器操作系统:**CentOS(免费)**、Red Hat Linux(收费)
  • 特定需求:Debian(稳定性)、Fedoras(新特性)、麒麟Linux(国产)

CentOS - 社区企业操作系统

  • 基于Red Hat Enterprice Linux的开源企业级Linux发行版本
  • 各版本CentOS都会获得十年的支持,与RHEL保持同步更新
  • CentOS采用社区支持,同步修正了RHEL许多BUG

CentOS版本选择

  • CentOS 5/6:历史淘汰版本
  • CentOS 7:主流版本,成熟稳定,大多数服务器的首先版本
  • CentOS 8:全新版本,全新内核,存在漏洞隐患

安装CentOS 7.7

vmware.com/cn.html

VMware-workstation-full-14.1.2-8497320.exe
[链接: https://pan.baidu.com/s/1EbuhZ4D4kh_NcRJqTA-vhQ
密码:oq37]

mirrors.aliyun.com/centos/7.7.1908/isos/x86_64/ 下载 Everything-1908.iso
[centos-vault-centos-7.7.1908-isos-x86_64安装包下载_开源镜像站-阿里云 (aliyun.com)]

VM典型 镜像Iso 存储地址放在最快的硬盘 将虚拟磁盘存储为单个文件 自定义(内存2GB 处理器2核 虚拟化 Intel VT-x)

Linux目录结构

根目录/ 下各个目录的作用及含义说明:

编号 目录 含义
1 /bin 存放二进制可执行文件
2 /boot 存放系统引导时使用的各种文件
3 /dev 存放设备文件
4 /etc 存放系统配置文件
5 /home 存放系统用户的文件
6 /lib 存放程序运行所需的共享库和内核模块
7 /opt 额外安装的可选应用程序包所放置的位置
8 /root 超级用户目录
9 /sbin 存放二进制可执行文件,只有root用户才能访问
10 /tmp 存放临时文件
11 /usr 存放系统应用程序
12 /var 存放运行时需要改变数据的文件,例如日志文件

Linux命令格式

命令 [参数选项] [文件或路径]
Linux文件操作核心命令
命令 用途
cd 切换目录
pwd 查看当前目录
ls、ll(详细列表) 显示目录内容
mkdir 创建目录
cp 复制文件与目录
mv 移动或重命名文件
rm 删除文件或目录
find 查找目录或文件

Xshell连接虚拟机详细教程-CSDN博客

按下Tab可以自动提示
输入su 密码root 进入root最高权限

cd ..                 返回上级目录
cd ./local             ./代表当前目录
cd local            到当前目录    

mkdir ./imooc
mkdir -p ./imooc/sample/demo       -p是连续创建多级目录

mkdir -p ./imooc1/sample1
mkdir -p -v./imooc1/sample1     -v是显示执行过程
mkdir -p -v./imooc1/sample1/demo1
=
mkdir -pv ./imooc1/sample1
    
cp Xftp-7.0.014lp.exe ./imooc/sample/demo 文件复制到指定目录
cp -r imooc/sample/demo imooc1/sample1/demo1 复制整个文件夹

cd imooc/sample/demo
mv Xftp-7.0.014lp.exe xftp.exe 重命名
ls

mv xftp.exe /imooc1/sample1/demo1 移动到其他目录
mv demo imooc1/sample1/demo1 移动文件夹到其他目录

cd game/share
rm -r music  y y y    依次删除文件夹中的文件
rm -f music 强制直接删除, 不经过询问
rm -rf music 强制迭代删除            【不要轻易使用】
【ex】 rm -rf / imooc/sample/demo 中间不小心加了空格 就把/后面的整个都删除了

find / -name *.exe 按指定的格式去搜索文件
cd ..
[root@imooc home] find / -name *

vim文本编辑器

远程在线文本编辑器
  • vi是linux重要的文字编辑工具,vim是增强版
  • vim用于在远程环境下用命令形式对文本进行在线编辑
  • 用法格式:vim [选项] [文件]

vim三种模式

  • 普通模式:默认模式,文本只读,不可编辑
  • 编辑模式:编辑文本模式,普通模式按i键进入,ESC键退出
  • 命令模式:执行保存、搜索、退出等操作

vim重要快捷键

i进入编辑模式

命令 用途
delete或x 删除单个字符
dd 删除整行
/str 全文查找str字符串,n下一个,N前一个
:% s/old/new/g 替换文件内所有old字符串为new
u 撤销最近一次操作
:wq或者**:wq!** 退出并保存,只读文件要格外加!
:q! 强制退出放弃保存
vim server.xml         修改文件
按i进入编辑模式
Home跳转行首
End跳转行尾
Esc退出编辑模式

命令只允许在普通模式下运行
/8080                     查找端口(高亮显示)
查找到后按n是查找下一个 按N是查找上一个
u  撤销最近一次操作
:% s/8080/8900/g        进行端口的全局替换
:% s/"80"/8900/g         想要把80改成8900 且不影响其他数值[把引号也加入其中]

Linux文本工具

常用文本工具
命令 用途
echo 屏幕打印与文本输出 后面要加引号”hello”
cat 合并文件或查看文件内容
tail 显示文件内容尾部
grep 文本过滤工具
echo "hello" > hello.txt 将左侧命令的结果重写到右侧文件
vim hello.txt
:q        退出

echo "hello" >> hello.txt 内容的追加

cat hello.txt 直接打印到控制台
cat -n hello.txt  -n是在每一行前加行号
cat -nE hello.txt  结尾的时候显示结束符$

echo "hello" > hello.txt
cat hello.txt  => hello
echo "my name is lili" > myname.txt
cat hello.txt myname.txt >> full.txt    合并文件内容为新的文件    
vim full.txt
echo 和 cat 在实际开发中 打印日志 最后用cat拼接日志

cat > test.txt << EOF   在当前的输入环境中产生输入流 输入的全输入到test.txt 输入流结束字符串是EOF
> Welcome to imooc.com
> I like linux
> bye!
> EOF

tail处理日志很方便 bug日志
tail full.txt => hello       my name is lili
tail -n 1 full.txt => my name is lili   "1"代表显示文本最后一行
tail -f full.txt      对文件进行监听 一旦产生变化就输出控制台【适合用在服务器】
ctrl + c 退出

#cat test.txt
=> welcome to imooc.com
=> I like linux
=> bye!
#grep l test.txt
we"l"come to imooc.com
I "l"ike "l"inux

#grep l test.txt > out.txt            符合条件的可以输出到out.txt文件中
#grep -v l test.txt                    -v 挑选出不包含l的test.txt文件
#grep i...c test.txt                "."代表匹配任意字符

#ll | grep .txt                     通道特殊使用方法:筛选出后缀是.txt的 
前面ll命令输出的结果会作为后面gerp命令的依据   通过|进行分割 

#ll | grep -E "log[0-9]{1,5}.txt"    通道特殊使用方法:扩展正则表达式
-rw-r--r--. 1 root root 3 12月 23 13:10 log1.txt
-rw-r--r--. 1 root root 3 12月 23 13:10 log2.txt
-rw-r--r--. 1 root root 3 12月 23 13:10 log3.txt

文件打包[文件组织]与压缩[磁盘节省]

Linux压缩程序-gzip
  • gzip是Linux系统的文件压缩程序
  • gzip压缩包文件扩展名 .gz
  • 大流量的网站默认都在使用 gzip 进行数据压缩传输
tar打包与压缩
  • tar是linux系统将多个文件打包和压缩的工具
  • tar本质的打包软件,扩展名是 **.tar **
  • tar可结合gzip或其他压缩工具实现打包压缩,扩展名 .tar.gz
  • 压缩命令:tar zcvf tomcat.tar.gz game/src
  • 解压缩命令:tar zxvf tomcat.tar.gz -C game/src

tar常用可选项

选项 用途
z 通过gzip压缩或解压
c 创建新的tar.gz文件
v 显示执行过程
f 指定压缩文件名称
x 解压缩tar.gz文件
-C 指定解压缩目录

安装与卸载应用程序

为CentOS安装应用程序
  • 在CentOS中安装第三方应用程序包含两种方式
    • rpm: Red Hat 软件包管理器, 相当于应用程序安装文件的执行者
    • 编译安装:用户自己从网站下载程序源码进行编译安装

yum与rpm的关系

  • rpm安装过程中, 需要用户自己解决依赖问题
  • yum通过引入软件仓库,联网下载rpm包及依赖,并依次自动安装
  • yum是rpm的前端程序,其目的就是简化rpm的安装过程
yum常用命令
  • yum search 应用名 #在仓库中查询是否存在指定应用
  • yum instal -y 应用名 #全自动下载安装应用及依赖
  • yum info 应用名 #查看应用详细信息
  • yum list installed 应用名 #查看已安装的应用程序
  • rpm -ql 应用名 #查看安装后输出的文件清单
  • yum remove -y 应用名 #全自动卸载指定应用
① 利用yum安装tree
yum search tree
yum install tree.x86_64 安装tree
yum install -y tree.x86_64 遇到所有的默认y进行安装
tree -d 或 tree                查看文件树型结构
which tree                     查看刚刚tree安装的目录
rpm -ql tree.x86_64         查看刚刚tree安装了哪些文件
yum list installed          查看已经安装的应用
yum list installed *tree*   查看已安装的应用其中有tree的
    
yum remove tree.x86_64  卸载程序
② 利用编译方式安装应用程序
  • 如yum仓库未提供rpm,往往需要采用编译安装方式
  • 编译安装是指从应用网站下载源码后,对源码进行编译后使用
  • 编译命令:**make #**使用对应编译器对源码编译生成可执行文件
yum与编译安装的比较
yum安装 编译安装
兼容性 差,每种发行版都要准备 好,全平台适用
复杂度 简单 复杂
安装速度
来源 应用仓库 官网下载
应用场景 日常系统软件 开源软件,最新版本

编译安装Redis[非关系型数据库]

# make
# yum install -y gcc
# cd ..
# clear
# rm -rf ./redis-4.0.14
# tar zxvf redis-4.0.14.tar,gz
# cd redis-4.0.14/
# clear
# make

[root@imooc redis-4.0.14]# ./src/redis-server redis.conf

Linux系统管理命令

使用 ifconfig 查看网卡ip

netstat 查看网络端口号

  • netstat -tulpn 或者 netstat -ano

    • netstat 常用选项

      选项 用途
      t 显示tcp传输协议的连接状况
      u 显示udp传输协议的连接状况
      l 显示处于监听状态的网络连接
      p 显示应用PID和程序名称
      n 显示ip地址
      a 显示所有连接
      o 显示计时器

查看进程 & 杀掉进程

  • ps -ef
    # ps -ef | grep vim ‘|’代表通道
  • **kill -9 PID ** 专门按照pid杀死指定进程(强制删除)
#ps -ef | grep redis
#netstart -tulpn | grep 6379

应用服务化

  • 应用服务化是指让应用程序以服务方式在系统后台运行
  • Linux系统对服务化应用进行统一管理
  • 服务管理命令:systemctl
指令 用途
start 启动服务
stop 停止服务
restart 重启服务
enable 设置开机启动
disable 禁止开机启动
status 查看服务状态
daemon-reload 重载服务配置文件
list-unit-files 列出所有服务
启动redis
./src/redis-server redis.conf  进入到redis安装目录下执行
ctrl + z 
#ps -ef | grep redis

#find / -name *.pid

cd.. cd.. cd.. 
cd usr/lib/systemd/system 
#pwd
=>/usr/lib/systemd/system 
#vim redis.service 按i进入编写模式
=>
<==========================================================================>
[Unit]
Description=Redis
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking                    #描述服务类型:后台运行
PIDFile=/run/redis_6379.pid     #指向刚刚继承编号的pid
ExecStart=/usr/local/redis-4.0.14/src/redis-server /usr/local/redis-4.0.14/redis.conf                                 #服务启动时使用什么命令 调用redis-server
ExecStop=/bin/kill -s QUIT $MAINPID 
                                #对指定的命令关闭 $后自动带入pidfile  -s quit是按正常流程关闭
PrivateTmp=true
            
[Install]
WantedBy=multi-user.target         #将radis分配到multi-user.target服务组上[随系统自动启动]
<==========================================================================>
[root@imooc system]#systemctl daemon-reload   对所有redis进行重载

[root@imooc system]#ps -ef | grep redis  
[root@imooc system]#kill -s QUIT #杀死所有redis进程测试能否实现自启动
[root@imooc system]#systemctl start redis
[root@imooc system]#systemctl status redis

https://www.cnblogs.com/niway/p/15346572.html

[root@imooc system]#systemctl stop redis  #停止服务
[root@imooc system]#systemctl enable redis #随着系统启动
[root@imooc system]#systemctl list-unit-files #查看系统中每一个服务命令
[root@imooc system]#systemctl list-unit-files | grep enabled #查看自启动的命令

[root@imooc system]#shutdown -r now   #断开连接

Linux用户与权限

用户
  • Linux是多用户多任务系统,包含两个概念:用户用户组
  • 用户与账户是同一概念,用于登录系统与区分资源权限
  • 用户让系统变的更安全,同时也保护了用户的个人数字资产
用户组
  • 用户组就是将用户分组,隶属用户自动拥有组权限
  • 一个用户可隶属于多个组,用户可任意切换当前组
  • 用户组的出现让用户权限管理变更轻松
用户与用户组的常用命令
命令 用途
useradd 创建新用户
passwd 修改密码
usermod 修改用户信息/分配组 (覆盖原组)
groupadd 创建新的用户组
chown 更改文件的属主或属组
chmod 更改文件的访问权限
newgrp 切换用户当前组

项目内部文件权限管理实践

3员工(2个程序员 1个测试员)
[root@imooc imooc]# adduser d1
[root@imooc imooc]# adduser d2
[root@imooc imooc]# adduser t1
[root@imooc imooc]# passwd d1 => shuangyu1
[root@imooc imooc]# passwd d2 => shuangyu2
[root@imooc imooc]# passwd t1 => shuangyu3
[root@imooc imooc]# groupadd developer
[root@imooc imooc]# groupadd testor
[root@imooc imooc]# usermod -g developer d1
[root@imooc imooc]# usermod -g developer d2
[root@imooc imooc]# usermod -g testor t1
在上方点击打开 并且复制3个Centos7 分别改用户名(d1 d2 t1)和密码(shuangyu1/2/3) 
[root@imooc imooc]# cd
[root@imooc ~]# cd /usr/local/share
[root@imooc share]# mkdir dev-document
[root@imooc share]# ll
drwxr-xr-x.  2 root root  28 11月 15 18:37 applications
drwxr-xr-x.  2 root root   6 12月  3 20:36 dev-document
drwxr-xr-x.  2 root root   6 4月  11 2018 info
drwxr-xr-x. 21 root root 243 11月 15 18:25 man
【前方的drwxr-xr-x 含义见图】

[root@imooc share]# chown d1:developer dev-document  更改对应目录文件的属主(由超级管理员交給研发组) d1可以对developer拥有完整的操作权限 developer以外的用户有读取执行权 其他用户 只有执行权
drwxr-xr-x.  2 root root       28 11月 15 18:37 applications
drwxr-xr-x.  2 d1   developer   6 12月  3 20:36 dev-document
drwxr-xr-x.  2 root root        6 4月  11 2018 info
drwxr-xr-x. 21 root root      243 11月 15 18:25 man

[root@imooc share]# chmod 750 dev-document/ 其他用户不允许任何权限
[root@imooc share]# ll
总用量 0
drwxr-xr-x.  2 root root       28 11月 15 18:37 applications
drwxr-x---.  2 d1   developer   6 12月  3 20:36 dev-document
drwxr-xr-x.  2 root root        6 4月  11 2018 info
drwxr-xr-x. 21 root root      243 11月 15 18:25 man

返回到Centos 7 - t1
[t1@imooc ~]$ cd /usr/local/share/dev-document/
-bash: cd: /usr/local/share/dev-document/: 权限不够
返回到Centos 7 - d2
[d2@imooc ~]$ cd /usr/local/share
[d2@imooc share]$ mv dev-document/ doc
mv: 无法将"dev-document/" 移动至"doc": 权限不够


上方的chmod 750 的意思是 对应下方的表 第一个7是第一个rwx相加之和4+2+1
====================chmod命令====================
★ chmod 750:组用户可读写,其他用户不允许访问 ★        
★ chmod 777:所有用户拥有完整权限 ★
★ chmod 700:只有属主拥有完整权限 ★
====================++++++++====================
d1弄个文档整个公司的所有人都可以使用
[d1@imooc ~]$ cd /usr/local/share/dev-document/
[d1@imooc dev-document]$ vim code.md
[d1@imooc dev-document]$ ll
-rw-r--r--. 1 d1 developer 13 12月  3 20:59 code.md
第一个是d则是文件夹 -则是文件 属主可以对文件读写。组仅仅可以读取。其他人仅仅可以读取
[d1@imooc dev-document]$ chmod 770 code.md
[d1@imooc dev-document]$ ll
总用量 4
-rwxrwx---. 1 d1 developer 13 12月  3 20:59 code.md
d2即可读写
[d2@imooc dev-document]$ vim code.md

如何让d1同时拥有两个组
[root@imooc share]# usermod -G developer,testor d1
[root@imooc share]# groups d1
d1: developer testor

将当前组切换到新的用户组上
[d1@imooc ~]$ newgrp testor
[d1@imooc ~]$ groups
d1:testor developer

sudo获取超级管理员权限

  • sudo可以让普通用户拥有超级管理员的执行权限
  • 普通用户要经过超级管理员授权才能使用
  • 授权命令:visudo
在root端输入 visudo 并且输入100gg 快速定位到100行
[root@imooc ~]#visudo
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
d1        ALL=(ALL)        ALL     #按i进入编辑模式且增加此行
        ↑:ALL任意电脑可以连接    后ALL可以切换其他用户执行命令   后后ALL允许哪些命令
ESC退出模式后输入
[root@imooc imooc]# visudo -c
/etc/sudoers:解析正确


[d1@imooc ~]$ useradd d3    #目前还没有权限
useradd: Permission denied.
useradd:无法锁定 /etc/passwd,请稍后再试。
[d1@imooc ~]$ sudo useradd d3     #以d1的身份給d3一个超级管理员的权限
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:

    #1) 尊重别人的隐私。
    #2) 输入前要先考虑(后果和风险)。
    #3) 权力越大,责任越大。

[sudo] d1 的密码:=》 shuangyu1
[d1@imooc ~]$ sudo passwd d3 
更改用户 d3 的密码 =》 shuangyu33

回到主Centos 7
[root@imooc ~]#visudo
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
d1      ALL=(ALL)       NOPASSWD:ALL
NOPASSWD:ALL意味着做任何命令之前不用输入密码

[d1@imooc ~]$ sudo useradd d4
[d1@imooc ~]$                     #直接不需要输入密码了

CentOS7防火墙firewall

防火墙
  • 防火墙是借助硬件和软件对内外部网络环境的保护措施
  • CentOS 7基于firewall实现应用层防火墙,CentOS6基于iptables
  • firewall-cmd是firewall的核心命令
对外开放Tomcat
把apache-tomcat.tar.gz放入/usr/local中 
[root@imooc local]# tar zxvf apache-tomcat-9.0.34.tar.gz
[root@imooc local]# ll
[root@imooc local]# cd apache-tomcat-9.0.34/
[root@imooc apache-tomcat-9.0.34]# cd bin
[root@imooc bin]# ./startup.sh
[root@imooc bin]# ./startup.sh
Using CATALINA_BASE:   /usr/local/apache-tomcat-9.0.34
Using CATALINA_HOME:   /usr/local/apache-tomcat-9.0.34
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-9.0.34/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/apache-tomcat-9.0.34/bin/bootstrap.jar:/usr/local/apache-tomcat-9.0.34/bin/tomcat-juli.jar
Tomcat started.
[root@imooc bin]# netstat -tulpn|grep 8080  #查看端口是否开启
tcp6    0    0 :::8080        :::*         LISTEN      4302/java  
在虚拟机内部去fox浏览器搜索 localhost:8080  就会看到可爱的绿色小猫咪
    
若想在计算机中访问端口 192.168.170.129:8080 则需要关闭虚拟机的防火墙
[root@imooc bin]# firewall-cmd --state   #查看防火墙状态
running
[root@imooc bin]# firewall-cmd --list-ports #查看防火墙放行的端口(空代表无任何放行端口)
[root@imooc bin]# firewall-cmd --zone=public --permanent --add-port=8080/tcp
#### zone防火墙定义的规则区域、产生永久变更、增加端口8080、tcp形式
[root@imooc bin]# firewall-cmd --reload  #进行配置重载

若不需要开放8080端口则需要
[root@imooc bin]# firewall-cmd --zone=public --permanent --remove-port=8080/tcp
[root@imooc bin]# firewall-cmd --reload  #进行配置重载

[root@imooc bin]# firewall-cmd --zone=public --permanent --add-port=8000-9000/tcp 
###放行区域端口
[root@imooc bin]# firewall-cmd --reload  #进行配置重载

Bash Shell

  • Shell是一个用c语言编写的脚本解释器,是用户通过代码操作Linux的桥梁
  • Shell脚本描述要执行的任务,完成系列复杂操作,文件通常以**.sh**后缀
  • Shell脚本通过Shell解释器执行,按解释器分类分为多种类型

Linux Shell分类

Shell种类 Shell解释器
Bourne Shell /usr/bin/sh 或 /bin/sh
Boourne Again Shell /bin/bash(默认)
C Shell /usr/bin/csh
K Shell /usr/bin/ksh
Shell for Root /sbin/sh
一键发布Tomcat应用程序
编写shall脚本
[root@imooc local]# vim deploy_tomcat.sh
======================================================================
echo "准备下载Tomcat9"
wget https://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.34/bin/apache-tomcat-9.0.34.tar.gz
echo "正在解压缩Tomcat9"
tar zxf apache-tomcat-9.0.34.tar,gz
echo "防火墙开放8080端口"
firewall-cmd --zone=public --permanent --add-port=8080/tcp
firewall-cmd --reload
echo "启动Tomcat"
cd ./apache-tomcat-9.0.34/bin
./startup.sh
======================================================================
[root@imooc local]# ./deploy_tomcat.sh        开启文件

综合训练:Linux部署慕课网办公OA

部署架构:Chrome + Tomcat Web服务器 + MySQL服务器 【中间通过网络通信】
重新安装CentOS 7-DB【最小值安装】
[root@localhost ~]# yum install -y net-tools
CentOS 7-DB        ifconfig ==》 192.168.170.131    账户:centos-db 密码:panchunyao123
CentOS 7-WEB    ifconfig ==》 192.168.170.133    账户:centos-web 密码:panchunyao123
DB按照MySQL
WEB按照Tomcat

CentOS安装MySQL 8

查找有没有mysql安装包
[centos-db@localhost ~]$ yum search mysql-community
去官网找到Linux版的 右键复制链接地址
[root@localhost ~]# wget https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm
bash: wget: command not found
卧槽 wegt不存在,那就按装wget
[root@localhost ~]# yum install -y wget
[root@localhost mysql]# ll
total 16
-rw-r--r--. 1 root root 14064 Oct 24 07:44 mysql80-community-release-el7-11.noarch.rpm

[root@localhost mysql]# yum localinstall -y mysql80-community-release-el7- 11.noarch.rpm     #自动安装mysql源
[root@localhost mysql]# yum search mysql-comm #此时查找一下就会出现大量mysql组件
[root@localhost mysql]# yum install -y mysql-community-server #安装mysql{在欧美很慢}
ctrl+c 停止安装
[root@localhost mysql]# cd /var/cache/yum/x86_64/7/mysql80-community/packages/
#yum下载的缓存路径 在网上下载好后Linux版的MySQL后 进入

[root@localhost mysql80-community]  /var/cache/yum/x86_64/7/mysql80-community
用命令更改文件夹权限:chmod 777 test01(需要赋予权限的文件夹)
之后将解压缩的MySQL拖进去

注意:如果直接下载 yum localinstall mysql80-community-release-el7- 11.noarch.rpm  的话会有很多依赖不会被自动下载,最保准的就是去网上下载Linux版本的MySQL再利用Xftp拖进去

[root@localhost package]# yum install -y mysql-community-server 【最快最省事 自动下载&安装依赖】
[root@localhost package]# systemctl start mysqld
[root@localhost package]# netstat -tulpn
tcp6    0    0    :::3306        :::*        LISTEM        21850/mysqld
[root@localhost package]# systemctl status mysqld     #查看myql启动状态
[root@localhost package]# systemctl enable mysqld     #设置开机自启动

初始化MySQL[CentOS 7-DB]

查看mysql日志寻找mysql密码
[root@localhost package]# vi /var/log/mysqld.log
root@localhost: Y,#)foTQ,7js
[root@localhost package]# mysql -uroot -p
修改密码!
mysql> alter user 'root'@'localhost' identified with mysql_native_password by 'Panchunyao123!'
mysql> use mysql
mysql> select host,user from user;
mysql> update user set host='%' where user='root'; #任意设备都可使用%连接到mysql服务器
host: %            user: root
mysql> flush privileges; #使修改的权限数据生效
mysql> exit

下一步是放行防火墙3306端口
[root@localhost package]# firewall-cmd --zone=public --permanent --add-port=3306/tcp
[root@localhost package]# firewall-cmd --reload

去电脑端的Navicat Premium 连接新数据库
MySQL-新建连接
连接名:centos-db
主机:192.168.170.131
端口:3306
用户名:root
密码:Panchunyao123!

新建数据库 imooc-oa  utf8mb4 执行sql文件 imooc-oa.sql

部署配置Web应用服务器

CentOS 7-DB        ifconfig ==》 192.168.170.131    账户:centos-db 密码:panchunyao123
CentOS 7-WEB    ifconfig ==》 192.168.170.133    账户:centos-web 密码:panchunyao123
[root@localhost ~]# yum search jdk  #查看仓库中包含哪些jdk
[root@localhost ~]# yum install -y java-1.8.0-openjdk    #安装jdk以及所有依赖
[root@localhost ~]# java -version
[root@localhost ~]# which java      #查看安装到哪个地方
/bin/java
安装tomcat
[root@localhost ~]# cd /usr
用命令更改文件夹权限:chmod 777 local
[root@localhost usr]# cd local
打开Xftp将apache-tomcat-9.0.34.tar.gz 传入到local内
[root@localhost local]# tar zxf apache-tomcat-9.0.34.tar.gz     #对压缩包进行解压
将素材资料里的imooc_oa.war拖入Xftp的local中 之后进行解压
[root@localhost local]# tar zxf imooc_oa.war 
需要将imooc_oa复制到tomcat9的webapps下才可生效
[root@localhost local]# mv imooc_oa ./apache-tomcat-9.0.34/webapps/
[root@localhost local]# cd apache-tomcat-9.0.34/webapps/
[root@localhost webapps]# vim ./imooc_oa/WEB-INF/classes/mybatis-config.xml
#远程对服务器配置连接数据库服务器
-bash: vim: 未找到命令 需要先安装vim
[root@localhost webapps]# yum install -y vim-common
[root@localhost webapps]# yum install -y vim-enhanced  #再安装一个增强的vim包
[root@localhost webapps]# vim ./imooc_oa/WEB-INF/classes/mybatis-config.xml
输入/root 进行全文查找 修改<property 中的value="jdbc:mysql:..." loacalhost改为自己网络ip:192.168.170.131
再修改一下下面的password:  Panchunyao123!
:wq
[root@localhost webapps]# cd ..
[root@localhost apache-tomcat-9.0.34]# vim ./conf/server.xml
/8080 搜索 <Connector port="80" 只保留80端口
/Host> 找到最下面 在上面一行加入
<Context path="/" docaBacs="imooc_oa"/> #将imooc_oa目录映射到根路径"/"
:wq

之后启动tomcat
[root@localhost apache-tomcat-9.0.34]# ./bin/startup.sh
[root@localhost apache-tomcat-9.0.34]# netstat -tulpn  #查看进程
tcp6        0        0 :::80        :::*        LISTEN        20303/java

用防火墙将80端口对外进行暴露
[root@localhost apache-tomcat-9.0.34]# firewall-cmd --zone=public --permanent --add-port=80/tcp
[root@localhost apache-tomcat-9.0.34]# firewall-cmd --reload  #重载

回到电脑浏览器输入:http://192.168.170.133/login.html

数据库安全【根据3306端口可以查到数据库根源】:对指定IP端口进行放行
[root@localhost ~]# firewall-cmd --zone=public --permanent --remove-port=3306/tcp
[root@localhost ~]# firewall-cmd --reload  #重载
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.170.133" port protocol="tcp" port="3306" accept "    #-rich-rule防火墙内部规则强大的定义表达式
[root@localhost ~]# firewall-cmd --reload  #重载
[root@localhost apache-tomcat-9.0.34]# ./bin/shutdown.sh
[root@localhost apache-tomcat-9.0.34]# ./bin/startup.sh


Redis (内存[非常快]数据库、非关系型数据库)

  • Redis是Key-Value型NoSQL数据库
  • Redis将数据存储在内存(RAM)中,同时也能持久化到磁盘
  • Redis常用于缓存,利用内存的高效提高程序的处理速度
Redis特点
  • 速度快
  • 广泛的语言支持
  • 持久化
  • 多种数据结构
  • 主从复制(多台Redis可以保持数据同步)
  • 分布式与高可用(7×24小时服务 淘宝/京东) 全国各地多个主机 降低网络传输时间

Redis的安装与启动

$ wegt http://download.redis.io/releases/redis-5.0.2.tar.gz
$ tar xzf redis-5.0.2.tar.gz
$ cd redis-5.0.2
$ make
[root@imooc imooc]# cd /usr/local
[root@imooc local]# ll
[root@imooc local]# mkdir redis
[root@imooc local]# ll
[root@imooc local]# cd redic
[root@imooc redic]# yum install gcc
[root@imooc redic]# wegt http://download.redis.io/releases/redis-5.0.2.tar.gz
[root@imooc redis]# tar xzf redis-5.0.2.tar.gz
[root@imooc redis]# cd redis-5.0.2
[root@imooc redis-5.0.2]# make
Hint: It's a good idea to run 'make test' ;)   安装成功
[root@imooc redis-5.0.2]# ll  #找redis.conf
总用量 240
-rw-rw-r--.  1 root root 85327 11月 22 2018 00-RELEASENOTES
-rw-rw-r--.  1 root root    53 11月 22 2018 BUGS
-rw-rw-r--.  1 root root  1894 11月 22 2018 CONTRIBUTING
-rw-rw-r--.  1 root root  1487 11月 22 2018 COPYING
drwxrwxr-x.  6 root root   192 12月  5 11:47 deps
-rw-rw-r--.  1 root root    11 11月 22 2018 INSTALL
-rw-rw-r--.  1 root root   151 11月 22 2018 Makefile
-rw-rw-r--.  1 root root  4223 11月 22 2018 MANIFESTO
-rw-rw-r--.  1 root root 20555 11月 22 2018 README.md
-rw-rw-r--.  1 root root 62155 11月 22 2018 redis.conf
-rwxrwxr-x.  1 root root   275 11月 22 2018 runtest
-rwxrwxr-x.  1 root root   280 11月 22 2018 runtest-cluster
-rwxrwxr-x.  1 root root   281 11月 22 2018 runtest-sentinel
-rw-rw-r--.  1 root root  9710 11月 22 2018 sentinel.conf
drwxrwxr-x.  3 root root  8192 12月  5 11:49 src
drwxrwxr-x. 10 root root   167 11月 22 2018 tests
drwxrwxr-x.  8 root root  4096 11月 22 2018 utils
[root@imooc redis-5.0.2]# cd src
[root@imooc src]# ll     #找redis- server启动目录

[root@imooc src]#cd ..
[root@imooc redis-5.0.2]# ./src/redis-server redis.conf
若端口被占用

找到redis-server的进程,然后杀死对应的进程,然后重新启动redis

>>> ps -ef | grep -i redis
root      3585 19590  0 10:36 pts/20   00:00:00 redis-server *:6379
user      3684  3663  0 10:38 pts/21   00:00:00 grep --color=auto -i redis
进程3585是redis的服务,

kill -9 3585
  • 在Windows系统安装Redis
https://github.com/microsoftarchive/redis/releases 下载后解压
打开cmd
C:\Users\Pluminary>d:
D:\>cd Redis-x64-3.0.504
D:\Redis-x64-3.0.504>dir
D:\Redis-x64-3.0.504>redis-server redis.windows.conf
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 3.0.504 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 22828
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

Redis的常用基本配置

配置项 示例 说明
daemonize daemonize yes 是否启用后台运行, 默认no
port port 6379 设置端口号, 默认6379
logfile logfile 日志文件 设置日志文件
databases databases 255 设置redis数据库总量
dir dir 数据文件目录 设置数据文件存储目录
requirepass requirepass 12345 设置使用密码
守护进程方式启动Redis
[root@imooc ~]# cd /usr/local/redis/redis-5.0.2/
[root@imooc redis-5.0.2]# vim redis.conf    #打开后台启动
136行 daemonize no 改成 daemonize yes
[root@imooc redis-5.0.2]# ./src/redis-server redis.conf
关闭终端打开全新终端
[root@imooc ~]# netstat -tulpn
tcp        0        0        127.0.0.1:6379 ...     6338/./src/redis-se

如果关闭
kill -9 6338
redis使用
[root@imooc redis-5.0.2]# ./src/redis-cli    #执行redis内置指令
127.0.0.1:6379> ping        #启动成功
PONG
127.0.0.1:6379> exit        #退出
[root@imooc redis-5.0.2]# ./src/redis-cli shutdown  #更加安全的关闭redis

报错(添加log文件 将redis命令行的结果打印到log中)
https://blog.csdn.net/qq_46127735/article/details/113933690


为了保护安全将port从6379改为6380
[root@imooc redis-5.0.2]# vim redis.conf
/port 寻找92行
port 6380
[root@imooc redis-5.0.2]# ./src/redis-cli -p 6380
127.0.0.1:6380> select 0        #当前使用第几号数据库
127.0.0.1:6380> select 15
[root@imooc redis-5.0.2]# vim redis.conf
在186行 可以改变数据连接数量
databases 15→255
    
[root@imooc redis-5.0.2]# vim redis.conf
507行注释去掉 此行是输入密码
requirepass panchunyao123
再次登录就 
127.0.0.1:6380> auth panchunyao123

redis中有一个dump.rdb 全量备份 同时备份到磁盘中

Redis通用命令

命令 示例 说明
select select 0 选择0号数据库
set set name lily 设置key=name, value=lily
get get hello 获得key=hello结果
keys keys he* 根据Pattern表达查询符合条件的key
dbsize dbsize 返回key的总数
exists exists a 检查key=a是否存在
del del a 删除key=a的数据
expire expire hello 20 设置key=hello 20秒后过期
ttl ttl hello 查看key=a的过期剩余时间
[root@imooc redis-5.0.2]# ./src/redids-cli -p 6380   #重新连接到端口
127.0.0.1:6380> select 10
127.0.0.1:6380[10]> set name lily   #十号数据库中增加key=name value=lily
127.0.0.1:6380[10]> get name  => "lily"
127.0.0.1:6380[10]> select 9
127.0.0.1:6380[9]> get name =>(nil)
127.0.0.1:6380[9]> set name kitty
127.0.0.1:6380[9]> get name =>"kitty"
127.0.0.1:6380[9]> keys *  #列举表达式能匹配的所有key
127.0.0.1:6380[9]> set sex male
127.0.0.1:6380[9]> keys *
127.0.0.1:6380[9]> keys n* #模糊匹配表达式
127.0.0.1:6380[9]> dbsize  #显示当前数据库的总量 => 2个 => "name"  "sex"
127.0.0.1:6380[9]> del sex #删除 => 1 返回0则不存在
127.0.0.1:6380[9]> expire name 30   #生效开始之后30秒存活时间
127.0.0.1:6380[9]> ttl name #查看存活时间 时间一到自动清除     keys*中无name数据

Redis数据类型

  • String - 字符串类型 (String最大512mb 建议单个kv不超过100kb)
name Lily
counter 3321
sn 7361-7749
字符串命令
命令 示例 说明
get get hello 获取key=hello结果
set set hello world 设置key=hello, value=hello
mset mget mset hello world java best
mget hello java
一次性设置或者获取多个值
del del hello 删除key=hello
incr/decr incr count
decr count
key值自增/自减1
incrby/decrby incrby count 99
decrby count 99
自增自减指定步长
127.0.0.1:6380[9]> select 10 
127.0.0.1:6380[10]> set name lily
127.0.0.1:6380[10]> set sex 18
127.0.0.1:6380[10]> set birthday 1998-03-11
127.0.0.1:6380[10]> keys *
1) "birthday"  2)"name"  3)"sex"
127.0.0.1:6380[10]> mset name1 kitty sex1 20 birthday1 2001-03-02 #一次性设置多个键值对
127.0.0.1:6380[10]> mget name sex birthday  #一次性提取多个
127.0.0.1:6380[10]> clear  #当前屏幕清空
127.0.0.1:6380[10]> incr age  #将指定的数字自增+1
127.0.0.1:6380[10]> set age 20
127.0.0.1:6380[10]> keys age => "age"
127.0.0.1:6380[10]> get age => "20"
127.0.0.1:6380[10]> incr age => (integer) 22 #不可以自增字符串噢
127.0.0.1:6380[10]> decrby age 3 #对指定的key自减 => 20-3=17
127.0.0.1:6380[10]> del age #删除某个key
  • Hash - Hash类型
Hash类型用于存储结构化数据

↓↓↓ ↓↓↓ key = emp:1 ↓↓↓ ↓↓↓ 在value中又产生一个键值对[下面全是单个的emp:1的key值]

name smith
age 35
birthday 2001-02-02
height 178
命令 示例 说明
hget hget emp:1 age 获取hash中key=age的值
hset hset emp:1 age 23 设置hash中age=23
hmset
hmget
hgetall
hmset emp:1 age 30 name kaka
hmget emp:1 age name
hgetall emp:1
设置hash多个值
获取hash多个值
获取hash所有值
hdel hdel emp:1 age 删除emp:1的age
hexists hexists emp:1 name 检查是否存在
hlen hlen emp:1 获取指定长度
127.0.0.1:6380[1]> hset emp:1 name zhangsan       #设置某个hash值
127.0.0.1:6380[1]> hset emp:1 age 35
127.0.0.1:6380[1]> hset emp:1 birthday 2001-02-02
127.0.0.1:6380[1]> hset emp:1 height 178
127.0.0.1:6380[1]> keys * => "emp:1"
127.0.0.1:6380[1]> hget emp:1 name    #获取指定hash值 =>"zhangsan"
127.0.0.1:6380[1]> hget emp:1 age => "35"
127.0.0.1:6380[1]> hgetall emp:1 #提取所有的数据 

127.0.0.1:6380[1]> hmset emp:2 name lisa age 23 birthday 1990-05-03 height 165
127.0.0.1:6380[1]> hgetall emp:2
127.0.0.1:6380[1]> del emp:2     #删除整个对象
127.0.0.1:6380[1]> hlen emp:1 => (integer) 4     #代表在emp:1中有4个属性
127.0.0.1:6380[1]> hgetall emp:1 
127.0.0.1:6380[1]> hexists emp:1 name  #判断属性是否存在 是则返回1
  • List - 列表类型
    • List列表就是一系列字符串的”数组”, 按插入顺序排序
    • List列表最大长度为2的32次方-1, 可以包含40亿个元素
    List命令
    • rpush listkey c b a - 右侧插入 先c后b最后a
    • lpush listkey f e d - 左侧插入 先f后e最后d d e f c b a
    • rpop listkey - 右侧弹出 d e f c b
    • lpop listkey -左侧弹出 e f c b
127.0.0.1:6380[1]> rpush list c =>(integer) 1
127.0.0.1:6380[1]> lrange list 0 -1  #输出指定列表起始到结束范围内的所有元素 [开始 末尾]
127.0.0.1:6380[1]> rpush list b a =>(integer) 3
127.0.0.1:6380[1]> lrange list 0 -1 => "c" "b" "a"
127.0.0.1:6380[1]> lpush list f      #在左侧插入
127.0.0.1:6380[1]> lrange list 0 -1 => "f" "c" "b" "a"
127.0.0.1:6380[1]> lpush list b a
127.0.0.1:6380[1]> lrange list 0 -1 => "a" "b" "f" "c" "b" "a"
127.0.0.1:6380[1]> rpop list => "a"
127.0.0.1:6380[1]> lrange list 0 -1 => "a" "b" "f" "c" "b"
127.0.0.1:6380[1]> lpop list => "b" "f" "c" "b"
  • Set - 集合类型 Zset - 有序集合类型
    • Set集合是字符串的无序集合, 集合成员是唯一的
    • Zset集合是字符串的有序集合, 集合成员是唯一的
Set集合
127.0.0.1:6380[1]> sadd set1 a => 1
127.0.0.1:6380[1]> keys * => "set1" "emp:1" "list"
127.0.0.1:6380[1]> sadd set1 b => "b"
127.0.0.1:6380[1]> sadd set1 c => "c"
127.0.0.1:6380[1]> sadd set1 d => "d"
127.0.0.1:6380[1]> sadd set1 e => "e"
127.0.0.1:6380[1]> sadd set1 f => "f"
127.0.0.1:6380[1]> smembers set1 => "a" "b" "c" "d" "e" "f" "e"  #字母顺序打乱 乱序

127.0.0.1:6380[1]> sadd set2 d     #创建一个set2与set1有重叠
127.0.0.1:6380[1]> sadd set2 e
127.0.0.1:6380[1]> sadd set2 f
127.0.0.1:6380[1]> sadd set2 h
127.0.0.1:6380[1]> sadd set2 g
127.0.0.1:6380[1]> smembers set2 => "d" "h" "e" "f" "g"
127.0.0.1:6380[1]> sinter set1 set2 =>     "d" "f" "e"     #取其中的交集
127.0.0.1:6380[1]> sunion set1 set2 =>     "d" "g" "b" "c" "h" "f" "e" "a"    #取其中的并集[取并集并去除重复元素]
127.0.0.1:6380[1]> sdiff set1 set2 #寻找叉集(在set1有 在set2中没有[两个部分交集排除在外])
=> "a" "c" "b"
127.0.0.1:6380[1]> sdiff set2 set1 => "h" "g"
Zset集合
127.0.0.1:6380[1]> zadd zset1 100 a =>1
127.0.0.1:6380[1]> zadd zset1 101 b => 1
127.0.0.1:6380[1]> zrange zset1 0 -1 => "a" "b" #按照顺序排序
127.0.0.1:6380[1]> zadd zset1 99 c => 1  
127.0.0.1:6380[1]> zrange zset1 0 -1 => "c" "a" "b" #按照分数升序排列
127.0.0.1:6380[1]> zadd zset1 102 d
127.0.0.1:6380[1]> zadd zset1 103 e
127.0.0.1:6380[1]> zadd zset1 104 f
127.0.0.1:6380[1]> zrange zset1 0 -1 withscores #升序打印分数
127.0.0.1:6380[1]> zrangebyscore zset1 100 103 #符合score从100-103的名字

Java客户端-Jedis

  • Jedis是Java语言开发的Redis客户端工具包
  • Jedis只是对Redis命令的封装, 掌握Redis命令便可轻易上手
允许远程访问需要改文件
[root@imooc ~]# cd /usr/local/redis/redis-5.0.2/
[root@imooc redis-5.0.2]# vim redis.conf
第88行 protected-mode yes 将yes设置为no
第69行 bind 127.0.0.1 改为 bind 0.0.0.0     #四个0代表所有ip主机都可以访问进来【真正开发时要用特定的ip号】
[root@imooc redis-5.0.2]# ./src/redis-server redis.conf
[root@imooc redis-5.0.2]# netstat -tulpn | grep redis
[root@imooc redis-5.0.2]# firewall-cmd --zone=public --add-port=6379/tcp --permanent
[root@imooc redis-5.0.2]# firewall-cmd --reload
[root@imooc redis-5.0.2]# ifconfig => IP地址: 192.168.170.135

[root@imooc redis-5.0.2]# ./src/redis-cli -p 6379

报错连接超时:
Java远程连接Redis时出现: java.net.SocketTimeoutException: connect timed out的解决办法-CSDN博客
Java连接Redis connection timed out 报错的解决方法_caused by: io.netty.channel.abstractchannel$annota-CSDN博客

systemctl start firewalld  #开启防火墙
systemctl enable firewalld.service  #开机自启动防火墙

systemctl stop firewalld.service #关闭防火墙
重启 Redis 服务端
ps -ef|grep redis    #查看 Redis 进程 
kill -s 9 进程号      #杀死 Redis 进程
[root@imooc redis-5.0.2]# ./src/redis-server redis.conf 
package com.imooc.jedis;

import redis.clients.jedis.Jedis;

import java.util.List;

public class JedisTestor {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.170.135", 6379);
        try {
            jedis.auth("root");
            jedis.select(2);
            System.out.println("Redis连接成功");
            //字符串
            jedis.set("sn", "7781-9938");
            String sn = jedis.get("sn");
            System.out.println(sn);
            jedis.mset(new String[]{"title", "婴幼儿奶粉", "num", "20"});
            List<String> goods = jedis.mget(new String[]{"sn", "title", "num"});
            System.out.println(goods);
            Long num = jedis.incr("num");
            System.out.println(num);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            jedis.close();
        }
    }
}
pom.xml【两个jar:    jedis-2.9.0.jar        fastjson-1.2.62.jar】
<?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>Jedis_test</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>
[root@imooc redis-5.0.2]# ./src/redis-cli
127.0.0.1:6379> auth root
127.0.0.1:6379> select 2
127.0.0.1:6379[2]> keys * => "sn"
127.0.0.1:6379[2]> get sn => "7781-9938"
【此处更换新的java代码再次插入 奶粉...】
------------------------------------------------------------------
jedis.mset(new String[]{"title", "婴幼儿奶粉", "num", "20"});
List<String> goods = jedis.mget(new String[]{"sn", "title", "num"});
------------------------------------------------------------------
127.0.0.1:6379[2]> keys * => "sn" "num" "title"
127.0.0.1:6379[2]> get num => 21
127.0.0.1:6379[2]> get title => \xe5\xa9\xb4\xe5\xb9\xbc\xe5...

Jedis操作Hash类型

package com.imooc.jedis;

import redis.clients.jedis.Jedis;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JedisTestor {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.170.135", 6379);
        try {
            jedis.auth("root");
            jedis.select(2);
            System.out.println("Redis连接成功");
            //字符串
            jedis.set("sn", "7781-9938");
            String sn = jedis.get("sn");
            System.out.println(sn);
            jedis.mset(new String[]{"title", "婴幼儿奶粉", "num", "20"});
            List<String> goods = jedis.mget(new String[]{"sn", "title", "num"});
            System.out.println(goods);
            Long num = jedis.incr("num");
            System.out.println(num);

            //Hash
            jedis.hset("student:3312", "name", "张晓明");
            String name = jedis.hget("student:3312", "name");
            System.out.println(name);

            Map<String,String> studentMap = new HashMap();
            studentMap.put("name", "李兰");
            studentMap.put("age", "18"); //所有数据类型都是String
            studentMap.put("id", "3313");
            jedis.hmset("student:3313", studentMap);
            Map<String,String> smap = jedis.hgetAll("student:3313");
            System.out.println(smap);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            jedis.close();
        }
    }
}

---------------------------------------------------------------
Redis连接成功
7781-9938
[7781-9938, 婴幼儿奶粉, 20]
21
张晓明
{name=李兰, age=18, id=3313}
127.0.0.1:6380[2]> hgetall student:3313

Jedis操作List类型

package com.imooc.jedis;

import redis.clients.jedis.Jedis;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JedisTestor {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.170.135", 6379);
        try { //List
            jedis.del("letter"); //要先删除不然lpop、rpop的时候会追加数据
            jedis.rpush("letter", new String[]{"d", "e", "f"});
            jedis.lpush("letter", new String[]{"c", "b", "a"});
            List<String> letter = jedis.lrange("letter", 0, -1);
            jedis.lpop("letter");
            jedis.rpop("letter");
            letter = jedis.lrange("letter", 0, -1);
            System.out.println(letter);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            jedis.close();
        }
    }
}
----————--——----------------------------------------------------
[a, b, c, d, e, f] => [b, c, d, e]

利用Jedis缓存数据 [放在内存处理 速度快]

缓存数据:资料不要太大 信息比较稳定更新次数较低
Goods.java
public class Goods {
    private Integer goodsId;
    private String goodsName;
    private String description;
    private Float price;
    Getter + Setter + Constructor[空+全]
}
CacheSample.java
package com.imooc.jedis;

import com.alibaba.fastjson.JSON;
import redis.clients.jedis.Jedis;

import java.util.ArrayList;
import java.util.List;

public class CacheSample {
    public CacheSample(){ //数据初始化
        Jedis jedis = new Jedis("192.168.170.135", 6379);
        try {
            List<Goods> goodsList = new ArrayList();
            goodsList.add(new Goods(8818,"红富士苹果","",3.5f));
            goodsList.add(new Goods(8819,"赣南脐橙","",5f));
            goodsList.add(new Goods(8820,"进口香蕉","",2f));
            //javabean序列化为json字符串保存到java里
            jedis.auth("root");
            jedis.select(3);
            for (Goods goods : goodsList){
                String json = JSON.toJSONString(goods);
                System.out.println(json);
                String key = "goods:" + goods.getGoodsId();
                jedis.set(key, json); //key + value[序列化为json]
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            jedis.close();
        }
    }

    public static void main(String[] args) {
        new CacheSample();
    }
}
________________________________________________________________
{"description":"","goodsId":8818,"goodsName":"红富士苹果","price":3.5}
{"description":"","goodsId":8819,"goodsName":"赣南脐橙","price":5.0}
{"description":"","goodsId":8820,"goodsName":"进口香蕉","price":2.0}
________________________________________________________________
127.0.0.1:6379[3]> keys *
127.0.0.1:6379[3]> "goods:8820" "goods:8819" "goods:8818"
127.0.0.1:6379[3]> get goods:8820

更新
CacheSample.java
package com.imooc.jedis;

import com.alibaba.fastjson.JSON;
import redis.clients.jedis.Jedis;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class CacheSample {
    public CacheSample(){ //数据初始化
        Jedis jedis = new Jedis("192.168.170.135", 6379);
        try {
            List<Goods> goodsList = new ArrayList();
            goodsList.add(new Goods(8818,"红富士苹果","",3.5f));
            goodsList.add(new Goods(8819,"赣南脐橙","",5f));
            goodsList.add(new Goods(8820,"进口香蕉","",2f));
            //javabean序列化为json字符串保存到java里
            jedis.auth("root");
            jedis.select(3);
            for (Goods goods : goodsList){
                String json = JSON.toJSONString(goods);
                System.out.println(json);
                String key = "goods:" + goods.getGoodsId();
                jedis.set(key, json); //key + value[序列化为json]
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            jedis.close();
        }
    }

    public static void main(String[] args) {
        new CacheSample();
        System.out.println("请输入要查询的商品编号:");
        String goodsId = new Scanner(System.in).next();
        Jedis jedis = new Jedis("192.168.170.135");
        jedis.auth("root");
        jedis.select(3);
        String key = "goods:" + goodsId;
        if (jedis.exists(key)){
            String json = jedis.get(key);
            System.out.println(json);
            //由json转回到java对象
            Goods g = JSON.parseObject(json, Goods.class);
            System.out.println(g.getGoodsName());
            System.out.println(g.getPrice());
        }else{
            System.out.println("您输入的商品编号不存在,请重新输入!");
        }
    }
}