自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 分布式事务

答案是根据不同的业务场景来决定,如果我们现在是一个秒杀业务,我们应该使用pa,也就是主要保证可用性,试想一下场景:一个用户进来秒杀,突然服务器宕机不可用了,那么这个用户以后可能都不会在来使用公司的系统,这样直接损失一个顾客的代价对公司来说是沉重的.但如果说,现在保证了pa,用户购买一个商品,这个商品是30元,因为数据不一致他买过来50元,最后他知道了可以通过客服告知,查明原因之后返还并补偿客户,那么这个客户一般都能满意,这样损失也就降低了,所以一个秒杀系统应该使用pa理论来保证是比较合适的.

2023-09-27 15:49:40 39 1

原创 多线程相关

4.volatile:可以保证内存可见性,和防止指令重排,具体是通过内存屏障实现的,内存屏障会阻止屏障两边的指令重排序,同时对于写操作,强制线程的私有内存中的数据写入到主内存,对于读操作强制从主内存中读取数据到私有内存。1.核心线程数:核心线程数初始为0当我们调用线程池创建一个任务的时候,线程池先判断核心线程有没有满,如果没满就继续判断有没有空闲的核心线程,有就复用,没有就创建一个。LoadLoad屏障下面有LoadStore屏障:禁止处理器把该屏障上的volatile读与下面的普通写重排序.

2023-09-25 21:46:39 45 1

原创 es倒排索引

总结:把文档内容进行分词,得到一个词条表【词条:文档ID列表】,给词条创建索引。把要搜索的内容进行分词,根据分词后的结果去词条表中根据词条进行匹配,得到文档ID列表,再通过文档ID返回具体的文档信息。正向索引去查文章先通过文章的id然后找到文章,倒排索引就是通过内容找到相关的文章的id,然后根据id查找文章.1.先将一篇文章通过分词器分成很多的词存放到词条列表中,key为词语,value为文章的id.3.将输入的要查找的内容进行分词,然后去词条列表匹配找到对应的文章id。

2023-09-15 21:32:14 77

原创 死信交换机

针对过期没被消费的信息,首先创建一个名为dl.ttl.exchange的普通交换机,然后创建一个名为dl.ttl.queue的队列然后将两者绑定起来并指定routingkey为ttl.然后创建一个名为ttl.queue的队列,指定将死信发送给dl.ttl.exchange然后指定routingkey为ttl,意思就是将死信发送给dl.ttl.queue这个队列.该消息在5秒之内没被消费就会被发送到指定发送死信的交换机.如果发送的是一个有时间限制的消息,比如3s,那么就按照短的那个时间(3s<5s)来.

2023-09-14 16:38:42 58 1

原创 消息的消费如何保证幂等性

设置redis中的entry返回true(消息没人消费,现在是第一次消费),先进行新增的业务,业务处理完了然后正要将redis中entry的value改成1的时候宕机了,mq又将该消息发给了消费者2,2接收到了这个消息,但是设置进redis的时候发现返回了一个false说明已经有人在消费了,然后去查该key的值发现是0,说明1可能还没处理完业务,就什么都不做了.然后1好了将entry的value设置成1,返回ack结束业务这样就保证了消息消费的幂等性.我们可以从代码设计层面去解决消息消费的幂等性问题。

2023-09-14 15:24:37 139 1

原创 RabbitMQ如何保证消息可靠性?(RabbitMQ如何保证消息不丢失?)

这段配置中publisher-confirm-type有两个属性simple和correlated,其中simple表示同步等待confirm结果直到超时,而correlated表示异步等待confirm结果.publisher-returns表示在收到确认结果之后是否传给回调函数.template.mandatory也是这个意思,但template.mandatory的优先级要比publisher的高.template.mandatory设置为空情况下会去使用publisher-returns的配置.

2023-09-14 11:43:51 99 1

原创 Linux常用命令

ls:列出当前目录下的文件和文件夹列表。 cd:进入指定的目录。 pwd:显示当前所在的目录。 mkdir:创建一个新的目录。 rm:删除文件或目录。 cp:将文件或目录复制到指定位置。 mv:将文件或目录移动到指定位置,也可以用来重命名文件或目录。 touch:创建一个空文件或更新文件的访问和修改时间。 cat:显示文件内容。 grep:在文件中搜索指定的文本模式。 find:在文件系统中搜索文件和目录。 chmod:修改文件或目录的权限。 chown:修改文件或目录的所有者。

