自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 十五、Redis——内存策略

Redis内存策略

2023-04-26 23:10:03 198

原创 十五、Redis——网络模型

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

2023-04-26 23:05:47 345

原创 十四、Redis——数据结构

Redis会确保Intset中的元素唯一、有序具备类型升级机制,可以节省内存空间底层采用二分查找方式来查询类似java的HashTable,底层是数组加链表来解决哈希冲突Dict包含两个哈希表,ht[0]平常用,ht[1]用来rehash当LoadFactor大于5或者LoadFactor大于1并且没有子进程任务时,Dict扩容当LoadFactor小于0.1时,Dict收缩扩容大小为第一个大于等于used + 1的2^n收缩大小为第一个大于等于used 的2^n。

2023-04-26 22:22:18 159

原创 十三、Redis——最佳实践(Redis时参考的经验总结)

Key的最佳实践:•固定格式:业务名]:[数据名]:[id]•足够简短:不超过44字节•不包含特殊字符Value的最佳实践:•合理的拆分数据,拒绝BigKey•选择合适数据结构•Hash结构的entry数量不要超过1000•设置合理的超时时间批量处理的方案:①原生的M操作②Pipeline批处理注意事项:①批处理时不建议一次携带太多命令②Pipeline的多个命令之间不具备原子性。

2023-04-26 21:57:12 173

原创 十二、Redis——多级缓存

目录1. 传统缓存策略2. 多级缓存方案 3. JVM进程缓存3.1 初识Caffeine4. 实现进程缓存4.1 安装OpenResty4.2.Redis缓存预热4.3.缓存同步4.3.1 缓存数据同步策略4.3.2 Canal介绍 4.3.3 监听Canal总结: 存在下面的问题:•请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈•Redis缓存失效时,会对数据库产生冲击多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻Tomcat压力,提升服务性能:在多级缓存架构中,Nginx

2023-04-26 21:26:33 728

原创 十一、Redis——分布式缓存

RDB方式bgsave的基本流程?1.fork主进程得到一个子进程,共享内存空间2.子进程读取内存数据并写入新的RDB文件3.用新RDB文件替换旧的RDB文件。RDB会在什么时候执行?代表什么含义?•默认是服务停止时。•代表60秒内至少执行1000次修改则触发RDBRDB的缺点?1.RDB执行间隔时间长,两次RDB之间写入数据有丢失的风险2.fork子进程、压缩、写出RDB文件都比较耗时。

2023-04-23 21:52:27 354

原创 idea启动报错Internal error. Please refer to https://jb.gg/ide/critical-startup-errors java.util.concurr

dea启动报错Internal error. Please refer to https://jb.gg/ide/critical-startup-errors java.util.concurrent.CompletionException: org.picocontainer.PicoRegistrationException: Key com.tang.intellij.lua.luacheck.LuaCheckSettings duplicated。插件冲突重复:lua插件重复。

2023-04-22 21:13:48 979

原创 十、Redis练手项目——UV统计

Hyperloglog(HLL)是从Loglog算法派生的概率算法,用于确定非常大的集合的基数,而不需要存储其所有值。UV统计在服务端做会比较麻烦,因为要判断该用户是否已经统计过了,需要将统计过的用户信息保存。通常来说UV会比PV大很多,所以衡量同一个网站的访问量,我们需要综合考虑很多因素,所以我们只是单纯的把这两个值作为一个参考值。测试思路:我们直接利用单元测试,向HyperLogLog中添加100万条数据,看看内存占用和统计效果如何。经过测试:我们会发生他的误差是在允许范围内,并且内存占用极小。

2023-04-22 11:17:35 204

原创 九、Redis练手项目——用户签到

1.1 用户签到-BitMap功能演示我们针对签到功能完全可以通过mysql来完成,比如说以下这张表:用户一次签到,就是一条记录,假如有1000万用户,平均每人每年签到次数为10次,则这张表一年的数据量为 1亿条。每签到一次需要使用(8 + 8 + 1 + 1 + 3 + 1)共22 字节的内存,一个月则最多需要600多字节我们如何能够简化一点呢?其实可以考虑小时候一个挺常见的方案,就是小时候,咱们准备一张小小的卡片,你只要签到就打上一个勾,我最后判断你是否签到,其实只需要到小卡片上看一看就知道了。

