四阶段
2024-01-20 11:14:20 0 举报
AI智能生成
项目学习阶段总结
作者其他创作
大纲/内容
软件工程
需求分析阶段
1.对项目需求进行详细的分析,明确项目的目标和范围。
2.与项目相关方进行深入沟通,确保需求的准确性和完整性
3.编写需求文档,作为后续开发阶段的参考依据
需求分析阶段的岗位人员包括产品经理、需求分析师、项目经理等
设计阶段
对项目的架构、模块、接口等进行详细的设计
确定项目的技术选型、架构方案、模块划分等
编写设计文档,作为后续开发阶段的参考依据
设计阶段的岗位人员包括架构师、设计师、项目经理等
开发阶段
根据设计文档进行代码的编写和开发
遵循编码规范和设计文档,保证代码的质量和性能
进行单元测试、集成测试、系统测试等,确保软件的稳定性和可靠性
开发阶段的岗位人员包括开发人员、测试人员、项目经理等
测试阶段
对开发完成的软件进行详细的测试,确保软件的功能和性能符合需求
制定测试计划、测试用例,进行功能测试、性能测试、安全测试等
编写测试报告,作为项目验收的依据
测试阶段的岗位人员包括测试人员、产品经理、项目经理等
上线阶段
将开发完成的软件部署到生产环境中,并对上线结果进行监控和维护
制定上线方案、回滚方案,确保上线过程的顺利进行
编写上线报告,作为项目总结的依据
上线阶段的岗位人员包括运维人员、产品经理、项目经理等
框架学习
依赖管理
<dependencyManagement>/<parent>/<modules>/<properties>
集成mybatis
主模块,子模块pom表添加依赖
在resources里创建mappers文件夹,里面创建xxxMapper.xml
在application.yaml内配置mapper地址
在xxxMapper.xml文件内,编写SQL查询条件
mybatis-plus
主模块,子模块pom表添加依赖
xxxMapper接口继承BaseMapper<T>,泛型为实体类型
在mapper实现类中完成SQL查询
配置文件,通过profiles来选择配置文件 application.yaml/application-local.yanl
项目解耦
参考PO -> BO -> VO 数据库往页面返数据
页面往数据库插数据 新增或者更新的参数
Param -> BO -> PO
页面往数据库插数据 新增或者更新的参数
Param -> BO -> PO
pageHelper
基于mybatis,无侵入,拦截器 spring有好多的拦截器,验证
在执行sql之前,对sql进行了修改
在执行sql之前,对sql进行了修改
注意⚠️
要挨着
pageHelper.startPage(arg1,arg2)
mapper.list()
要挨着
要挨着
pageHelper.startPage(arg1,arg2)
mapper.list()
要挨着
knife4j
测试接口
生成接口文档
生成接口文档
事务处理
全部成功,全部失败
@Transactional 注解
类上可以
方法上也可以
实现类上可以
接口上也可以
类上可以
方法上也可以
实现类上可以
接口上也可以
事务传播机制
事务隔离级别
全局异常处理
我们代码有可能抛出任何异常 ,我们不能或者不想把服务器真实的异常给前端
参数校验
快速失败的概念 编程思想
@Validated Spring实现的
在CategoryAddParam 类上的属性字段 上增加注解
@NotBlank //字符串
@NotEmpty //集合,数组
@NotNull //基本类型
三者区别
@NotBlank //字符串
@NotEmpty //集合,数组
@NotNull //基本类型
三者区别
缓存
不会频繁变化的数据 原来我们是存储在mysql里,为了提高性能,查询的更快,使用了缓存
redis
数据类型及操作
简介
String Map<String,String>
List Map<String,List<>>
Set Map<String,Set<>>
Zset Map<String,TreeSet<>>
Hash Map<String,HashMap<>>
List Map<String,List<>>
Set Map<String,Set<>>
Zset Map<String,TreeSet<>>
Hash Map<String,HashMap<>>
redis 你可以理解为底层就是一个大map,所以它的结构是K,V
K 上面的那个map的key,String
v 支持的5种基本数据类型
K 上面的那个map的key,String
v 支持的5种基本数据类型
基础命令
redis-cli
redis-cli -h 192.168.1.3 -p 6379 -h 地址, -p 端口号
select
默认有16库 从0开始
select 1-15
Select 16 报错
select 1-15
Select 16 报错
Keys * 学完以后 可以忘记 在线上是不可以使用的.
dbsize 可以获取当前数据库中数据的数量
flush
Flushall 删除所有的数据
Flushdb 删除当前数据库的所有数据
Flushdb 删除当前数据库的所有数据
expire & ttl
Redis 是个内存数据库
意味着很快 ,还有内存容量有限
Expire 过期时间
意味着很快 ,还有内存容量有限
Expire 过期时间
禁忌
keys flushALL flushdb 线上不能用的命令
HGETALL SMEMBERS 消耗时间会随着数据量大小变化
String类型
增加/修改
SET:设置一个键的字符串值。
SET key value
SET key value
查询
GET:获取指定键的字符串值。
GET key
GET key
删除
DEL 命令用于删除 Redis 中的一个或多个键。
命令语法如下:
DEL key1 [key2 ...]
命令语法如下:
DEL key1 [key2 ...]
List 类型
增加
LPUSH 命令:将一个或多个元素插入到列表头部
LPUSH key value [value ...]
LPUSH key value [value ...]
RPUSH 命令:将一个或多个元素插入到列表尾部
RPUSH key value [value ...]
RPUSH key value [value ...]
移除
LPOP 命令:移除并返回列表头部元素
LPOP key
LPOP key
RPOP 命令:移除并返回列表尾部元素
RPOP key
RPOP key
LREM 命令用于从列表中移除指定数量的匹配元素。
命令语法如下:
LREM key count value
命令语法如下:
LREM key count value
key:列表的键名。
count:要移除的元素数量。可以是正数、负数或零。
正数表示从列表头部开始移除指定数量的匹配元素。
负数表示从列表尾部开始移除指定数量的匹配元素。
零表示移除所有匹配的元素。
value:要移除的匹配元素。
count:要移除的元素数量。可以是正数、负数或零。
正数表示从列表头部开始移除指定数量的匹配元素。
负数表示从列表尾部开始移除指定数量的匹配元素。
零表示移除所有匹配的元素。
value:要移除的匹配元素。
需要注意的是,LREM 命令执行的时候会遍历整个列表,因此在列表长度较长时可能会产生较高的性能开销。
查询
LRANGE 命令:获取指定范围内的元素列表
LRANGE key start stop
LRANGE key start stop
LINDEX 命令:获取指定索引位置的元素值
LINDEX key index
LINDEX key index
LLEN 命令:获取列表长度
LLEN key
LLEN key
插入
LINSERT 命令:在列表中插入元素
LINSERT key BEFORE|AFTER pivot value
LINSERT key BEFORE|AFTER pivot value
key:列表的键名。
BEFORE|AFTER:指定在目标元素的前面(BEFORE)或后面(AFTER)插入新元素。
pivot:目标元素,即要在其前面或后面插入新元素的元素。
value:要插入的新元素。
BEFORE|AFTER:指定在目标元素的前面(BEFORE)或后面(AFTER)插入新元素。
pivot:目标元素,即要在其前面或后面插入新元素的元素。
value:要插入的新元素。
需要注意的是,如果列表中不存在目标元素 pivot,那么插入操作不会进行,并且命令会返回 -1。
> LRANGE mylist 0 -1
1) "one"
2) "two"
> LINSERT mylist AFTER "two" "three"
(integer) 3
> LRANGE mylist 0 -1
1) "one"
2) "two"
3) "three"
1) "one"
2) "two"
> LINSERT mylist AFTER "two" "three"
(integer) 3
> LRANGE mylist 0 -1
1) "one"
2) "two"
3) "three"
拆分修剪
LTRIM 命令用于对列表进行修剪(Trimming),即只保留列表中指定区间内的元素,而将其他元素全部删除。
命令语法如下:
LTRIM key start stop
命令语法如下:
LTRIM key start stop
key:列表的键名。
start:要保留的区间的起始索引位置(包含在内)。
stop:要保留的区间的结束索引位置(包含在内)。
start:要保留的区间的起始索引位置(包含在内)。
stop:要保留的区间的结束索引位置(包含在内)。
需要注意的是,start 和 stop 参数可以是负数,表示从列表尾部开始计算的索引位置。例如,-1 表示列表的最后一个元素。如果指定的区间不合法(例如 start 大于 stop),则会返回一个空列表。
修改
LSET 命令用于设置列表中指定索引位置的元素值。
命令语法如下:
LSET key index value
命令语法如下:
LSET key index value
key:列表的键名。
index:要设置的元素索引位置。
value:要设置的元素值。
index:要设置的元素索引位置。
value:要设置的元素值。
需要注意的是,如果指定的索引位置超过了列表的范围,LSET 命令会返回一个错误。
Set类型
增加 Sadd [member ...]
查询 smembers key
单线程阻塞
大数据量时查询容易导致redis崩溃
大数据量时查询容易导致redis崩溃
删除 SREM key [member...]
随机取两个成员(重复) SRANDMEMBER key count
随机弹出几个(弹出后集合内不再保留) Spop key count
获取大小 或者是size Scard
取交集 sinter key [key...]
成员是否存在 SISMEMBER key member
SSCAN key cursor [MATCH pattern] [COUNT count]
SSCAN 指令用于迭代集合(Set)或有序集合(Sorted Set)中的元素。它可以帮助你按照指定的模式逐个获取集合中的元素,而无需一次性获取所有元素。
key:要迭代的集合的键名。
cursor:游标,表示迭代的起始位置。首次使用时,可以将游标设为 0。
MATCH pattern(可选):用于匹配元素的模式。可以使用通配符 * 和 ? 进行模糊匹配。
COUNT count(可选):每次返回的元素数量。默认情况下,Redis 会尽可能多地返回元素,但可以使用该选项限制返回的数量。
SSCAN 指令的返回值是一个包含两个元素的数组:第一个元素是下一个迭代的游标,第二个元素是一个数组,包含了符合条件的元素。
cursor:游标,表示迭代的起始位置。首次使用时,可以将游标设为 0。
MATCH pattern(可选):用于匹配元素的模式。可以使用通配符 * 和 ? 进行模糊匹配。
COUNT count(可选):每次返回的元素数量。默认情况下,Redis 会尽可能多地返回元素,但可以使用该选项限制返回的数量。
SSCAN 指令的返回值是一个包含两个元素的数组:第一个元素是下一个迭代的游标,第二个元素是一个数组,包含了符合条件的元素。
差集 sdiff key [key ...]
并集 sunion key [key ...]
设置过期时间 EXPIRE key seconds
-1表示永不过期
-1表示永不过期
Hash类型
增加
HSET key field value [field value ...]:
为哈希表 key 中的字段 field 设置值为 value。
示例:HSET myhash field1 "Hello"
为哈希表 key 中的字段 field 设置值为 value。
示例:HSET myhash field1 "Hello"
HINCRBY key field
删除
HDEL key field [field ...]:
删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。
示例:HDEL myhash field1
删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。
示例:HDEL myhash field1
查询
HGET key field:
返回哈希表 key 中给定字段 field 的值。
示例:HGET myhash field1
返回哈希表 key 中给定字段 field 的值。
示例:HGET myhash field1
HGETALL key:
返回哈希表 key 中,所有的字段和值。
示例:HGETALL myhash
返回哈希表 key 中,所有的字段和值。
示例:HGETALL myhash
HEXISTS key field:
查看哈希表 key 中,指定的字段是否存在。
示例:HEXISTS myhash field1
查看哈希表 key 中,指定的字段是否存在。
示例:HEXISTS myhash field1
HKEYS key:
获取哈希表 key 中的所有字段。
示例:HKEYS myhash
获取哈希表 key 中的所有字段。
示例:HKEYS myhash
HVALS key:
获取哈希表 key 中的所有值。
示例:HVALS myhash
获取哈希表 key 中的所有值。
示例:HVALS myhash
HLEN key:
获取哈希表 key 中字段的数量。
示例:HLEN myhash
获取哈希表 key 中字段的数量。
示例:HLEN myhash
ZSet类型
增加
ZADD key score member [score member ...]:
将一个或多个成员元素及其分数值加入到有序集 key 当中。
示例:ZADD myzset 1 "one"
将一个或多个成员元素及其分数值加入到有序集 key 当中。
示例:ZADD myzset 1 "one"
移除
ZREM key member [member ...]:
移除有序集 key 中的一个或多个成员。
示例:ZREM myzset "one"
移除有序集 key 中的一个或多个成员。
示例:ZREM myzset "one"
修改
ZINCRBY key increment member:
有序集 key 中成员 member 的 score 值加上增量 increment 。
示例:ZINCRBY myzset 2 "two"
有序集 key 中成员 member 的 score 值加上增量 increment 。
示例:ZINCRBY myzset 2 "two"
查询
ZCARD key:
获取有序集 key 集合中元素的数量。
示例:ZCARD myzset
获取有序集 key 集合中元素的数量。
示例:ZCARD myzset
ZSCORE key member:
返回有序集 key 中,成员 member 的 score 值。
示例:ZSCORE myzset "one"
返回有序集 key 中,成员 member 的 score 值。
示例:ZSCORE myzset "one"
ZRANGE key start stop [WITHSCORES]:
通过索引区间返回有序集合指定区间内的成员。
示例:ZRANGE myzset 0 -1 WITHSCORES
通过索引区间返回有序集合指定区间内的成员。
示例:ZRANGE myzset 0 -1 WITHSCORES
ZREVRANGE key start stop [WITHSCORES]:
返回有序集中指定区间内的成员,通过索引,分数从高到低。
示例:ZREVRANGE myzset 0 -1 WITHSCORES
返回有序集中指定区间内的成员,通过索引,分数从高到低。
示例:ZREVRANGE myzset 0 -1 WITHSCORES
ZCOUNT key min max:
返回有序集 key 中,score 值在 min 和 max 之间(默认包括score值等于min或max)的成员数量。
示例:ZCOUNT myzset (0 5
返回有序集 key 中,score 值在 min 和 max 之间(默认包括score值等于min或max)的成员数量。
示例:ZCOUNT myzset (0 5
面试题
订单超时未支付
https://mp.weixin.qq.com/s/rFs-KRR_Ft5sRY5S9cBCTw
扩展
1 Redis 底层就是一个大map ,
我们读写速度不会因为数据量的大小有明显的变化.结合链表或者排队来理解
1 Redis 底层就是一个大map ,
我们读写速度不会因为数据量的大小有明显的变化.结合链表或者排队来理解
1 可以存储非关系型的数据 对象
2 存数据 可以取数据 put get
3 大小概念 基于内存大小 放更多的数据
4 持久化该怎么实现,性能足够好的前提下,服务重启了,数据应该尽量不丢
5 快 读写效率高
数据库 存储数据的仓库
2 存数据 可以取数据 put get
3 大小概念 基于内存大小 放更多的数据
4 持久化该怎么实现,性能足够好的前提下,服务重启了,数据应该尽量不丢
5 快 读写效率高
数据库 存储数据的仓库
子主题
锁的概念
锁的技术应用
一图了解ConcurrentHashMap底层原理
https://www.jianshu.com/p/da0f2a8c749d
一图了解ConcurrentHashMap底层原理
https://www.jianshu.com/p/da0f2a8c749d
业务分析
业务梳理
下单流程梳理
订单服务
用户服务
商品服务
购物车服务
支付服务
配送服务
0 条评论
下一页