2023-09-03 19:30:32 22

原创 线程池的7个参数

线程池一般包含以下七个参数:

2023-08-29 21:07:06 58 1

原创 springboot的自动装配原理

当该注解被应用到一个配置类上时,Spring Boot会根据classpath中的依赖和配置信息,自动配置一些默认的Bean。Spring Boot的自动配置原理是基于条件注解和Spring的条件注解机制实现的。在Spring Boot中,自动配置是通过。

2023-08-28 20:20:56 32 1

原创 RedisTemplate序列化器

defaultSerializer是否为null如果为null则提供一个jdk序列化器和反序列化器,然后判断键的序列化器和值的序列化器是否为空,可以看到初始值是为空的,所以将刚刚创建的jdk序列化器赋值给键序列化器和值序列化器.这样我们在不设定序列化器的情况下默认就是使用的jdk序列化器.该接口下提供了一个afterPropertiesSet方法,调用redisTemplate相关的set方法的时候会触发在。然后我们可以看到在RedisTemplate这个类中继承了RedisAccessor这个类。

2023-08-23 17:53:41 73

原创 Resdis常用命令

hmset:同时将多个 field-value (域-值)对设置到哈希表 key 中。incrby:将 key 所储存的值加上给定的增量值(increment)。hset:将哈希表 key 中的字段 field 的值设为 value。decrby:key 所储存的值减去给定的减量值(decrement)。hsetnx:只有在字段 field 不存在时,设置哈希表字段的值。hgetall:获取在哈希表中指定 key 的所有字段和值.setnx:只有在 key 不存在时设置 key 的值。

2023-08-21 18:30:09 43 1

原创 ArrayList

会根据实际存储的元素动态地扩容(当存放的元素个数>当前数组的长度的时候会触发1.5倍扩容)只是一个固定长度的数组,只能按照下标访问其中的元素,不具备动态添加、删除元素的能力.支持插入、删除、遍历等常见操作,并且提供了丰富的 API 操作方法,比如。(静态数组) 使用起来更加灵活.允许你使用泛型来确保类型安全。内部基于动态数组实现,比。创建时不需要指定大小,而。创建时必须指定大小。

2023-08-20 19:26:11 31 1

原创 ThreadLocal

当我们需要给当前线程绑定只属于自己的数据时,可以通过ThreadLocal的实例对象调用set()方法,set()方法底层会帮我们在当前线程的ThreadLocalMap存储我们传入的数据,key为this也就是方法的调用者即当前线程的ThreadLocal,当我们需要再次获得存入的数据的时候,通过同一个ThreadLocal实例对象调用get()方法获取之前存入数据,也就是说ThreadLocal的set()方法对于一个ThreadLocal对象只能存储一个数据,后存入的数据会覆盖之前存入的数据.

2023-08-18 20:55:05 26 1

原创 hashMap的底层原理

当put一个数据的时候,hashMap先计算key的hash值&(数组长度-1)得到存放entry的位置,然后判断存放的位置是否有元素,如果没有直接存入,如果有则先比较自身key的hash值和已存入的entry的key的hash值对比,如果不一样说明两者不一样则挂在到下方形成链表(1.8使用尾插法),如果hash一样则调用equals方法比较两个key是否相同,如果相同说明两个key完全相同,则后来的entry覆盖原来的entry.如果不同则同样挂载到下方形成链表.

2023-08-16 21:13:56 50 1

原创 hashMap头插法产生死循环的原因

从上图可知线程 T1 执行之后,因为是头插法,所以 HashMap 的顺序已经发生了改变,但线程 T2 对于发生的一切是不可知的,所以它的指向元素依然没变,如上图展示的那样,T2 指向的是 A 元素,T2.next 指向的节点是 B 元素。因为 T1 执行完扩容之后 B 节点的下一个节点是 A,而 T2 线程指向的首节点是 A,第二个节点是 B,这个顺序刚好和 T1 扩完容完之后的节点顺序是相反的。,这就是 HashMap 死循环导致的原因。

2023-08-15 21:32:28 398

空空如也

空空如也

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

TA关注的人

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