自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(103)
  • 收藏
  • 关注

原创 通过postgresql的Ltree字段类型实现目录结构的基本操作

注意这里的path!是id拼起来的具有目录层次的!最后插入的数据大概是这样[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-449koFvW-1691660171266)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20230810172712617.png)]这里我们的id是mybatisPuls提供的UUID,并且我们的path字段采用祖id+爷id+父id+子id的结构。

2023-08-17 17:10:18 467

原创 基于Aop实现Spring事务管理详解

这样,在addUser方法执行过程中,如果发生异常,事务会自动回滚,确保数据的一致性。Spring通过AOP拦截器实现了对事务方法的拦截和增强,然后根据方法的声明式事务设置,在AOP拦截器中启动或加入事务,最终控制事务的提交或回滚。在Spring中,AOP和事务管理可以同时使用,通过在事务管理中配置AOP拦截器,可以在事务管理的基础上实现更细粒度的控制。这样,在程序运行时,当调用UserService的addUser方法时,Spring AOP会拦截该方法的调用,并在增强逻辑中启动和管理事务。

2023-05-12 23:06:34 1380 2

原创 SpringBoot基于Hibernate Validator的JSR303校验

在controller方法参数中使用 @Validated使校验生效。在模型类的属性的验证注解中增加groups属性:示例。多个接口共用一个模型类:分组校验 定义一些常用组。在接口的@Validated注解中指定是哪个组。在全局异常中对JSR303错误信息解析。在实体类的属性中使用注解设置参数校验。

2023-04-19 15:38:05 302

原创 springboot全局异常处理学习

【代码】springboot全局异常处理学习。

2023-04-17 23:14:44 189

原创 redis中的持久化操作AOF与RDB区别

总结:RDB速度上和资源的利用上具有优势,但在安全性上AOF更加稳妥。持久性:是指将数据写入持久存储,例如固态磁盘 (SSD),还有自己的一点小理解(理解有误希望您能纠正)。以上来自redis官网。

2023-04-08 23:05:22 317

原创 微服务--docker学习

