- 博客(78)
- 资源 (2)
- 收藏
- 关注

原创 会话存档-如何高性能存储海量聊天记录
场景每天大约500w条数据,存档消息,并对消息进行统计分析。大概计算一下:每天的工作时间是8小时,大约是8小时处理400w条数据就足够了,为避免某时刻的峰值超负荷,还按照8小时处理500w条数据的标准来搭建环境;每秒钟大概要处理180条数据;客户提供了3台应用服务器(8核16G),单台机器每秒需处理60条数据每条消息(不考虑文件等消息,只考虑文本)平均大小为1kb,每天大约产生5个G的数据思路需求已经提出来了,只做其中的一个功能,就是获取消息,保存数据(数据查询、分析是其他需求);企业微
2022-02-26 22:47:58
9156
2

原创 docker安装(mysql,postgreSQL,redis,mongo,rocketmq,nacos,sentinel,seata,yapi,rabbitmq,nacos)
centos安装docker,ubuntu安装docker,docker配置国内镜像docker安装mysql,配置数据挂载docker安装redis,配置文件方式启动;主从复制docker安装mongodbdocker安装rocketmqdocker安装nacos-serverdocker安装Sentinel-Dashboarddocker安装seate-serverdocker安装yapi
2021-03-11 11:53:11
767

原创 SpringBoot2.x整合RabbitMQ(完整版)
本篇文章实现了 SpringBoot整合RabbitMQ,实现了 work模型,发布订阅模型,topic模型,confirm消息确认机制,return消息机制,TTL队列,死信队列等。整合方式有很多,比如使用 RabbitAdmin进行整合,本文介绍一个最简单的整合方式,只需要在 RabbitmqConfig.java 配置文件中进行简单配置,便可以方便的使用。相信你会喜欢这种方式的
2020-03-18 00:26:01
42764
27

