- 博客(114)
- 问答 (1)
- 收藏
- 关注
原创 Aop切面编程
订单保存模型/***/@Data订单更新模型/***/@DataService业务层实现保存、更新等操作/***/@Service/*** 单纯加注解是没用的,需要定义切面*/@RecordOperate(desc = "保存订单",convert = SaveOrderConvert.class)@RecordOperate(desc = "更新订单", convert = UpdateOrderConvert.class)定义日志模型用来记录订单保存、更新信息。
2024-08-20 23:33:28
278
原创 Maven日志依赖冲突问题
(2)查看依赖关系,ctg-mq-tools这里之前和logback-classic互相指向,当时只排除了单向的一直没解决问题,后面双向都排除掉服务才正常启动。问题点:日志框架包含了多个,但是只能匹配了其中一个,当前匹配的是logging,需要排除logback-classic。(3)使用工具Maven Helper修改依赖为不包含logback-classic。
2024-08-19 00:03:24
298
原创 RocketMQ
消息中间件以前常用RabbitMQ和ActiveMQ,由于业务需要,后期业务偏向大数据,现着重学习一下RocketMQ(RocketqMQ原理同ctg-mq),后续更新Kafka。
2024-08-16 23:29:45
1057
原创 Web网站的授权oAuth2.0 & 单点登录
点击gitee按钮,跳转到gitee码云登录页,如果gitee账号登录成功,会redirect重定向到咱们自动的业务网站系统首页实体。
2024-08-15 22:30:37
440
原创 AQS和ReentrantLock源码剖析
保住原子性),(2 )让尾节点tail指向当前Node(3)让上一节点指向当前节点(存在多节点竞争,需要CAS加锁操作)双向链表初始化thread=null的节点,如果有新Node加入,(1)则优先修改Node自身的指向,指向为上一个节点(如果ReentrantLcok没拿到锁资源,则会将线程封装成Node存入,Node保存当前线程。如果准备获取锁资源,需要出队,双向链表能够更好的修改头尾节点的指向。将未获取到锁的线程,封装为Node,添加到双向链表。双向链表 (未获取锁的线程)存储没获取锁资源的线程。
2024-07-20 20:06:03
710
原创 DDD架构
如果领域服务内的业务逻辑相对复杂,我建议你将一个领域服务设计为一个领域服务类,避免由于所有领域服务代码都放在一个领域服务类中,而出现代码臃肿的问题。这里提示一下:虽然应用层和领域层都可以进行事件的发布和处理,但为了实现事件的统一管理,我建议你将微服务内所有事件的发布和订阅的处理都统一放到应用层,事件相关的核心业务逻辑实现放在领域层。以聚合为单位的代码放在一个包里的主要目的是为了业务内聚,而更大的目的是为了以后微服务之间聚合的重组。聚合内实现高内聚的业务逻辑,它的代码可以独立拆分为微服务。
2023-07-24 13:57:52
1126
原创 rabbitmq延时队列自动解锁库存
(3)如果是 4-已关闭,执行解锁库存操作,订单其他状态不做处理。解锁前判断工作单的状态是否为 1-已锁定,证明只做了锁定库存操作。(1)保存 工作单(订单号)、工作单详情(商品锁了多少库存)(4)解锁库存,修改工作单详情状态为 已解锁。如果存在,查询订单状态是否为 4-已关闭。如果订单不存在,表示已回滚,不做处理。(2)把上面的数据给mq发一份。不存在代表已回滚,不做处理。(1)判断工作单是否存在。(2)查询订单是否存在。
2023-07-14 00:12:09
3279
原创 订单结算页+下单业务
一般的收货地址都是多个,使用时选中一个,所以收货地址使用List集合封装购物车商品也是多个,使用List集合封装查询每个商品是否有库存,显示是否有货,使用Map封装使用BigDecimal计算,算出每个商品的总价(价格*件数)然后求和,最后扣除优惠价格得到结算价,还可以做积分业务。
2023-07-11 20:18:40
360
原创 rabbitmq消息确认机制
默认是ack,consumer只要拿到消息就会自动确认,服务端就会删除queue中的消息,如果业务出现问题只有部分消息签收成功,剩余未签收的消息也会删除,为了能保存消息,需要设置为客户端手动确认签收。如果exchange有消息没有成功发送至queue,就会执行RuturnCallback,例:routing key错误导致发送消息到队列失败。如果服务重启,未签收的消息就会加入queue重新发送:Unacked ===> Ready。设置手动ack签收之后,如果有消息没有签收(签收失败),会显示未签收。
2023-07-01 17:52:49
2097
原创 购物车业务
此方法是将商品数据存入redis,这里选用redis是因为添加购物车操作会频繁的交互数据库,但是redis的持久性有没有数据库好,所有需要增强redis的持久性,redis存数据会使用序列号操作转成字符流进行保存,我们查询数据和获取都不方便,这里直接转换为JSON格式进行存储。如果不指定线程池,默认使用 ForkJoinPool,是守护线程,主线程结束,线程池关闭,自定义线程池的需要手动关闭,为什么自定义线程后,调用线程却是调用 ThreadPoolExecutor?为什么使用同一个线程池?
2023-06-29 18:42:44
690
原创 Cookie创建临时用户
例:拦截器 —> controller —> service —> dao 都是同一线程。每个请求tomcat会开一个线程,执行当前请求 直到结束。(1)自定义拦截器规则。(2)将拦截器放入容器。
2023-06-27 20:32:14
866
原创 Spring Session使用
解决Domain子域名无法获取session数据的问题/*** 自定义session的使用范围——Domain} /*** 自定义redis序列化方式为json,原来是Serializable} }
2023-06-25 12:56:12
639
原创 OAuth2:使用Gitee第三方授权
传入上一步获取的code码,client_id,redirect_uri,client_secret。传入client_id(创建应用获得)、redirect_uri(需要通过第三方授权跳转的url)
2023-06-22 16:07:38
1403
原创 异步编排CompletableFuture使用
*** int corePoolSize, 核心线程数* int maximumPoolSize,最新线程数* long keepAliveTime, 空闲线程剩余时间* TimeUnit unit,时间单位* BlockingQueue workQueue 阻塞队列* ThreadFactory threadFactory, 线程工厂* RejectedExecutionHandler handler 拒绝策略。
2023-06-19 16:31:12
237
原创 分组函数group by使用技巧
进行group by分组的字段会变成一条记录,那么想要分组成功,就必须保证一对一的关系,输出是一条记录,所以需要将未进行分组的字段使用聚合函数(count ,avg,sum…
2023-06-15 15:56:00
478
原创 Kibana数据迁移
还可以通过设定 doc_values 为 true,index 为 false 来让字段不能被搜索但可以用于排序、聚。默认 true,如果为 false,表示该字段不会被索引,但是检索结果里面有,但字段本身不能。默认 true,设置为 false,表示不可以做排序、聚合以及脚本操作,这样更节省磁盘空间。做dsl聚合操作时查询不了数据,查看映射发现字段设置了不进行索引,不参与聚合。不删除数据的情况下修改mapping映射,使用数据迁移。
2023-06-08 12:18:20
419
1
原创 商城检索 DSL
match会计算热度评分,filter不计算分数效率更快,所有把不需要热度评分的字段放大filter。bool复合查询,must必须,全文检索字段用 match,其他非 text 字段匹配用 term。查询attrs属性下嵌入的属性attr_id需要使用nested 嵌套查询。全文检索字段用 match,其他非 text 字段匹配用 term。“attrValue” : “高通(Qualcomm)”品牌是可以多选的,检索条件为品牌id的集合。检索字段:属性id、属性值。检索字段:商品sku标题。
2023-06-07 20:18:16
562
原创 Spring Cache
key的生成指定生成缓存的key:key属性指定,接收一个Spel指定缓存的数据的存活时间:配置文档中修改存活时间将数据保存为json格式。
2023-06-05 23:20:13
990
5
原创 redis缓存同步最新数据的解决方案
用户a用户b拿到同样的缓存数据,用户a更新完数据db-1然后删掉缓存,用户b此时更新操作较慢,此时用户c读数据,发现缓存没有数据,就去查数据库最新数据db-1,此时用户b的数据并未更新完成,然后用户c取出db-1,所以导致缓存的数据不是最新的数据。,读写锁防止并发脏数据,缓存无法读到最新的数据,配合缓存的过期时间就能保证缓存能一直保存最新睡觉,但是只能保证缓存的数据的一致性,不能保证实时同步最新数据,所有需要频繁更改的数据就不用使用缓存了,直接查数据库就行。
2023-06-05 17:53:57
478
1
原创 分布式锁实现原理
本地锁synchronized只能锁住当前服务进程,一个本地锁只能锁一个服务,如果是分布式服务情况下使用本地锁,那么多少服务就会有多少进程同时执行,就是去了锁的效果,为了到达分布式情况下一把锁能同时锁住全部服务,一次只放行一个进程那么就必须使用分布式锁。解决办法:set锁时,value用使用uuid,这样每个进程就只能释放自己的锁,那么删除锁时就需要根据uuid判断是否是自己的锁再进行删除。解决办法:set锁时指定过期时间,如果业务出现异常,一定时间后锁会自动释放锁。
2023-06-04 12:54:08
594
原创 redis缓存穿透、缓存雪崩 、缓存击穿
高并发情况下查询时,因为key设置相同的过期时间而key集体失效 解决办法:给key设置随机过期时间,防止集体失效 set(“categoryJson”,s,1,xxx)高并发情况下查询缓存不存在的数据导致并发查数据库 解决办法:查询数据库结果为null时,在缓存中设置不为null的空值(0,1),并设置过期时间,保证缓存能查到该数据。原有的失效时间基础上增加一个随机值,比如 1-5 分钟随机,这样每一个缓存的过期时间的。有对这个 key 的数据查询都落到 db,我们称为缓存击穿。
2023-06-04 00:50:41
454
原创 为什么添加缓存要在释放锁之前?
单体服务本地锁测试成功,如果是分布式服务使用单体锁synchronized,那么多少服务实例就会有多少进程,虽然体量不大,但是未达到加锁的目的,为了能更好的解决缓存击穿问题,分布式情况下就不能使用单体进程锁了,必须使用分布式锁。预期结果:只查询一次数据库,根据逻辑,如果控制台只打印一次。测试成功,只打印了一次“当前进程锁查询了数据库”线程锁测试失败,两次查询数据库,打印了两次。修改代码,在锁释放前存入redis。情况redis缓存,再次测试。
2023-06-04 00:28:29
358
原创 商品上架业务
(1)spu与sku设计成一个索引,通过查询spu就能查询到每一条具体的sku数据,缺点是存入es数据量庞大,占用空间大(优先考虑)从查询思路出发,查询商品信息是根据spu查sku,核心是sku,又因为spu与sku是一对多的关系,所有我们存储检索数据有两种方式。(2)spu与sku分开,单独索引,查询时先查spu,然后再查出具体sku,虽然存入es数据量不大,但是查询效率低。检索商品的名字,如“手机”,对应的 spu 有很多,我们要分析出这些 spu 的所有关联属性,
2023-05-31 21:56:39
675
原创 ElasticSearch嵌套查询
(1)按年龄进行分组 --> 每个年龄段再按性别M,F分组 --> 再求出每个性别的薪资平均值。(2)求出每个年龄的评价薪资。
2023-05-29 11:18:01
309
原创 仓储服务-采购业务
使用feign调用远程服务时,会出现feign返回值LinkedHashMap无法转换实体类异常,因为feign使用的httpClient是用LinkedHashMap封装数据的,所有不能强转为实体类,可以直接从LinkedHashMap中取值返回即可,或者使用ObjectMapper转换类型。(1) 合并时如果未选择合并的采购单,则先新建采购单然后合并到新建的采购单。(3)根据采购单id查出采购需求,修改采购需求的状态为正在采购。(1)筛选出采购单状态为 新建或者已领取的采购单。
2023-05-26 11:36:31
904
原创 配置时间格式spring:jackson:date-format:yyyy-MM-dd HH:mm:ss
【代码】配置时间格式spring:jackson:date-format:yyyy-MM-dd HH:mm:ss。
2023-05-23 13:22:50
321
1
空空如也
记录的笔记,我就修改了下标题,然后发布成功了,然后我再打开就没了
2021-09-17
TA创建的收藏夹 TA关注的收藏夹
TA关注的人