什么是Dockerfile:Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。需求说明:进入nginx容器内部,已经知道nginx的html目录所在位置(/usr/share/nginx/html,需要把这个目录挂载到html这个数据卷上,方便操作其中的内容。创建一个nginx容器,修改容器内的html目录内的index.html内容。镜像是将应用程序及其需要的系统函数库,环境,配置,依赖打包而成。

2023-02-22 00:11:07 93

原创 微服务--Gateway网关学习

Zuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。请求路由后,会将当前路由过滤器和DefaultFilter,GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器。请求进入网关会碰到三类过滤器:当前路由的过滤器,DefaultFilter,GlobalFilter。全局过滤器的作用也是处理一切网关的请求和微服务响应,与GatewayFilter的作用一样。

2023-02-09 21:39:59 1126

原创 微服务--Feign学习

Feign的介绍:Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的POJO,默认的Feign配置都放到这个模块中,提供给所有消费者使用。方式一(继承):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。Feign的性能优化-连接池配置。

2023-02-09 21:35:26 353

原创 微服务技术--Nacos与Eureka

负载均衡原理:请求会被LoadBalancerInterceptor负载均衡拦截器拦截,会得到请求中的服务名称把它交给RibbonLoadBanlancerClient然后会把服务交给DynamicServerListLoadBalancer去eureka里拉取服务列表得到多个服务的信息,然后找到IRule从服务列表中基于规则做出选择挑一个出来服务,将其返回到RibbonLoadBanlancerClient中然后替换url中userservice得到真实的ip然后发起http请求。

2023-01-14 21:46:31 1479

原创 大三寒假人生第一次面试失败

第四题:我当时答的是double(平时没注意,随意答的),后面百度才发现要用decimal数据类型,Decimal是专门为财务相关问题设计的数据类型,它实际上是以字符串的形式存放的,可在定义时划定整数部分以及小数部分的位数。第19题:&&的短路功能,当第一个表达式的值为false的时候,则不再计算第二个表达式;8大基本数据类型:byte,short,int,long,boolean,char,float,double。这是我错误的代码(很蠢)Map中的元素,无序,键不重复,值可重复,可以有一个空键。

2023-01-03 14:49:08 7717 11

原创 maven-repo/org/springframework/cloud/spring-cloud-netflix-eureka-server/4.0.0/spring-cloud-netflix-e

原因:我搭建eureka服务模块中springCloud版本为2022.0.x对应的springboot为3.0,而。所以你需要降低你的boot版本,因此你需要降低你的Cloud版本。在搭建eureka注册中心出现jdk版本不匹配。3.0的boot只支持jdk17及以上。

2022-12-22 23:31:31 355

原创 微服务技术--认识微服务

注册RestTemplate:在order-service的模块中注册RestTemplate。拆分服务之后产生的问题:在8080端口服务查询订单时并没有将用户信息一起返回。SpringCloud是目前国内使用最广泛的微服务框架。SpringCloud与SpringBoot的版本兼容性关系如下。这样就可以在查询订单消息的同时查询用户信息,解决了微服务远程调用。微服务是一种良好架构设计的分布式架构方案。在查询订单时发送http请求用户信息。

2022-12-22 22:00:38 754

原创 黑马点评--用户签到

Redis是利用string类型数据结构实现BitMap,因此最大上限512M,转换为bit则是2^32个bit位。BITFIELD:操作(查询,修改,自增)BitMap中bit数组中的指定位置(offset)的值。我们按月来统计用户签到信息,签到记录为1,未签到则记录为0.(布隆过滤器就是采用这种结构)从最后一次签到开始向前统计,直到遇到第一次未签到为止,计算总的签到次数,就是连续签到天数。BITOP:将多个BitMap的结果做位运算(与,或,异或)随后右移1位,下一个bit为就成为最后一个bit为。

2022-11-29 23:47:34 865

原创 黑马点评--附近商铺

Redis在3.2版本加入了对GEO的支持,允许存储地理坐标消息,帮助我们根据经纬度来检索数据。GEOPADIUS:指定圆心,半径,找到该圆内包含的所有member,并按照与圆心之间的距离排序后返回。GEOSEARCH:在指定范围内搜索member,并按照与指定点之间的距离排序后返回。GEOADD:添加一个地理空间信息,包含:经度(longitude),纬度(latitude),值(member)GEOSEARCHSTORE:与GEOSEARCH功能一致,不过可以把结果存储到一个指定的key。

2022-11-29 18:02:11 916

原创 黑马点评--好友关注

本例中的个人页面,是基于关注的好友来做Feed流,因此采用Timeline的模式。需求:利用Redis中恰当的数据结构,实现共同关注功能。为用户持续的提供”沉浸式”的体验,通过无限下拉刷新获取新的信息。**智能排序:**利用智能算法屏蔽掉违规的,用户不感兴趣的内容。Feed流中的数据会不断更新,所以数据的角标也在变化,因此不能采用传统的分页模式。:不做内容筛选,简单的按照内容发布时间排序,常用于好友或关注。需求:在个人主页的“关注”卡片中,查询并展示推送的Blog的信息。分页查询用户博客信息。

2022-11-28 17:37:11 950

原创 黑马点评--达人探店

查看探店笔记:点赞功能:需求:实现步骤:给Blog类中添加一个isLike字段,标示是否被当前用户点赞修改点赞功能,利用Redis的set集合判断是否点赞过,未点赞过则点赞数+1,已点赞过则点赞数-1修改根据id查询Blog的业务,判断当前登录用户是否点赞过,赋值isLike字段修改分页查询Blog业务,判断当前登录用户是否点赞过,赋值给isLike字段判断该blog用户是否点赞点赞排行榜需求1:把笔记点赞的人显示出来,比如最早点赞的TOP5,形成点赞排行榜不同集合比较:由于set集

2022-11-26 14:18:33 513

原创 黑马点评--Redis消息队列

不过要注意的是,当队列中没有消息时RPOP或LPOP操作会返回null,并不像JVM的阻塞队列那样会阻塞并等待消息。修改之前的秒杀下单Lua脚本,在认定有抢购资格后,直接向stream.orders中添加消息,内容包含voucherId,userId,orderId。消息队列(Message Queue),字面意思就是存放消息的队列。Stream是Redis5.0引入的一种新数据结构,可以实现一个功能完善的消息队列。消息队列(Message Queue),字面意思就是存放消息的队列。

2022-11-24 23:58:41 599

原创 黑马点评--Redis优化秒杀

如果采用异步思路就能:在redis中判断秒杀库存和校验一人一单,在tomcat中读取队列中的信息对数据库进行操作。在redis返回结果,Tomcat判断生成id并返回。思路,在多线程同时秒杀时,由于判断秒杀库存和校验一人一单用时短,而减库存和创建订单时间耗时长。基于Lua脚本,判断秒杀库存,一人一单,决定用户是否抢购成功,开启线程任务,不断从阻塞队列中获取信息,实现异步下单功能。如果抢购成功,将优惠劵id和用户id封装后存入阻塞队列。新增秒杀优惠券的同时,将优惠券保存到Redis中。

2022-11-23 20:54:21 465

原创 黑马点评--分布式锁

​ 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。

2022-11-20 15:41:48 773

原创 黑马点评--优惠卷秒杀

在VoucherController中提供一个接口,可以添加秒杀优惠券:http://localhost:8081/voucher/seckill。通过加锁可以解决在单机情况下的一人一单安全问题,但是在集群模式下就不行了。现在,用户请求会在这两个节点上负载均衡,再次测试下是否存在线程安全问题。需求:修改秒杀业务,要求同一个优惠券,一个用户只能下一单。2.乐观锁:不加锁,在更新时判读是否有其它线程在修改。CAS法(CompareAndSet)1.悲观锁:添加同步锁,让线程串行执行。

2022-11-16 13:06:36 1003 2

原创 黑马点评第二个模块---商户查询缓存

线程1查询缓存未命中,查询数据库之后要写入缓存时,有一个线程2插入进来更新数据库,由于缓存本来就没有所以删除缓存也没有。缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务比较复杂的key突然失效,无数的请求访问会在瞬间给数据库带来巨大的冲击。方法3:根据指定的key查询缓存,并反序列化为指定类型,利用缓存空值的方式解决缓存穿透问题。线程1删除缓存之后要更新数据库,同时线程2查询缓存未命中,然后查询数据库,写入缓存。代码改变ShopServiceImpl。

2022-11-13 17:57:21 528

原创 黑马点评第一个模块---短信登录实现

session共享问题:多台Tomcat并不共享session存储空间,当请求切换到不同tomcat服务时导致数据丢失的问题。新增一个拦截器(RefreshTokenInterceptor)去拦截所有请求,在每次请求之前刷新token。登录验证功能:请求中Cookie携带sessionId。MvcConfig中新增拦截器。SpringMvc配置拦截器。显然redis就是完美的。存入了UserDTO对象。以及请求拦截器的改变。

2022-11-09 20:05:24 1044

原创 ThreadLocal源码解析学习

每一个ThreadLocal都创建一个Map,然后用线程作为Map的key,要存储的局部变量作为Map的value,这样就能达到给个线程的局部变量隔离的效果。ThreadLocal的设计是:每一个Thread维护一个ThreadLocalMap,这个Map的key是ThreadLocal实例本身,value才是真正要存储的值Object。这个理解其实是不对的。ThreadLocalMap是ThreadLocal的内部类,没有实现Map接口,用独立的方式实现了Map的功能,其内部的Entry也是独立实现。

2022-11-08 13:05:04 325

原创 ThreadLocal类与synchronize关键字区别----一个简单示例

​ 这里我们先构建一个简单的转账场景:有一个数据表account,里面有两个用户Jack和Rose,用户Jack给Rose转账。区别:虽然ThreadLocal模式与synchronize关键字都用于处理多线程并发访问变量,不过两者处理问题的角度和思路不同。案例中的转账涉及两个DML操作:一个转出,一个转入。下面用synchronize和ThreadLocal分别实现同样的功能。用一个案例去了解ThreadLocal具体运用在什么场景中。案例的实现主要用mysql数据库,jdbc和c3p0框架。

2022-11-06 16:53:26 413

原创 Redis客户端RedisTemplate入门学习

在之前使用jsonRedisSerializer序列化器时产生的@class这个字段会造成资源浪费,为了节省内存空间,我们并不会使用JSON序列化器来处理Value,而是统一使用String序列化器,要求只能存储String的key和Value。由于StringRedisTemplate的key和value的序列化方式默认就是String方式。SpringData是spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis。

2022-11-03 11:56:31 491

原创 Redis学习基础知识

Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipLIst)加hash表。Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。既可以支持正向检索和也可以支持反向检索。Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。

