额外拓展
3 拓展-上线项目3.1 Sealos云操作系统介绍
Sealos云操作系统介绍

Sealos DevBox 是一个一站式云开发平台,将在线开发、测试和生产环境完美集成。只需一键点击,即可快速创建所需的开发环境和数据库依赖。开发者可以使用熟悉的本地 IDE(如 VSCode、Cursor、JetBrains 等)进行开发,同时享受简化的环境配置和自动化的应用部署体验。平台支持所有主流编程语言和框架,包括 Node.js、Python、Java、Go、PHP、Ruby 等,以及各类前端框架如 React、Vue、Angular 等。
代码操作

DevBox:一站式云开发平台,支持在线开发、测试和生产环境,支持所有主流编程语言和框架,包括 Node.js、Python、Java、Go、PHP、Ruby 等,以及各类前端框架如 React、Vue、Angular 等。
数据库:支持 MySQL、PostgreSQL、MongoDB 等主流数据库,支持在线管理、备份和恢复。
对象存储:支持存储和检索各种类型的数据,包括图片、视频、音频等。

有了这些功能,意味着本地电脑上都不需要安装对应的软件,就可以进行项目开发了
总结
课堂作业
- 为什么要使用Sealos云操作系统?有什么好处?🎤
- Sealos云操作系统常用有哪些功能?🎤
- Sealos云操作系统是免费的吗?🎤
3.2 上线项目
上线项目
代码操作
在sealos中创建数据库,并使用Navicat导入数据
1. 在sealos中创建yangeitdb数据库
2. 打开外网访问,支持外网访问
- 链接Navicat,输入数据库链接信息,测试连接是否成功。
Navicat是一款数据库管理工具,可以连接MySQL、Oracle、SQL Server等数据库,方便用户进行数据库操作。自行下载安装,百度搜索即可。

- 操作Navicat,执行sql语句,观察表和数据是否ok

3.插入操作:👇
4.数据插入成功:👇
记录外网或者内网地址:稍后要在springboot的yml配置文件中使用 👈
- 将项目中的yml配置文件中的数据库链接地址修改为外网地址
# 修改端口为9995
server:
port: 9995
# 顶格写
spring:
#数据库连接信息
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://dbconn.sealoshzh.site:31098/zzyl_user_client?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
username: root
password: 8pbdgf24 # 如果你的密码是0开头的 0123 那么必须用但引号包裹 '0123'
#Mybatis配置
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启日志
map-underscore-to-camel-case: true # 开启驼峰命名转换
- 点击maven的package命令,将项目打包成jar包,将jar包上传到服务器,通过命令启动项目
Trae 是国内首个 AI IDE,深度理解中文开发场景
- 在sealos中创建一个java项目,并且使用Trae打开这个项目


2. 将jar拷贝到目录中(就是远程服务器的目录,不是本地的目录)
- 修改entrypoint.sh 文件的内容,改为
java -jar ./zzyl-1.0-SNAPSHOT.jar
4.在sealos中发布版本

配置发布信息

修改微信小程序的配置文件,将域名改为外网地址



1.Redis
1.1 什么是 Redis
前言
🎯1. 什么是Redis? 👇
Redis 是一个基于内存的 key-value 结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件,它是「Remote Dictionary Service」的首字母缩写,也就是「远程字典服务」。



🎯2. 使用 Redis 能做什么 👇
- 数据缓存
- 消息队列
- 注册中心
- 发布订阅
- 向量存储

🎯3. Redis性能高吗?为什么高?有多高? 👇
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker. 翻译为:Redis 是一个开源的内存中的数据结构存储系统,它可以用作:数据库、缓存和消息中间件。
Redis 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库,官方提供的数据是可以达到 100000+的 QPS(每秒内查询次数)。它存储的 value 类型比较丰富,也被称为结构化的 NoSql 数据库。
NoSql(Not Only SQL),不仅仅是 SQL,泛指非关系型数据库。NoSql 数据库并不是要取代关系型数据库,而是关系型数据库的补充。
关系型数据库(RDBMS): 👇
- Mysql
- Oracle
- DB2
- SQLServer
非关系型数据库(NoSql):👇
- Redis
- Mongo db
- MemCached

