自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 责任链模式

如果后续有什么其他的需要,那么基本都可以通过增加ValidatorContext中的字段来实现,例如,年龄的责任链是两个,那么应当显示有两个错误,所以我们可以再ValidatorContext添加一个errorMessageList,来实现将这两个错误都展示出来,而不是只能输出一个错误。好的我们这样就实现了每次都是通过调用一个函数来进行校验的,那么我们就可以将这些校验的函数来组成一个校验链,这样每个字段都有自己的校验链,然后再校验的时候只需要调用这个校验链就行了。我们可以进一步去优化这个总的校验器。

2025-06-06 20:26:46 652

原创 MySQL中的重要常见知识点(入门到入土!)

添加数据修改数据删除数据查询语句聚合函数查询聚合函数是对表中一列数据的操作分组查询排序查询分页查询。

2025-05-21 18:39:27 1556

原创 一篇文章带你弄懂事务和MVCC的原理(面试高频!)

先简单介绍一下事务吧,事务简单点来说就是将一系列操作,整合成一个操作,要么这些操作同时成功要么就同时失败。

2025-05-19 11:02:45 1009

原创 一篇文章带你学会SQL优化!

SQL优化用一句话进行概括就是:如何高效利用索引。没错就这么简单!后面论述的对update也好,order by也好基本都是想方设法利用索引提高效率。

2025-05-13 17:47:48 1191

原创 一篇文章弄懂MySQL索引!

定义:索引(index)是帮助MySQL高效获取数据的数据结构有序。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。简单点说就是一个提高MySQL查询效率的数据结构,MySQL中一般是使用B+树来实现的举个例子方便理解,假设有这样一张表,我们要执行的SQL语句是这样的。

2025-05-12 19:13:13 1019

原创 一篇文章弄懂Redis的内存回收机制!

本篇文章将以最通俗易懂的方式来说明redis的内存回收机制,包括过期key的处理和内存淘汰策略的底层原理。

2025-05-09 19:57:13 689

原创 Redis网络模型

select模式存在的三个问题:能监听的FD最大不超过1024每次select都需要把所有要监听的FD都拷贝到内核空间每次都要遍历所有FD来判断就绪状态poll模式的问题:poll利用链表解决了select中监听FD上限的问题,但依然要遍历所有FD,如果监听较多,性能会下降epoll模式中如何解决这些问题的?基于epoll实例中的红黑树保存要监听的FD,理论上无上限,而且增删改查效率都非常高。

2025-05-09 16:25:29 581

原创 Redis五种数据结构详解

String是Redis中最常见的数据存储类型:其基本编码方式是RAW,基于简单动态字符串(SDS)实现,存储上限为512mb。如果存储的SDS长度小于44字节,则会采用EMBSTR编码,此时object head与SDS是一段连续空间。申请内存时只需要调用一次内存分配函数,效率更高。如果string类型的value是数字的话,那么redis会将其转化为Long类型进行存储,进一步节省空间RAW编码的结构图:可以看到RAW类型的结构是通过一个指针执行存储的SDS,这样会申请两次内存空间。

2025-05-09 10:01:47 1113

原创 Redis底层数据结构详解!

我们知道在redis中字符串是使用非常广泛的,并且redis是基于C语言编写的,但是C语言中的字符串,是通过‘\0’来区分结束的位置的。这样并不安全,所以在redis中使用结构体定义了SDS动态字符串其中 len 代表了字符串的长度,这样就不会读取字符串结束标识,而是直接读取指定长度的字符串,从而保证二进制安全之所以叫做动态字符串就是因为,这个结构具备扩容的能力,假设一个内容为'hi’的字符串,我想要在其后面加上‘,Amy’这四个字节的数据,那么如何实现的呢?

2025-05-07 17:02:04 875

原创 Redis分布式缓存

之前去面试,面试官问了一个问题,既然内存IO速度非常快,假设内存可以做的和磁盘一样大的话,那么可以用内存代替磁盘吗?我当时的回答是:不可以,只用内存的话不能持久化。redis的持久化说的简单点,就是将将redis中的数据进行备份,方便redis在下次运行时数据不会出现丢失的情况。这也就回答了上面问题了,为什么内存IO那么快却不能只用内存呢?就是因为内存中的数据如果不进行持久化的话,下一次就没了。redis采用的持久化主要是RDB和AOF。

2025-05-06 14:17:07 627

原创 ElasticSearch中DSL查询及其Java客户端应用

query:查询条件from和size:分页条件sort:排序条件highlight:高亮条件。

2025-04-20 16:58:38 703

原创 一篇文章弄懂Elasticsearch!(基础版)

Elasticsearch简称es是一个高效的搜索引擎。那为什么不直接用数据库的搜索引擎来搜索呢?因为如果在一个项目中模糊查询占大多数的话,那么MySQL索引的利用率就不高,我们知道索引一般是主键id,但是模糊查询不会用到主键,那么模糊查询就会去遍历数据库的每一条数据,这样就十分的低效。那么就可以使用es来优化查询。索引库操作有哪些?创建索引库:PUT /索引库名查询索引库:GET /索引库名删除索引库:DELETE /索引库名修改索引库,添加字段:PUT /索引库名/_mapping。

2025-04-17 16:49:42 1267

原创 一篇文章弄懂RabbitMQ!(进阶版)