2022-11-01 17:48:11 455

原创 二叉搜索树的简单实现以及前中后序遍历,层序遍历

很多情况下,我们可能需要像遍历数组一样,遍历树,从而拿出树中存储的每一个元素,由于树状结构和线性结构不一样,它没有办法从头开始依次向后遍历,所以存在如何遍历,也就是按照什么样的搜索路径进行遍历的问题。​ 先访问左子树,中间访问根节点,最后访问右子树。​ 先访问根结点,然后再访问左子树,最后访问右子树。​ 先访问左子树,再访问右子树,最后访问根结点。

2022-10-26 14:19:09 532

原创 栈的简单实现--Java

定义:栈是一种基于先进后出(FILO)的数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。我们称数据进入到栈的动作为压栈,数据从栈中出去的动作为弹栈。

2022-10-21 10:14:46 232

原创 约瑟夫环问题--Java

据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第。

2022-10-20 23:02:16 97

原创 线性表的顺序表和链表简单实现--Java

当我们使用SequenceList时,先new SequenceList(5)创建一个对象,创建对象时就需要指定容器的大小,初始化指定大小的数组来存储元素,当我们插入元素时,如果已经插入了5个元素,还要继续插入数据,则会报错,就不能插入了。顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组连续的存储单位,依次存储线性表中的各个元素,使得线性表在逻辑上相邻的数据元素存储在相邻的物理单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系。这个问题有没有解决方案呢?