🎯4. Redis安装? 👇
linux和 windows 都可以安装,但是一般企业中都是安装在 linux 服务器上。
Linux下安装的版本:
实训为了好演示,我们使用 windows 版本,如下 👇

🎯5. Redis配置信息? 👇
- Linux 系统中 Redis 配置文件:REDIS_HOME/redis.conf
- Windows 系统中 Redis 配置文件:REDIS_HOME/redis.windows.conf 👇

其中主要的配置信息如下:
🎯6. 怎么操作Redis数据库尼? 👇
- 使用cmd命令操作
redis-cli.exe -h 127.0.0.1 -p 6379 -a 123456
其中:
-h:指定主机地址
-p:指定端口号
-a:指定密码(没有就不写)


- 使用可视化工具操作,有官方的,也有三方的,这里使用Idea的免费插件RedisHelper,如下:



3. 还可以使用编程语言进行操作,后面讲解
2.2 Redis 数据类型
前言
- Redis常用的有哪几种数据类型?
Redis 存储的是 key-value 结构的数据,其中 key 是字符串类型,value 有 5 种常用的数据类型:
5种常用的数据类型
- 字符串(string):普通字符串,常用
- 哈希(hash):适合存储对象
- 列表(list):按照插入顺序排序,可以有重复元素
- 集合(set):无序集合,没有重复元素
- 有序集合(sorted set / zset):集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素
2.3 Redis数据类型实操演示
Redis数据类型实操演示
代码操作
Redis 中字符串类型常用命令:
- SET key value 设置指定 key 的值
- GET key 获取指定 key 的值
- SETEX key seconds value 设置指定 key 的值,并将 key 的过期时间设为 seconds 秒
- SETNX key value 只有在 key 不存在时设置 key 的值
更多命令可以参考 Redis 中文网:https://www.redis.net.cn
练习指令 ✏️ 🍐
# 存入一个字符串
set name xiaoming
# 获取name
get name
# 存入一个age
set age 20
set age 30
# 获得age
get age #30 覆盖了
# 练习 SETEX key seconds value 设置指定 key 的值,并将 key 的过期时间设为 seconds 秒
# 设置存10s
setex city 10 beijing
# 等待10秒
get city #返回nil --->空
# 练习SETNX key value 只有在 key 不存在时设置 key 的值
setnx bookname haha
setnx bookname heihei
get bookname # 返回haha
## 注意不要传中文,返回类似这种
"\xe5\x87\xa1\xe4\xba\xba\xe4\xbf\xae\xe4\xbb\x99\xe8\xae\xb0"
# 在redis 中存储中文,默认读取不到中文,而是以十六进制的方式储存
也可用RedisHelper插件进行操作,如下:
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,常用命令:
- HSET key field value 将哈希表 key 中的字段 field 的值设为 value
- HGET key field 获取存储在哈希表中指定字段的值
- HDEL key field 删除存储在哈希表中的指定字段
- HKEYS key 获取哈希表中所有字段
- HVALS key 获取哈希表中所有值
- HGETALL key 获取在哈希表中指定 key 的所有字段和值

练习指令 ✏️ 🍐
根据图解完成指令

# 往key 为001 存入 hash键值对 2对
hset 001 name zhangsan
hset 001 age 23
hset 002 name lisi
hset 002 age 16
# 练习 HGET key field 获取存储在哈希表中指定字段的值
# 获取002中的 name的值
hget 002 name
# 练习 HDEL key field 删除存储在哈希表中的指定字段
# 删除 002 中的name
hdel 002 name
# 练习HKEYS key 获取哈希表中所有字段
hkeys 002
# 练习HVALS key 获取哈希表中所有值
HVALS 002
# 练习 HGETALL key 获取在哈希表中指定 key 的所有字段和值
HGETALL 001
也可以用RedisHelper插件进行操作,如下:

Redis 列表是简单的字符串列表,按照插入顺序排序,常用命令:
先插入的在尾部,后插入的在头部
- LPUSH key value1 [value2] 将一个或多个值插入到列表头部
- LRANGE key start stop 获取列表指定范围内的元素
- RPOP key 移除并获取列表最后一个元素
- LLEN key 获取列表长度
- BRPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超 时或发现可弹出元素为止