原创 手写一个Redis分布式锁解决实际开发中高并发问题
文章目录场景搭建环境1. 导入依赖2. 配置连接redis3. 编写接口4. 编写业务类5. 准备测试分析解决问题若是不加任何更改,直接使用上述业务代码使用 synchronized 关键字分布式架构下的问题问题1问题2问题3总结场景多线程高并发卖票问题想必都不陌生,那么如何解决票的超卖问题呢?接下来我们来一步一步分析开始之前,先搭建好测试环境搭建环境1. 导入依赖<!-- r...
2020-03-10 01:01:47
921
3
原创 一文搞懂BeanFactory 和 FactoryBean
在Spring框架中,BeanFactory和FactoryBean是两个关键的概念,它们都与创建和管理Bean有关,但它们在功能和作用上有很大的区别。以下是关于它们的详细解释,以及它们之间的区别。
2023-10-17 16:13:48
2181
原创 Java设计模式(六)装饰器模式-与代理模式的区别-项目实战应用
装饰器模式(Decorator Pattern): 在不改变对象自身的基础上,在程序运行期间给对象动态的添加职责;感觉有点儿类似于继承,不改变父类,子类可拓展功能;和代理模式(代理设计模式) 真是太像了,简直一摸一样场景: 项目一期开发的时候,并没有给鉴权部分设置缓存;二期开发考虑到性能问题,想要给鉴权部分加上缓存,这里就选择了使用装饰器模式处理...
2022-07-13 11:47:02
3190
3
原创 Java设计模式(五)策略模式-在SpringBoot项目中的实际应用
策略模式(Strategy Pattern): 定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化。简单理解就是,针对不同的场景,使用不同的策略进行处理;定义一个降温策略的上下文测试运行结果:以上就是一个策略模式的简单实现以我自己在工作中遇到的场景为例,《企业微信会话存档》功能,获取各种格式的消息内容,进行解析并保存数据。这里只针对消息处理......
2022-07-09 16:00:05
1740
原创 企业微信会话存档-一个文件下载,吹牛2小时完成,结果写了2星期?
需求:获取聊天记录里产生的文件,下载并保存,存储到文件服务器(用oss表示)中过程:看起来很简单,直接干;初步思路:请求企业微信文件下载接口,先下载到本地从本地读取文件,上传到oss看起来并没什么问题,直接干!踩坑1既然是从企业微信接口下载的,那就先看看企业微信的开发文档吧纳尼,这些参数是什么???好吧,获取这些参数的方式请参考《企业微信会话存档-如何高性能存储海量聊天记录》,这里就不深究了:获取聊天记录,消息类型有很多,如果消息包含文件类型,那就会包含以上字段;因为涉及其他业
2022-02-24 10:54:48
2503
9
原创 pytesseract中image_to_boxes()解析
最近了解了一下pytesseract的文字识别,学习中遇到一个方法不是很清楚,网上也没有专门解释该方法的帖子,做个记录素材使用的时候可以去除一下水印代码import cv2 as cvimport pytesseractpytesseract.pytesseract.tesseract_cmd = r'D:\Python\Tesseract-OCR\tesseract.exe'img = cv.imread('4.png')img = cv.cvtColor(img, cv.COLOR_
2022-01-13 00:36:01
5634
2
转载 别再纠结线程池大小/线程数量了,没有固定公式的
别再纠结线程池大小/线程数量了,没有固定公式的 来源:juejin.cn/post/6948034657321484318可能很多人都看到过一个线程数设置的理论:CPU 密集型的程序 - 核心数 + 1I/O 密集型的程序 - 核心数 * 2不会吧,不会吧,真的有人按照这个理论规划线程数?线程数和CPU利用率的小测试抛开一些操作系统,计算机原理不谈,说一个基本的理论(不用纠结是否严谨,只为好理解):一个CPU核心,单位时间内只能执行一个线程的指令那么理论上,我一个线程只需要不停的执行指令,就可以跑满一个核
2021-04-26 11:48:51
290
原创 ThreadLocal源码解析以及相关面试题
文章目录ThreadLocal是什么ThreadLocal怎么用,应用场景应用场景ThreadLocal源码分析set方法get方法remove方法InheritableThreadLocalThreadLocal内存泄漏问题ThreadLocal是什么ThreadLocal翻译过来就是线程本地,也就是本地线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量,各个线程
2021-02-22 09:45:01
334
原创 Java实现List结构数据转换为树形结构数据
自己写了一个方法,利用递归的方式,将list结构转为树形结构数据,可通用于任何格式的数据。// 0 代表一级类目private List<Map<String, Object>> buildTree(List<Map<String, Object>> mapList, String value) { int size = 0; for (Map<String, Object> map : mapList) { if (!"0".e
2020-10-19 11:32:47
1571
原创 HashMap源码分析以及面试题
HashMap源码分析以及面试题HashMap是怎么添加数据的?HashMap是怎么获取数据的?HashMap和Hashtable有什么区别?HashMap和TreeMap的区别?HashMap和ConcurrentHashMap的区别?
2020-09-28 17:47:05
223
原创 解决java.util.LinkedHashMap cannot be cast to com.km.pojo.ItemCat问题
解决java.util.LinkedHashMap cannot be cast to com.km.pojo.ItemCatcom.alibaba.fastjson.JSONObject cannot be cast to com.km.pojo.ItemCat的问题错误描述使用redis的时候,设置json格式的序列化器,使用get获取时,因为数据较多,使用List集合List<...
2020-04-13 00:40:32
8626
2
原创 Docker、Nginx常用命令总结(精简、完整)
记录一下使用docker时,经常使用的命令Docker的基础命名yum insatll docker 安装dockerdocker -v 查看Docker的版本信息service docker start 启动dockerservice docker stop 停止dockerservice docker status 查看docker的状态service docker res...
2020-03-26 23:48:52
674
原创 SpringCloud系列(七)config分布式配置中心的使用以及中文乱码解决方式
文章目录了解Config分布式配置中心为什么使用config分布式配置中心简介代码实现中文乱码问题乱码的原因解决方式测试最终解决方式了解Config分布式配置中心为什么使用config分布式配置中心在微服务中,每个功能模块其实都可以拆分成一个单独的服务实例,如果项目够大,必然会有很多服务单元,每个服务单元都有一份配置文件需要维护,这显得不太好维护,而且不方便协作开发。为了使服务实例的配置文...
2020-03-24 23:19:31
1074
1
原创 SpringCloud系列(六)ZUUL服务网关
ZUUL服务网关是什么ZUUL服务架构ZUUL 路由(Router)ZUUL的简单使用ZUUL 过滤器(Filter )zuulFilter的使用场景Filter 的生命周期代码实现
2020-03-23 22:42:16
477
原创 如何使用Mock进行业务逻辑层(Service)测试
场景公司采用的是分层开发,controller、Service、dao层分离,现在写dao层代码的人生病了,进度比较慢,现在你写的是 Service层的代码,怎么测试 Service 层代码是否正确呢?Service层测试的重点是什么?DAO层调用的次数以及调用的顺序并不关心最后数据是否准确测试代码示例0. 准备环境引入依赖<!-- Junit测试包 -->&l...
2020-03-23 00:11:11
7862
1
原创 SpringCloud(五)—Hystrix断路器
分布式系统面临的问题服务雪崩什么是HystrixHystrix服务降级服务降级优化-彻底解耦服务熔断Hystrix可视化数据监控 dashboard什么是 dashboard代码实现如何查看小结
2020-03-22 20:54:01
247
原创 SpringCloud系列(四)负载均衡—Ribbon—Feign
负载均衡什么是负载均衡负载均衡的分类RibbonRibbon是什么使用Ribbon实现负载均衡1、配置Ribbon,开启负载均衡2、重新构建一个 producer项目3、开启项目,进行测试Ribbon重试机制开启重试机制测试Ribbon 支持的负载均衡算法修改Ribbon使用算法的方法1、直接在配置文件中修改2、使用 @Bean注入配置FeignFeign是什么Feign的使用1、引入feign的依赖2、编写feign客户端3、修改controller4、修改启动
2020-03-20 01:37:02
292
原创 SpringCloud系列(二)Eureka详解
Eureka简介Eureka的基本架构Eureka简单实现父工程生产者消费者注册中心测试Eureka自我保护机制什么是Eureka自我保护机制关闭Eureka自我保护机制Eureka如何优雅停服配置Eureka常用配置总结Eureka搭建集群实现高可用
2020-03-19 17:04:30
663
2
原创 SpringCloud系列(三)Eureka搭建集群实现高可用(三种方式)
eureka也是一个服务,如果eureka所在的服务器宕机了,那么整个服务就崩溃了,完全不能使用。所以我们需要实现 Eureka的高可用,搭建Eureka集群。本项目基于 [SpringCloud系列(二)Eureka详解](https://blog.youkuaiyun.com/fan521dan/article/details/104966121) 中的代码,使用 IDEA 开发工具
2020-03-19 17:02:33
1620
3
原创 SpringCloud系列(一)网站架构演变过程—什么是微服务?SpringCloud是什么?
网站架构演变过程1、传统架构模式(单点应用)一般只适合一个人或者是小团队开发缺点:耦合度太高,一旦某个模块出问题,可能会影响整个服务不可用2、分布式架构模式(对项目进行拆分)由传统架构演变而来,将项目以项目的模块的方式进行拆分,分成n多个子项目。比如商城服务,拆分成:会员项目、订单项目、支付项目、优惠券项目、猜你喜欢项目…等,每个项目都有自己独立的数据库、redis。和传统架构的区别...
2020-03-18 22:33:21
438
原创 RabbitTemplate中convertSendAndReceive方法与convertAndSend方法的区别
场景这里只展示核心的代码,完整的代码请参见 SpringBoot整合RabbitMQ(完整版)// 向发布订阅模式里面发送消息public void sendPublish() { for (int i = 0; i < 5; i++) { // rabbitTemplate.convertSendAndReceive("exchange_fanout", ""...
2020-03-17 21:16:31
81911
15
原创 IDEA连接Mysql失败:下载驱动失败,Failed todownload Cannot download Read timed out
重装了一次 IDEA,结果这次连接数据库连接不上,因为本地的mysql是5.7版本,所以连接的 driver版本需要是 5.x 的版本。但是这次怎么下载都下载不成功,一直提示下载失败。错误信息如下:经过百度,谷歌一波,尝试了n个方法,还是失败!最终自己摸索摸索,找到了一种解决方案,有同样问题的可以尝试一下如下方法:解决方案手动的导入一个本地的 jar包,没有jar包的需要先下载。不过应...
2020-03-16 16:51:31
19475
10
原创 RabbitMQ_TTL队列_死信队列
TTL队列(Time To Live)TTL队列:简单的说就是队列中的消息是有时间限制的,如果超时,那么这个消息将会被队列删除业务场景淘宝购物,提交订单之后,在一定的时间内(30分钟)、订单如果没有支付,那么订单就会自动关闭,如果想要购买商品,就需要重新下单。实现这个功能,就使用到了这个 TTL队列代码实现死信队列 ...
2020-03-15 00:55:45
862
1
原创 com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: method channel.close
今天测试RabbitMQ中 TTL队列时,出现一个错误,错误信息如下:Exception in thread “main” java.io.IOExceptionat com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:124)at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChann...
2020-03-14 22:15:16
2167
原创 RabbitMQ高级应用(三)消费端限流策略(basicQos)
高并发情况下,队列里面一瞬间就就积累了上万条数据,但是消费者无法同时处理这么多请求,这个时候当我们打开客户端,瞬间就有巨量的信息给推送过来、但是客户端是没有办法同时处理这么多数据的,结果就是消费者(客户端)挂掉了....这种场景下我们就需要对消费端进行限流关键代码:channel.basicQos();
2020-03-14 18:43:54
8225
8
原创 RabbitMQ高级应用(二)return消息机制—ReturnListener.handleReturn()
应用场景我们在发送消息的时候,指定的交换机不存在,或者指定的路由key不存在,这时候我们需要监听这种不可达的消息,使用 return机制 `Return Listener` 进行监听。return机制实现。ReturnListener.handleReturn()
2020-03-14 01:31:51
982
2
原创 RabbitMQ高级应用(一)消息的可靠性投递—消息确认机制(confirm模式)
什么是消息的可靠性传递?confirm消息确认机制详解。channel.basicNack()方法参数详解。
2020-03-14 00:24:11
1289
原创 RabbitMQ从零开始学(六)通信模型之topic模型—通信模型总结
topic模型说明:topic模式相当于是对 路由模式的一个升级,topic模式主要就是在匹配的规则上可以实现模糊匹配。通信模型总结
2020-03-13 00:04:40
729
原创 RabbitMQ从零开始学(五)通信模型之路由模型(direct)
路由模型(direct)路由模式相当于是分布订阅模式的升级版,多了一个 路由key来约束队列与交换机的绑定编写生产者// 生产者public class Producer { private static final String EXCHANGE_NAME = "exchange_direct_1"; // 定义路由的key,key值是可以随意定义的 priva...
2020-03-12 23:17:49
413
原创 RabbitMQ从零开始学(四)通信模型之发布订阅模型—channel.exchangeDeclare()—channel.queueBind()
发布订阅模型(Publish/Subscribe)简单的说就是队列里面的消息会被多个消费者同时接受到,消费者接收到的信息一致发布订阅模型适合于做模块之间的异步通信场景:可以使用这种模型,发送并记录日志信息 ------ 就会被log收集程序收集到,可直接写到指定的文件里面springcloud的config组件里面通知配置自动更新缓存同步也可以使用这一个高并发下实现下单逻辑编...
2020-03-12 22:45:14
3626
原创 RabbitMQ从零开始学(三)通信模型之Work型—channel.basicQos()
work模型称为工作队列或者竞争消费者模式,多个消费者消费的数据之和才是原来队列中的所有数据,适用于流量的消峰生产者的编写public class Producer { private static final String QUEUE_NAME = "queue_work_1"; public static void main(String[] args) throws ...
2020-03-12 21:24:50
3010
原创 RabbitMQ从零开始学(二)通信模型之HelloWorld型—channel方法参数详解
导包,编写工具类,编写生产者,编写消费者, 测试。channel参数详解channel.basicPublish()channel.queueDeclare()channel.basicAck()channel.basicConsume()含义:生产者将消息发送到队列,然后队列将这个消息发送给消费者代码实现
2020-03-12 01:31:42
828
原创 RabbitMQ从零开始学(一)MQ在开发中的作用—Linux下安装RabbitMQ
MQ是什么?MQ在开发中的作用,消息队列,消息中间件,RabbitMQ的安装
2020-03-11 23:17:28
385
原创 几行代码带你玩转FastJson
记录了fastjson中常用的对象之间的转换的方法。JSONObject、JavaBean、jsonString 之间的相互转换。
2020-03-10 23:01:45
189
原创 Redis开发中的常见问题-缓存穿透-缓存雪崩-redis脑裂
1、Redis的缓存穿透什么是缓存穿透 ?简单的说就是获取数据的时候后 先去redis找数据 结果没找到 又去MySQL中找数据 结果还是没有找到 这样的话 那么 每一个线程进来都要去访问数据库、这样的话数据库的压力就很大 数据库就会奔溃 这种现象就叫做 缓存穿透2、Redis下的缓存雪崩的问题3、Redis的脑裂问题脑裂问题客户端向主服务器写入了数据 但是主服务器...
2020-03-10 20:25:29
317
redis-5.0.7.zip
2020-03-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人