2022-10-17 22:15:31 375

原创 常见的排序算法--Java

它的基本思想是:通过一趟排序将要排序的数据分隔为两个独立的部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。每一次遍历的过程中,都假定第一个索引处的元素是最小值,和其他索引处的值依次进行比较,如果当前索引处的值大于其他某个索引的值,则假定其他某个索引处的值为最小值,最后可以找到最小值所在的索引。

2022-10-10 22:47:03 199

原创 redis基本数据类型以及常用操作学习

Redis sorted set 有序集合是String类型元素的集合,且不允许重复的成员。redis正是通过分数来为集合中的成员进行从小到大排序。有序集合的成员是唯一的,但分数却可以重复。移除并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。向有序集合添加一个或多个成员,或者更新已存在成员的分数。将哈希表key中的字段field的值设为value。设置指定key值,并将key的过期时间为10秒。获取存储在哈希表中的指定字段的值。移除有序集合中的一个或多个成员。

2022-10-03 13:53:43 422

原创 虚拟机linux没有ip

就是修改ifcfg-ens160文件(我的网卡是ens160,你需要查看你自己的网卡是什么)自动获取ip,但是缺点就是你每次重启虚拟机都需要dhclient获取ip。:通过修改网络初始化设置,设定网卡在系统启动时初始化。这里可以看见我们的ens160网卡没有ip。改完之后重启,就可以正常获取ip了。修改内容:ONBOOT=yes。

2022-09-28 21:31:03 1945

原创 redis缓存失效问题

一个正常的访问流程1.缓存雪崩:redis缓存key同一时间大量失效,导致大量请求全部打到数据库,造成数据库挂掉。1.设置缓存的失效时间,让它2不在同一时间失效。在设置缓存的时候,随机初始化失效时间。这样就能避免缓存在同一时间失效,把所有请求都打到数据上。2.redis一般都是集群部署,可以将热点key放到不同的节点上。让热点的缓存,平均的分布在不同的节点上。3.不设置缓存失效时间,使其永远不失效。4.去跑定时任务,让它定时刷新缓存,避免缓存失效。2.缓存穿透。

2022-09-21 11:11:41 2093

原创 Springboot-redis学习第一天

1:如果你需要下Windows版redis可以在我的仓库中。通过:redis-cli.exe启动客户端。安装Redis环境,并练习数据类型相关命令。更改protected-mode yes为。requirepass 要很长的密码。注释掉bind 127.0.0.1。更改daemonize no为。3.启动,并指定配置文件。在redis目录中通过。启动redis服务器。

2022-09-17 22:07:57 350

原创 用mybatisplus实现一个简单的crud操作

根据 SpringBoot 中的数据访问章节中的案例,修改为 SpringBoot + MyBatisPlus 来实现用户的CRUD功能。

2022-09-15 23:07:00 190

原创 Spring-boot-starter-actuator的可视化spring-boot-admin

然后新建一个springboot项目导入spring-boot-admin-starter-server,将其作为我们的监控服务器。总结:Spring-boot-starter-actuator 通过请求可以获取被监控服务器的配置(前提是对外开放信息)基于Spring-boot-starter-actuator的可视化工具:spring-boot-admin。在被监控的服务器中导入spring-boot-admin-starter-client。然后可以观察到我们的应用被监控服务器所监控。

2022-09-13 22:43:09 873

原创 kafka在Windows中启动失败问题The Cluster ID xNzZgyUhQcutut7QneTREw doesn‘t match

第一次学Kafka,在Windows中安装。在成功启动zookeeper注册中心之后Kafka一直闪退连接不上,我在网上一直找解决方法全是liunx。不断尝试最后发现是zookeeper启动之后在D:\kafka_2.12-2.8.0\logs中产生的日志文件消息。默认是tmp/logs,你需要改成你自己logs文件的目录,使Kafka在启动时能读取到zookeeper的信息。Kafka在启动时读取不到,在config文件目录中server.properties文件中。

2022-09-13 00:56:23 755

原创 Springboot2.7.3版本自动装配JmsMessagingTemplate失败问题

在使用Springboot2.7.3整合activemq中JmsMessagingTemplate装配不上。换一个Springboo2.5.4t版本可以装配上。

2022-09-11 20:51:01 303

原创 关于JavaMailSender明明导了包,写了yaml配置,但还是不能自动装配的问题。。。。。

什么都做了都是还是报错,可能是自己菜。所以就不用yaml文件,自己写配置类:如下。

2022-09-10 21:18:59 482

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除