练习指令 ✏️ 🍐
根据图解完成指令

# LPUSH key value1 [value2] 将一个或多个值插入到列表头部
LPUSH list1 a b c d
LPUSH list2 1 2 3 4
LPUSH list3 9 8 7 6
# LRANGE key start stop 获取列表指定范围内的元素
LRANGE list1 0 -1 # 查所有
# a最先插入,所以在尾部
# RPOP key 移除并获取列表最后一个元素
RPOP list1 # 返回a 当然a没有了
# LLEN key 获取列表长度
LLEN list1 # 3
# BRPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超 时或发现可弹出元素为止
BRPOP list1 10
也可以用RedisHelper插件进行操作,如下:
set 操作命令
Redis set 是 string 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,常用命令:
- SADD key member1 [member2] 向集合添加一个或多个成员
- SMEMBERS key 返回集合中的所有成员
- SCARD key 获取集合的成员数
- SINTER key1 [key2] 返回给定所有集合的交集
- SUNION key1 [key2] 返回所有给定集合的并集
- SDIFF key1 [key2] 返回给定所有集合的差集
- SREM key member1 [member2] 移除集合中一个或多个成员

练习指令 ✏️ 🍐
根据图解完成指令

# SADD key member1 [member2] 向集合添加一个或多个成员
SADD set1 a b c
SADD set2 1 2 3
# SMEMBERS key 返回集合中的所有成员
SMEMBERS set1
# SCARD key 获取集合的成员数
SCARD set1
# SINTER key1 [key2] 返回给定所有集合的交集
SINTER set1 set2 # a 交集是a
# SUNION key1 [key2] 返回所有给定集合的并集
SUNION set1 set2 # a b c 2 3
# SDIFF key1 [key2] 返回给定所有集合的差集
SDIFF set1 set2 #注意顺序 2者相减
# SREM key member1 [member2] 移除集合中一个或多个成员
SREM set1 a b # 删除元素
也可以用RedisHelper插件进行操作,如下:

Redis sorted set 有序集合是 string 类型元素的集合,且不允许重复的成员。每个元素都会关联一个 double 类型的分数(score) 。redis 正是通过分数 来为集合中的成员进行从小到大排序 。有序集合的成员是唯一的,但分数却可以重复。
- ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的 分数
- ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
- ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
- ZREM key member [member ...] 移除有序集合中的一个或多个成员

练习指令 ✏️ 🍐
根据图解完成指令

# ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的 分数
zadd sset1 0.1 a 3.0 b 2.5 c
zadd sset2 9.9 p 8.8 w 2.0 q
# ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
ZRANGE sset1 0 -1 # 获得全部
ZRANGE sset1 0 -1 WITHSCORES # 分数也会显示
# ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
ZINCRBY sset1 20 b #意味着b的分值改变了
# 可以查询下
ZRANGE sset1 0 -1 WITHSCORES
# ZREM key member [member ...] 移除有序集合中的一个或多个成员
ZREM sset1 b #将b这个元素移除
也可以用RedisHelper插件进行操作,如下:
Redis 中的通用命令,主要是针对 key 进行操作的相关命令:
- KEYS pattern 查找所有符合给定模式( pattern)的 key
- EXISTS key 检查给定 key 是否存在
- TYPE key 返回 key 所储存的值的类型
- TTL key 返回给定 key 的剩余生存时间(TTL, time to live),以秒为单位
- DEL key 该命令用于在 key 存在是删除 key
练习指令 ✏️ 🍐
# KEYS pattern 查找所有符合给定模式( pattern)的 key
KEYS * #查询所有的key
# EXISTS key 检查给定 key 是否存在
EXISTS bookname
# TYPE key 返回 key 所储存的值的类型
TYPE bookname
# TTL key 返回给定 key 的剩余生存时间(TTL, time to live),以秒为单位
TTL bookname # -1表示一直存在
# DEL key 该命令用于在 key 存在是删除 key
DEL bookname
KEYS * #查询所有的key
警告
keys 命令的时间复杂度是 O(N),N 是 redis 库中的数据量,也就是说这个命令的执行时间是随着库中的数据量增多呈正比的,数据量越大,执行时间越长。所以尽管这个命令的速度很快,但如果是一个数据量很大的库,还是会造成性能问题的。
2.4 SpringBoot 整合 Redis
SpringCache和Redis操作
前面我们已经实现了移动端房型查看功能,且放在首页,因此会被用户频繁访问,进而对数据库查询操作。在高并发 的情况下,频繁查询数据库会导致系统性能下降 ,服务端响应时间增长。现在需要对此方法进行缓存优化,提高系统的性能。(如下图)

