- 博客(69)
- 收藏
- 关注
原创 小程序项目业务逻辑回忆5
用户转增接收票劵、用户接收票劵业务 当且仅当order_items门票-订单关联表中票劵状态code_status为未激活状态门票才能转赠,转赠后更改当前拥有者的用户ID即current_owner_id.查询用户赠送记录,即原始购买人是本用户用户但当前拥有者不是本用户在数据库中查询的记录即为赠送记录,查询用户接受记录即查询原始购买人不是本用户但当前拥有者是本用户得记录.活动概况----event_overview_images活动概况图表存储概况总览介绍图片,用以用户查询活动概况页了解活动。
2024-06-22 23:20:47
503
原创 小程序项目业务逻辑回忆4
上述业务其实积分查询最合理的方式,应该是将积分获取过程分散写在各个业务中,用户激活票劵参展签到积分应及时生效,将积分明细中的积分获取过程的数据记录在一张专门记录积分明细的表中.但是为简化业务,参展二维码签到为人工验票,没有使用物联设备,情况1与情况2.1没法实时更新数据,展商入住状态status与用户展览签到状态sign_in_status是展会过去后期通过人工在后台将状态进行修改的,这与展会举办时长有关,举办时长不长人工验票更为合算,举办时长够长机器验票数据更新更为安全可靠.
2024-06-22 08:13:12
611
原创 小程序项目业务逻辑回忆3
由于用户只能激活一张会议门票,筛选order_item表中current_owner_id为本人(安全考虑,正常当前拥有者不是本人,在未激活列表中激活功能中是看不见的,但是转赠接收过程中存在时间差,及票劵状态为转赠过程中,以防万一用户激活两张票劵做的一层校验),code_status为激活状态,用户激活票劵时,首先使用该用户user_id创建signin_record表,signin_record表中门票类型ticket_type为"会议",设计数据库签到记录表signin_records。
2024-06-21 19:25:25
772
原创 小程序业务逻辑回忆2
用户下单购票时首先以user_id创建order表,然后用工具类生成订单号,更新购买时间purchase_time为当前时间、付款状态payment_status初始状态为默认状态"未付款",总价mount为该订单id下的Order_item所有discount相加,生成的订单号作为order_item的order_number进行存储,更新orginal_user_id和current_owner_id为当前user_d。更新该订单id下order_item表中票劵状态code_status为"未激活"
2024-06-21 15:07:40
469
原创 小程序项目业务逻辑回忆1
最终呈现效果:该业务活动周期内,events只有一个活动,即该小程序项目活动,在活动日程界面处,用户可以查阅项目的活动的概况和图片,并且可以分类查询该活动不同日期的不同会议,每个会议会有副标题关键词进行说明,每个会议都会专列嘉宾列表,并可展示嘉宾的详细信息,常规的会议分类与会议之间一对多,会议与嘉宾之间的多对多表间关系。不同表重复的字段用于其他业务,如我的预约,中能更快的业务逻辑查询,但书写代码时应注意数据的统一性,即新增与修改业务中业务逻辑要全面不要有丢失,否则会造成查询业务中的报错。
2024-06-14 13:28:52
511
2
原创 分布式事务-CAP定理+BASE理论+解决方案(两阶段提交+TCC事务)
Basically Available (基本可用)(允许损失部分可用性,保证核心可用即可)、Soft State(软状态)(允许出现中间状态,比如临时的不一致状态 )、Eventually Consistent(最终一致性)(软状态结束后,最终数据一致)。分布式事务的最大问题就是各子事务的一致性问题,有两种解决思路,:整个事务分为两个阶段:表决阶段(所有参与者都将本事务预提交,并将能否成功的信息反馈给协调者)+执行阶段(协调者根据所有参与者的反馈,通知所有参与者,步调一致执行提交或回滚)
2024-02-22 11:42:50
545
原创 链表-单项链表+双向链表-概念及其时间复杂度简述
链表中的某个节点是B,B的下一个节点为C,表示为B.next==C。对于查询操作,双向链表查询头尾节点的时间复杂度是O(1),平均的查询时间复杂度是O(n),给定节点找前驱结点的时间复杂度为O(1)。对于增删操作,头尾结点增删的时间复杂度为O(1),其他部分节点增删的时间复杂度是O(n),给定节点增删的时间复杂度为O(1)。插入和删除操作的时候,只有在添加和删除头节点的时候不需要遍历链表,时间复杂度是O(1),添加或删除其他结点需要遍历链表找到对应节点后,才能完成新增或删除节点,时间复杂度是O(n)。
2024-02-22 10:48:27
1271
原创 散列表Hash Table(哈希表)+散列函数+散列冲突及散列表插入、查找的时间复杂度分析
但这个键key有时不是纯数值,不能够做为数组的下标,这时就可以把这个非纯数值的key转为数值作为数组的下标,转换可以使用散列函数进行转换。当查找、删除一个元素时,我们同样通过散列函数计算出对应的槽,然后遍历链表查找或者删除,平均情况下基于链表法解决冲突时查询的时间复杂度是O(1),散列表可能会退化为链表,查询的时间复杂度就从O(1)退化为O(n),将链表法中的链表改造为其他高效动态的数据结构如红黑树,查询的时间复杂度是O(logn)。将链表法中的链表改造成红黑树,可以防止DDos攻击。
2024-02-21 23:42:58
504
原创 算法复杂度分析入门简介
与执行次数n成正比,大O表示法只需代将代码执行时长与数据规模的增长趋势表示出来即可,n很大的时候,公式里的。T(n) = (3n + 3) * 每行代码执行时长(假设每行代码执行时长相同),得出结论T(n)时间复杂读就是评估代码的执行耗时的,我们需要借助大O表示法来计算这个代码的时间复杂度.^X=n,高中数学,x记作以2为底n的对数,代码复杂度为O(log n)代码只此昂次数为3n^2 + 3n + 3 ,代码复杂度为O(n^2)传入的变量n,决定申请多少int数组空间内存,代码空间复杂度为O(n)
2024-02-21 18:49:27
361
原创 线程状态之间的变化+run、start、sleep与wait
当获取锁成功后,但由于条件不满足,调用了wait(long)方法,此时从可运行状态释放锁进入Monitor等待集合进行有时限等待,同样不占用cpu时间。当其它持锁线程调用notify()或notifyAll()方法,会按照一定规则唤醒等待集合中的有时限等待线程,恢复为可运行状态,并重新去竞争锁。当其它持有锁的线程调用notify()或notifyAll()【notifyAll唤醒所有wait线程||notify只随机唤醒一个wait线程】方法,会按照一定规则唤醒等待集合中的等待线程,回复为可运行状态。
2024-02-21 15:47:51
549
原创 yml配置文件中常见的配置及含义
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl:指定了 MyBatis 日志的实现类为 org.apache.ibatis.logging.stdout.StdOutImpl,表示日志输出到标准输出流(stdout)中。spring.datasource.druid.driver-class-name: 指定数据库连接池Druid的驱动名,后面跟${}形式写的占位符,表示会从外部配置文件或环境变量中获取到实际的驱动名.
2024-02-21 13:29:55
2506
原创 懒汉单例设计模式与饿汉单例设计模式
提供一个类方法,要保证只创建一次,在方法中创建并返回对象。单例模式即一个类确保只有一个对象,主要用于避免浪费内存。在类中定义一个类变量用于储存对象,只定义不创建。在类中自己创建一个对象,并赋值到一个变量。定义一个静态方法,返回自己创建的这个对象。:拿到对象时,对象就早已经创建好了。:第一次拿到对象时,才开始创建对象。
2024-02-20 21:12:41
497
原创 pom.xml常见依赖及其作用
这俩是Spring Cloud 和 Spring Cloud Alibaba 的依赖管理,用于集成和管理各种云原生应用开发所需的依赖项,包括配置管理、服务注册与发现、负载均衡、断路器、网关等功能。它们提供了一套完整的微服务开发工具链。r:MyBatis Plus 是 MyBatis 的增强工具,简化了 MyBatis 的开发,提供了更强大的功能和更简洁的 API,包括代码生成器、分页插件、性能分析插件等,能够大大提高开发效率和代码质量。11.org.springframework.boot 下的。
2024-02-20 19:16:48
3418
原创 反射reflecttion的入门理解+暴力反射的应用简介
上述中public void setAccessible(boolean flag),将参数改为true,就能开启暴力反射,破坏私有成员变量的封装性,获取一些正常操作获得不到的东西(实体类定义私有属性也能应用了),这也是反射的主要应用(不过使用需小心谨慎),很适合做Java的框架,主流的框架都会基于反射设计出一些通用的功能。总体就是,加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)而反射的第一步就是加载类,获取类的字节码Class对象,获取的方式有三种。
2024-02-20 14:50:42
325
原创 SpringMVC基础复习-概念+mvc配置类中代码+异常处理
springmvc整体的流程就是前端发送请求到前端控制器,前端控制器解析请求,获取访问路径和参数,并根据路径寻找并调用对应的处理器方法,如果发现方法需要参数,就给予传递到处理器代码部分,处理器业务处理后return返回值给前端控制器,前端控制器接收方法的返回值,转换格式后返回给前端。我们通常还会自定义一个统一的异常处理类来处理异常(springmvc带来的便利,不用三层代码中处理,而是直接抛给框架),实现依靠两个注解。@ExceptionHandler 标注上述类的方法上,声明当前方法可以处理哪些异常。
2024-02-20 12:53:28
572
原创 Spring基础-IOC理解及自己创建类+第三方提供的类注入的方法
上述都是自己创建的类放入IOC容器中,第三方提供的类创建的对象放入Spring容器可以使用@Bean注解,写在方法上,将方法的返回对象放入IOC中,IOC中的默认标识就是方法名,也可@Bean(“****”)自定义,这些东西要写在配置类中(@Configuration标注,表名类为配置类,spring在启动时会自动扫描加载类中的配置)。配置类上可能会有@ComponentScan(一般标注在主配置类上),注解扫描(组件扫描),指定的包及其子包下的类的注解才会被Spring扫描。
2024-02-20 01:12:57
453
原创 网络通信基础复习-CS架构与BS架构
保障了数据传输的可靠性),传输数据确认后,四次挥手断开连接(客户端发送断开连接请求,服务器端先返回响应让客户端等待,待服务器端将数据处理完毕后再返回一个响应确认断开,客户端再发送正式确认断开连接,客户端挥手2次,服务器端挥手2次。网页开发,不需要开发客户端,使用浏览器发送请求,即BS架构,通信使用的主要就是HTTP协议,HTTP协议有专门的数据格式,但是这种数据格式不用管框架会帮我们解决。就是设备中的程序在网络上与其他设备程序进行数据交互的过程就叫网络通信,比如微信聊天、淘宝的访问等都叫网络通信。
2024-02-19 15:52:19
481
原创 SpringBoot入门基础复习-基本概念+配置文件的配置、读取与多环境配置修改
使用springboot工程,要求必须去继承一个springboot提供的父工程<parent>,然后根据业务需要引入指定的starter,即导入org.springframework.boot(即Spring Boot 项目组织)下的spring-boot-starter-parent(即Spring Boot Starter Parent 项目)(内部锁定了很多常见依赖版本号,如spring-boot-test、spring-boot-test-autoconfigure等)对象的对应属性(单个)
2024-02-19 12:45:40
417
原创 SpringMVC的执行流程
3.处理器映射器HandlerMapping找到具体的处理器,可查找xml配置或注解配置,生成处理器对象及处理器拦截器(如果有),再将处理器执行链返回给DispatcherServlet.3.处理器映射器HandlerMapping找到具体的处理器,可查找xml配置或注解配置,生成处理器对象及处理器拦截器(如果有),再将处理器执行链返回给DispatcherServlet.当然现在的开发,基本都是前后端分离的开发,并没有视图这些,一般都是handler中使用Response直接结果返回.
2024-02-18 23:37:13
686
原创 RabbitMQ实现延迟消息的方式-死信队列、延迟队列和惰性队列
Lazy Queues惰性队列,惰性队列在接收到消息后会直接存入到磁盘中(而非内存),并且在消费者要消费消息时才会从磁盘中读取到并加载到内存,基于这个特性多以惰性队列支持百万条消息的存储。可用于解决消息堆积问题(当生产者发送消息的速度超过消费者处理消息的速度,会导致队列中的消息堆积,直到队列存储消息达到上限,达到上限后再发送的消息就会成为死信,可能会被丢弃,这就是消息堆积问题)(解决消息堆积问题还可以增加消费者,提高消费速度来解决,但是惰性队列思路,将消息持久化到硬盘上提高堆积上限更具有实际意义)。
2024-02-16 19:49:01
1130
1
原创 Spring中的事务实现、失效场景即AOP的相关概念理解
2.方法抛出检查异常,报错也会导致事务失效。主要思路:使用aop中的环绕通知,用切点表达式找到记录日志的方法,也可以自定义注解(@annotation:指定一个注解,凡是标有此注解的方法都是切点,更推荐),然后通过环绕通知的参数获取请求方法的参数,比如类名、方法名、参数、返回值、异常信息、日志结果等,获取到这些参数后,保存到数据库。3.方法上不是public修饰的,也会导致事务失效(原因:spring为方法创建代理、添加事务通知前提条件都是方法是public的),解决方法:方法修饰词改成public。
2024-02-16 12:15:59
511
原创 消息队列RabbitMQ-使用过程中面临的问题与解决思路
这种机制给每一个消息指定了唯一的ID,消息从生产者到交换机、从交换机到队列中的阶段都会返回一个结果,消息从生产者到交换机会通过返回一个布尔值来反馈消息是否送到了交换机,即发送者确认publisher-confirm。,默认的是直接丢弃消息,也可以设置将其失败后重新入队(不建议,没意义),推荐的是将失败的消息投递到指定的队列,这个队列专门存放异常消息,后续方便人工处理。生产者到交换机的过程、交换机到队列的过程、消息队列中、消费者接收消息的过程中,这些过程中消息都可能会丢失。2.指定消息重试失败的。
2024-02-15 20:46:58
1177
原创 消息中间件管理系统-RabbitMQ及其两类传输模型
直接广播模式:Fanout Exchange的交换机将消息发送给哪个队列,生产者不知道,但是在正常的微服务项目中,需要生产者消息被指定的消费者也可理解不同的队列消费,因此产生了Direct Exchange,Direct Exchange交换机可以通过发送消息指定RoutingKey消息队列绑定时指定BindingKey,来实现不同消息类型的消息通过队列将消息发送给指定的消息队列也就发送给了自定的消费者。生产者生产消息,将消息投递到交换机,至于交换机将消息发送给哪个队列,生产者不知道。
2024-02-15 17:41:56
907
原创 文件上传-第三方服务阿里云OSS
阿里云对象存储 OSS 是一款海量、安全、低成本、高可靠的云存储服务,提供 99.995 % 的服务可用性和多种存储类型,适用于数据湖存储,数据迁移,企业数据管理,数据处理等多种场景,可对接多种计算分析平台,直接进行数据处理与分析,打破数据孤岛,优化存储成本,提升业务价值。Bucjet名称、地域、AccessKey秘钥的id和密码等信息为方便后续修改,应将其写到配置文件中,通过创建配置类将其读取,在工具类中将其注入并通过@Import注解将其放到IOC容器中。
2024-02-14 15:18:52
1199
原创 Validation-参数校验框架
Null、@NotNull 标注范围最广,可标注任意元素上,@NotBlank 只可标注在字符串类型上,@NotEmpty标注范围比@NotBlank大一些,可标注在字符串、集合、数组、map类型上。2.@Min(1)、@Max(100)、 @Range(min = 1,max = 100),其中数值只是举例说明,表明被标注的属性值只能≥1、≤1、和在这个范围内。5.@Email 被标注的元素必须是电子邮箱地址,@URL 被标注的元素必须是一个正确的网址。
2024-02-13 17:22:16
926
原创 线程-线程的创建方式与线程池基础知识
指的是当核心线程数已满,新任务到达时,存储线程的队列,常见的有下面几种:基于数组结构的有界阻塞队列ArrayBlockingQueue、基于链表结构的有界阻塞队列LinkedBlockingQueue、具有有限级别的阻塞队列PriorityBlockingQueue、不储存元素的阻塞队列,每个插入操作都必须等待一个移出操作SynchronousQueue。创建线程有四种方式,继承Thread类、实现Runnable接口、实现Callable接口、线程池创建线程,常用的还是线程池创建线程。
2024-02-12 13:09:58
571
原创 MySQL数据库-MVCC多版本并发控制
undo log主要作用是记录回滚日志,存储老版本数据,在内部会形成一个版本链,在多个事务并行操作某一行记录,记录不同事务修改数据的版本,通过roll_pointer指针形成一个链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。因此,RC 隔离级别下的快照读会在每次执行时生成新的 ReadView,而 RR 隔离级别下的快照读则会在事务中第一次执行时生成 ReadView 并在后续复用,这两种隔离级别下的快照读行为差异会导致在多版本并发控制中访问的数据结果不同。
2024-02-11 20:26:18
846
原创 MySQL数据库-索引概念及其数据结构、覆盖索引与回表查询关联、超大分页解决思路
select name,gender from user where name =“张三” 这个为非覆盖索引,主要因为gender需要通过name查询到id,在用id去查gender,也就是需要回表查询,所以查询语句避免使用select *,查询字段太多大概率会回表查询。,就是指select查询语句中使用了索引,在返回的列,必须在索引中全部能够找到,如果我们使用id查询,它会直接走聚集索引查询,一次索引扫描,直接返回数据性能高。如果按照二级索引查询数据的时候,返回的列中没有创建索引,可能会触发回表查询。
2024-02-11 12:55:48
804
原创 redis集群方案
比如说网络原因,redis的主节点从节点和哨兵处于不同的网络分区,哨兵没感知到主节点的心跳,重新选举主节点,这样就有两个主节点,这就是脑裂现象。从节点携带自己的repication id和offset偏移量请求主节点同步数据,主节点会根据是否与从节点是同一个replication id来判断从节点是否是第一次请求,如果replication id不是同一个,说明是第一次同步,主节点会把自己的replication id和offset发送给从节点,让从节点与主节点信息保持一致。一般单节点不超过10G内存。
2024-02-10 16:42:27
403
原创 Redis分布式锁
来实现,redis的核心部分是单线程运行的,用了setnx命令之后,只能有一个客户端对某一个key设置值,在没有过期或删除key的时候其他客户端是不能设置这个key的,但是redis的setnx不好控制锁的有效时长问题(锁超时问题:一个线程获取到锁之后,线程阻塞了,无法释放锁,其它线程也就拿不到锁了),现在都是使用。(setnx目前不支持,即同一线程多次获取锁的场景,可能会死锁),避免了死锁的产生.重入会在内部判断是否是当前线程持有的锁,如果是就会计数加一,释放锁就会计数减一.看门狗watch dog。
2024-02-10 12:32:32
372
原创 redis过期淘汰策略、数据过期策略与持久化方式
no-eviction禁止驱逐数据、vilatile-lru已设置过期时间数据集选择最近最少使用数据淘汰、volatile-ttl已设置过期时间数据集选择将要过期数据淘汰、volatile-random已设置过期时间数据集中任意选择数据淘汰、volatile-lfu已设置过期时间数据集选择最不经常使用数据淘汰、allkeys-lru所有数据集最近最少使用数据淘汰、allkeys-random所有数据集任意数据淘汰、allkeys-lfu所有数据集中最不经常使用数据淘汰。redis的过期淘汰策略。
2024-02-10 11:33:04
1081
原创 redis双写一致
cannal服务会把自己伪装成mysql的从节点,数据库更新后,canal会读取binlog数据,canal客户端获取到数据,会更新缓存。可用redisson实现读写锁,读的时候添加读锁,读共享,不能写。更新数据的时候,添加写锁,读写都互斥。mq同步:程序在更新完mysql后,投递消息到中间键mq,一个程序监听mq,获得消息后更新redis中的数据。排它锁底层可以使用setnx,也可以使用redisson框架(分布式环境中如何实现排他锁)redis双写一致,指的是redis缓存与mysql数据同步。
2024-02-09 11:27:50
794
原创 Git、github与gitee码云
SSH安全外壳协议,需本地生成秘钥对(公钥和私钥),实现免密登录,实现步骤:本机电脑cmd输入ssh-keygen -t rsa生成秘钥对,按黑窗口提示找到秘钥对位置,id_rsa为秘钥,id_rsa.pub为公钥,公钥配置在我的码云公钥上。Git服务端和客户端安装成功后,右键tortoiseGit小乌龟->设置->网络->SSH客户端配置好ssh.exe安装路径,如果私钥位置保存位置为计算机默认的地址,则git访问远端默认带有私钥。远程仓库国际主流githut,但外网速度问题,国内可使用码云gitee。
2024-02-08 18:39:44
2031
原创 SpringCache缓存快速实现注解
CacheEvict(value = "userCache", key = "#id") 清理指定key的缓存@DeleteMapping("/user/{id}")spring-boot-starter-data-redis 与 spring-boot-starter-cache。SpringCache是一个框架,只需要添加一个注解,就能实现缓存功能的实现,常用的就是Redis的缓存实现。在方法执行前查看缓存中是否有数据,如果有直接返回,如果没有,将调查方法查询数据库结果返回值放入到缓存中。
2024-02-07 18:56:35
870
原创 MySQL优化及索引
MySQL优化一般会从以下几方面进行入手:引擎(MySAM、InnoDB等引擎的选择)、表设计(可以反三范式添加冗余字段提高检索效率)、字段的数据类型(数值型字段优于字符串字段)、sql书写、索引等方面进行优化,其中索引优化最为常见。
2024-02-07 16:10:40
1035
原创 Docker
linux部署软件时经常出现软件版本不统一的情况,为了版本控制着和跨平台性,现在企业中大多都是用docker在服务器上快速来部署软件.
2024-02-06 21:47:09
1381
1
原创 Spring是怎么解决循环依赖的
6.循环依赖检测:在创建其他bean时,如果发现有循环依赖的情况,spring会从singletonFactories缓存中获取之前创建的空对象,并将其返回给依赖的bean.循环依赖:循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环.比如A依赖于B,B依赖于A。3.提前暴露:在属性注入完成后,Spring会将该对象提前暴露给其他的Bean,以便其他的Bean可以引用到该对象.循环依赖在spring中是允许存在的,spring框架一句三级缓存已经解决了大部分的循环依赖。
2024-02-06 14:33:24
438
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人