2023-04-22 11:11:55 246

原创 八、Redis练手项目——附近商户

我们要做的事情是:将数据库表中的数据导入到redis中去,redis中的GEO,GEO在redis中就一个menber和一个经纬度,我们把x和y轴传入到redis做的经纬度位置去,但我们不能把所有的数据都放入到menber中去,毕竟作为redis是一个内存级数据库,如果存海量数据,redis还是力不从心,所以我们在这个地方存储他的id即可。GEO就是Geolocation的简写形式,代表地理坐标。Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。

2023-04-22 11:03:33 151

原创 七、Redis练手项目——好友关注

推拉模式是一个折中的方案,站在发件人这一段,如果是个普通的人,那么我们采用写扩散的方式,直接把数据写入到他的粉丝中去,因为普通的人他的粉丝关注量比较小,所以这样做没有压力,如果是大V,那么他是直接将数据先写入到一份到发件箱里边去,然后再直接写一份到活跃粉丝收件箱里边去,现在站在收件人这端来看,如果是活跃粉丝,那么大V和普通的人发的都会直接写入到自己收件箱里边来,而如果是普通的粉丝,由于他们上线不是很频繁,所以等他们上线时,再从发件箱里边去拉信息。需求:利用Redis中恰当的数据结构,实现共同关注功能。

2023-04-22 11:00:34 130

原创 六、Redis练手项目——达人探店

因为我们的数据是不能重复的,当用户操作过之后,无论他怎么操作,数据都是唯一不可重复的。其次我们需要排序,就可以直接锁定使用sortedSet啦!我们接下来来对比一下这些集合的区别是什么。

2023-04-22 10:44:42 152

原创 五、Redis练手项目——优惠券秒杀

利用set nx ex获取锁,并设置过期时间,保存线程标示释放锁时先判断线程标示是否与自己一致,一致则删除锁特性:利用set nx满足互斥性利用set ex保证故障时锁依然能释放,避免死锁,提高安全性利用Redis集群保证高可用和高并发特性。

2023-04-21 21:55:49 554

原创 四、Redis练手项目——商户查询缓存

目录1 缓存的介绍2 添加Redis缓存​编辑3 缓存更新策略3.1 主动更新策略​编辑4 缓存穿透​5 缓存雪崩6 缓存击穿​

2023-04-13 17:17:49 128

原创 三、Redis练手项目——短信登录功能实现

采用ThreadLocal保存在本地,这样能方便查询,不用每次都去Redis缓存中去查找。

2023-04-13 16:43:46 162

原创 二、Redis练手项目——Reids简介

Redis非关系型(NoSql)数据库Redis是一个key-value的数据库,key一般是String类型,不过value。

2023-04-12 20:44:35 143

原创 一、Redis练手项目——项目详情

黑马点评项目是前后端分离的项目,前端部署在nginx服务器上,后端部署在tomcat上。整个项目要实现的功能如下如所示。

2023-04-12 15:12:11 368

原创 RocketMQ源码(十八)—DefaultMQPushConsumer处理Broker的拉取消息响应源码

本次我们来学习Consumer如何处理Broker的拉取消息响应的源码。入口就是MQClientAPIImpl#pullMessageAsync方法内部的回调函数InvokeCallback#operationComplete方法。1. 在这个方法中,首先进行消息的解码以及第二次过滤,然后将消息存入对应的processQueue处理队列内部的msgTreeMap中。

2023-02-01 10:51:56 494

转载 RocketMQ源码(十七)—Broker处理DefaultMQPushConsumer发起的拉取消息请求源码