SpringCache是一个框架,实现了基于注解的缓存功能 ,只需要简单地加一个注解,就能实现缓存功能,大大简化我们在业务中操作缓存的代码。
Spring Cache 只是提供了一层抽象,底层可以切换不同的 cache 实现。具体就是通过CacheManager 接口 来统一不同的缓存技术。CacheManager 是 Spring 提供的各种缓存技术抽象接口。
针对不同的缓存技术需要实现不同的 CacheManager:
CacheManager | 描述 |
---|---|
EhCacheCacheManager | 使用 EhCache 作为缓存技术 |
GuavaCacheManager | 使用 Google 的 GuavaCache 作为缓存技术 |
RedisCacheManager | 使用 Redis 作为缓存技术 |
在 SpringCache 中提供了很多缓存操作的注解,常见的是以下的几个:
注解 | 说明 |
---|---|
@EnableCaching | 开启缓存注解功能 |
@Cacheable | 在方法执行前 spring 先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中 |
@CachePut | 将方法的返回值放到缓存中 |
@CacheEvict | 将一条或多条数据从缓存中删除 |
在 spring boot 项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用@EnableCaching
开启缓存支持即可。
例如,使用 Redis 作为缓存技术,只需要导入 Spring data Redis 的 maven 坐标即可。
代码操作
由于 SpringCache 的基本功能是 Spring 核心(spring-context)中提供的,所以目前我们进行简单的 SpringCache 测试,是可以不用额外引入其他依赖的。 可以检查是否导入了下列依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
1). 引导类上加@EnableCaching
在引导类上加该注解,就代表当前项目开启缓存注解功能。

在 XXXController 的 list 方法上加入@Cacheable
注解
在进行数据查询时,我们需要根据roomCache和status状态进行查询,所以我们在缓存数据时,可以将roomCache和status状态组合起来作为key,如: roomCache::1
@RestController
public class RoomTypeController {
@Autowired
private RoomTypeMapper roomTypeMapper;
@GetMapping("/customer/roomTypes")
@Cacheable(value = "roomCache",key = "#status")
public Result<List<RoomType>> findAll(Integer status){
List<RoomType> rts = roomTypeMapper.select(status);
//System.out.println(rts);
return Result.success(rts);
}
}
为了保证数据库中数据与缓存数据的一致性,在我们添加房间类型或者房间类型数据之后,需要清空当前房间类型缓存的全部数据。那么@CacheEvict
注解如何清除某一份缓存下所有的数据呢,这里我们可以指定@CacheEvict
中的一个属性 allEnties,将其设置为 true 即可。
@PostMapping
@CacheEvict(value = "roomCache",allEntries = true) //清除roomCache名称下,所有的缓存数据
public Result 增删改方法(.....) {
}

上述确实能解决数据库频繁查询的问题,但是如果idea重启,缓存就消失了,下次启动idea得重新构建缓存,有没有一种缓存技术可以直接避免这种情况,提高缓存的可用性尼?
使用redis非关系型数据库即可
- 安装Redis,在非中文的路径下,解压焱哥发在微信群里的压缩包,点击运行startredis.bat 即可

点击运行startredis.bat 即可
- 在项目的pom.xml中添加redis依赖,点击右上角的刷新
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.4.5</version>
</dependency>

- 在项目的yml文件中添加redis链接配置
spring:
redis:
host: localhost
port: 6379
database: 0


反复点击发现,不会查询数据库

通过redis可视化软件,可以查看已经存入的数据,且关闭idea数据依然存在
2.5 其他模块缓存优化
其他模块缓存优化
大家可以根据上述的缓存优化,对其他模块进行缓存优化,比如:服务列表模块等