例如,一个业务执行多次,但是得到的结果都是一样的,就像查询操作就是幂等的,但是更新操作就不一定是了,要修改订单状态就要去扣减库存,如果更新多次那就意味着扣减多次库存,这样就会产生偏差。顺便说一下,普通非持久消息遇到消息堆积的时候,会将消息写入磁盘中,但是只有在内存中的消息满了之后才会将内存中的消息写入到磁盘中,这时处理消息的效率就很慢,最终降到0,完全写入磁盘后才会进行回复。既然发送者有消息确认机制,那么消费者也是有的,消费者的发送确认机制和发送者的确认机制很相似,但是返回的标识上有区别。

2025-04-15 19:48:52 1072

原创 RabbitMQ在项目中的应用

一些非必要处理的业务,就可以使用MQ来对其进行异步的调用。比如在支付这个业务中,使用余额支付时要调用用户微服务扣减余额,然后要修改支付单号的状态,然后要修改订单的状态调用交易服务。扣减余额和更新流水必须保持一致,但是跟新订单状态可以不必着急,这种情况下我们就可以使用mq来对交易微服务进行异步通知,从而加快整体的效率。这是常识用余额支付的代码,注释的部分就是之前使用openfeign进行远程调用,现在可以使用异步通知的方式代替(尽量使用try-catch不对原有的业务产生影响)

2025-04-15 14:45:45 324

原创 一篇文章弄懂RabbitMQ!(基础篇)

mq也就是异步通信技术,什么是异步通信呢?举个例子,加入你要让一群人干一件事,那么你可以选择一个个去打电话(同步通信),或者直接给他们发消息(异步通信)。很显然发消息的效率比打电话的要高多了,因为你只用发一条消息就行了,并不需要确保对面立马看到这条消息,而打电话就不一样了,你一次只能给一个人打电话,但我一次可以消息给多个人,但是打电话可以确保对面一定知道了,可靠性更高。fanout:广播形式,发送消息给所有绑定的队列direct:将消息发送给routingKey匹配的队列。

2025-04-15 10:56:39 1046

原创 分布式事务

有这样的一个场景:用户下单后先调用下单微服务去生成订单然后再订单微服务中调用了购物车微服务去清空购物车,最后调用商品微服务去扣减库存。那么在这个过程中,商品微服务中的库存为 0 了,但是购物车还是被清空了,因为使用openfeign调用完成就已经执行完了,并不知道后续订单服务调用失败了,而且就算知道了也已经晚了,因为购物车微服务已经执行完成了。用户下单这一操作,就可以说是分布式事务。

2025-04-14 15:16:19 586

原创 微服务保护

我们知道在高并发的情况下,微服务可能承受不住高并发的冲击而挂掉,那么如何解决由高并发而产生的雪崩问题呢?

2025-04-12 20:36:44 786

原创 网关实现动态路由

网关的路由配置全部是在项目启动时由在项目启动的时候加载,并且一经加载就会缓存到内存中的路由表内(一个Map),不会改变。也不会监听路由变更,所以,所以就无法使用配置热更新去更新路由表所以,我们必须监听nacos的配置变更情况并且手动把最新的路由更新到路由表中。这里就需要解决两个问题:1、如何监听nacos的配置2、如何手动更新路由表。

2025-03-25 22:12:29 387

原创 nacos实现配置共享和配置热更新

服务名]-[spring.active.profile].[后缀名] 其中第二个参数可以省略我们直接与服务名相同即可。

2025-03-23 14:01:03 377

原创 OpenFeign实现微服务之间登录信息传递

上篇文章我们实现了网关将登录信息传递给微服务,是通过将登录信息存储到threadlocal中,然后通过定义了一个拦截器,将请求头中的信息存储到userContex中,然后配置了一个MvcConfig来添加监听器,并且配置spring.factories确保能被包扫描到,最后由于网关是基于webflux实现的和mvc有冲突所以添加了一个@ConditionalOnClass(DispatcherServlet.class)注解确保只在MVC框架下的类生效。

2025-03-23 11:45:38 240

原创 SrpingCloud网关路由、登录校验

有的,兄弟有的,这样的方法当然不止一种了。然后我们补全一下网关传递给其他微服务的逻辑:我们可以将用户的信息放在请求头中,再由网关发送请求到各个微服务,微服务之间可以使用@ReuqstHeader的注解获取请求头,但是这样获取方式比较繁琐,我们可以定义一个MVC拦截器来处理请求但是不做拦截,只获取请求并且存到当前线程当中,这样后端微服务就可以获取到前端穿过来的用户信息。要做登录校验我们需要拦截所有的请求来校验用户是否已经登录,你们上面的路由过滤器就不太够用了,我们需要使用全局过滤器来实现对所有路由进行过滤。

2025-03-22 22:51:53 358

原创 SpringCould中的远程调用

先定义一个RestTemlate对象然后交给IOC容器进行管理,在需要调用的服务实现类中注入RestTemlate对象,通过exchange方法进行调用。之后之后对调用的方式进行了优化,使用nacos注册中心动态去获取注册了的配置信息,通过负载均衡的策略选择一个配置,实现微服务之间的调用。虽然这种方法可以实现微服务之间的调用但是太过于繁琐,这里最推荐使用的还是通过OpenFeign来实现微服务之间的掉i用关系。但是调用的代码十分繁杂,最后使用的是OpenFeign来简化代码,实现微服务之间的调用。

2025-03-21 20:07:59 323

docker应用部署seata

docker应用部署seata

2025-04-14

空空如也

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

TA关注的人

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