本次我们讲解了Broker处理拉取消息请求的源码,总体包括构建过滤信息,拉取消息,拉取结果处理(判断直接返回响应还是挂起请求),上报消费点位等步骤。1. 通过DefaultMessageStore#getMessage方法拉取消息,并且进行过滤操作。返回拉取结果GetMessageResult。这是拉取消息的核心方法,涉及到查找ConsumeQueue和CommitLog文件数据,默认最多拉取32条消息。1.1 对于拉取到的消息,将会进行broker端的消息过滤,通过tagsCode进行匹配。

2023-01-19 17:10:19 877

原创 RocketMQ源码(十六)—DefaultMQPushConsumer消费者发起拉取消息请求源码

本次我们讲解了DefaultMQPushConsumer消费者客户端如何发起的拉取消息请求。消息拉取由PullMessageService服务实现,PullMessageService继承了ServiceThread,因此它也是一个异步线程任务,将会在线程任务中,不断循环的从pullRequestQueue中阻塞式的获取并移除队列的头部数据,即拉取消息的请求,然后调用pullMessage方法根据请求去broker中拉取消息。发起拉取请求之前,会进行一系列的校验,

2023-01-17 17:05:45 1035

原创 RocketMQ源码(十五)—RebalanceService消费者负载均衡过程源码

RocketMQ内置了六个。

2023-01-17 12:00:54 461

原创 RocketMQ源码(十四)—消费者负载均衡服务RebalanceService入口源码

上一篇文章我们梳理了RocketMQ源码(十三)—消费者DefaultMQPushConsumer启动主要流程源码_代码---小白的博客-CSDN博客RocketMQ一个消费者组可以有多个消费者,在集群模式下他们共同消费topic下的所有消息,RocketMQ规定一个消息队列仅能被一个消费者消费,但一个消费者可以同时消费多个消息队列。这就涉及到如何将多个消息队列分配给多个消费者的问题。RocketMQ中使用负载均衡服务RebalanceService来专门处理多个消息队列和消费者的对应关系,并且提供了多个不

2023-01-16 18:51:09 387

原创 RocketMQ源码(十三)—消费者DefaultMQPushConsumer启动主要流程源码

此前我们学习了Broker和Producer的启动源码,以及Producer发送消息源码和Broker接收存储消息的源码,现在,我们来学习Consumer的启动以及消费消息的源码。Consumer的启动源码和Producer的启动源码还是有很多相似的地方的。客户端常用的消费者类是DefaultMQPushConsumer,此类的简单消费者案例如下,在RocketMQ源码的example模块下 找到更多快速案例。我们本次分析RocketMQ消费者启动的源码。

2023-01-16 16:23:13 2195

原创 RocketMQ源码(十二)—Broker CommitLogDispatcher 异步构建ConsumeQueue和IndexFile源码解析

ConsumeQueue、IndexFile

2023-01-16 11:58:52 326

原创 RocketMQ源码(十一)—Broker 消息重放服务ReputMessageService源码解析

本次我们学习了ReputMessageService消息重放服务的总体流程,下一篇文章我们将深入学习CommitLogDispatcherBuildConsumeQueue、CommitLogDispatcherBuildIndex到底是如何构建异步构建ConsumeQueue和IndexFile索引文件的。

2023-01-15 16:53:42 382

原创 RocketMQ源码(十)—Broker 消息刷盘服务GroupCommitService、FlushRealTimeService、CommitRealTimeService源码深度解析

1. 如果是同步刷盘,那么获取同步刷盘服务GroupCommitService:1.1同步等待:如果消息的配置需要等待存储完成后才返回,那么构建同步刷盘请求,并且将请求存入内部的requestsWrite,并且唤醒同步刷盘线程,然后仅仅返回future,没有填充刷盘结果,将会在外部thenCombine方法处阻塞等待。这是同步刷盘的默认配置1.2同步不等待如果消息的配置不需要等待存储完成后才返回,即不需要等待刷盘结果,那么唤醒同步刷盘线程就可以了,随后直接返回PUT_OK。2. 如果是异步刷盘。

2023-01-14 20:51:28 516

原创 Java 两种zero-copy零拷贝技术mmap和sendfile的介绍

详细介绍了两种zero-copy零拷贝技术mmap和sendfile的概念和基本原理。很多软件是基于server-client模式的,最常见的下载功能需要从Server端的磁盘中将文件通过网络发送到客户端中去。如果采用传统标准IO的方式(基于数据拷贝),那么需要如下步骤。 传统标准IO通过网络传输数据,需要进行如下调用:总共需要四步:1. read(): 涉及到两次上下文切换以及两次数据拷贝; 1.1 读取磁盘文件,将数据DMA Copy到操作系统内核缓冲区Page Cache;

2023-01-14 12:13:45 1079

原创 RocketMQ源码(九)—Broker asyncPutMessage处理消息以及存储的高性能设计

通过对于获取mappedFile部分的学习,我们知道RocketMQ对于commitlog的性能采用了多重优化措施:1.当获取新的commitlog的时候,如果磁盘满了或者没有文件,并且启用了MappedFile(MappedFile类可以看作是commitlog文件在Java中的抽象)预分配服务,那么在创建MappedFile时会同时创建两个MappedFile,一个同步创建并返回用于本次实际使用,一个后台异步创建用于下次取用。这样的好处是避免等到当前文件真正用完了才创建下一个文件,提升性能。2.

2023-01-12 20:42:45 382

原创 RocketMQ源码(八)Broker asyncSendMessage处理消息以及自动创建Topic

本次我们梳理了SendMessage方法的整体流程,以及自动创建topic的源码,并且我们学习到了autoCreateTopicEnable属性为true,,即自动创建topic的一些问题。接下来将学习asyncPutMessage方法,该方法才是真正的用来存储消息的。RocketMQ源码(10)—Broker asyncSendMessage处理消息以及自动创建Topic_刘Java的博客-CSDN博客_rocketmq asyncsend。

2023-01-12 11:10:47 647

原创 RocketMQ(七)broker接收消息入口源码

本次我们梳理了broker接收消息源码入口的处理逻辑,可以看到最终是通过调用sendMessage方法来处理来自producer发送的消息的。sendMessage方法内部要做的事情就比较多,保罗存储消息、构建索引、分发消费等等,这部分下次再总结。(32条消息) RocketMQ源码(9)—Broker接收消息入口源码_刘Java的博客-CSDN博客_rocketmq registerprocessor。

2023-01-05 16:25:42 534 2

原创 RocketMQ(六)producer发送单向、同步、异步消息源码

本次我们讲解了重要的发送消息的内部方法MQClientAPIImpl#sendMessage的源码,该方法内部又会根据发送模式执行不同的发送逻辑。单向发送模式调用RemotingClient#invokeOneway方法;异步发送模式调用MQClientAPIImpl#sendMessageAsync方法;同步发送模式调用MQClientAPIImpl#sendMessageSync方法。在异步和同步模式发送方法的调用前还会再检查是否超时,如果超时则不再调用。

2022-12-14 11:01:57 1242

原创 RocketMQ(五)producer发送消息的总体流程

Producer发送消息的总体流程

2022-12-13 22:48:46 1324

原创 RocketMQ(四)producer启动

NameServer和Broker启动之后,RocketMQ就可以使用了。现在我们来看客户端生产者的启动流程。客户端常用的生产者类是DefaultMQProducer。我们分析RocketMQ生产者启动的源码,实际上就是分析DefaultMQProducer的构造器以及start方法的源码。

2022-12-13 20:14:15 718

原创 RocketMQ(三) broker启动

RocketMQ源码版本V5.0.0,可兼容之前的版本,因为整理资料的时候,之前的版本,和V5版本有所出入,核心流程基本还是大同小异的。此前已经总结了NameServer的启动流程源码:现在来了解Broker的启动流程。在RocketMQ启动的时候,首先要启动NameServer,然后再启动Broker。Broker模块主要复制消息的存储、投递、查询,以及服务高可用的保证。

2022-12-08 16:56:09 2673

原创 RoctetMQ(二)namesrv启动

namesrv启动流程

2022-12-01 09:39:57 463

原创 RocketMQ(一)介绍

RocketMQ开篇

2022-11-30 22:45:39 160

空空如也

空空如也

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

TA关注的人

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