- 博客(41)
- 收藏
- 关注
原创 Spring中实现策略模式的几种方式
在写业务代码的时候,难免会遇到很多if-else,这个时候如果if-else不是很多可以用if-else。如果此时场景过多,太多的if-else会导致代码比较臃肿,所以这个时候就需要抽象化,将每个场景独立开来,定义一个顶层接口,不同场景有不同实现,这个时候策略模式就出现了。本文主要阐述工作中常用的实现策略模式的几种方式。2.2 定义枚举2.3 定义实现类2.4 定义策略工厂类2.5 测试实现一主要是为IHandler接口新增一个用于区分使用何种策略的方法,再构建一个策略工厂类,利用构
2024-04-29 19:12:31 1237
原创 如何根据配置的百分比让请求按比例打散(java 版)
现有三个集群,公司内部有一个服务由于某些原因需要根据ip直连的方式根据每个集群配置的百分比回推数据,以此来达到流量的负载均衡,不至于让请求打到单独的一个集群,听起来其实是一个很简单的功能,无非就是key-value形式,可以代表集群名,value代表ip的集合,但是由于某些特殊原因数据格式并不是这种,而是如下格式。
2023-04-27 13:07:02 394
原创 关于责任链模式在实际生产中的应用
关于责任链模式在实际生产中的应用一.背景我司是做火车票抢票软件的,做抢票软件就少不了需要登录12306,近期12306风控比较严重,导致登录的时候老是需要换登录方式,常见的登录有登录态登录,扫码登录,用户名密码登录,只要有一个登录失败就会进行下一个登录方式,直到登录成功为止,而原先的代码所有的业务逻辑都耦合在一起,查看问题时需要查看全局代码,逻辑又比较复杂,分析问题的时候需要很长时间,现需要对该逻辑进行优化。二.分析2.1 分析经过对代码的分析,决定采用责任链的模式对逻辑进行优化。2.2什么是责
2022-04-02 15:07:23 620
原创 什么是平均负载,以及影响平均负载的因素
什么是平均负载,以及影响平均负载的因素一.平均负载的相关概念1.1 平均负载:指的是单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是单位时间内活跃的进程数。1.2 可运行状态进程:指的是正在使用CPU或者正在等待CPU调度的进程,也就是处于Running或Runnable的进程。1.3 不可中断状态进程:指的是正在处于内核态关键流程中的进程,比如最常见的就是调用磁盘的IO读取,简而言之就是当一个进程向磁盘读写数据的时候,为了保证数据的一致性,在得到磁盘回复前,是不能被其他进程或中断
2022-03-19 19:28:22 2579
原创 关于一致性Hash算法在实际生产中的应用
关于一致性Hash算法在实际生产中的应用一.背景公司原先所有业务的数据都存储在一个相同的Redis集群里面,导致数据量太大,后续扩容不好扩,所以现在需要做的是将不同业务进行拆分,不同业务的数据存储到不同的Redis集群中。所以有以下实际。二.思考我们都知道这个算法的由来是因为在大数据时代,一个节点存储的数据量是有限的,系统的访问也是有瓶颈的,像一般数据库都是支持sharding的,也就是分片,来提高数据库访问的承受能力elasticsearch中使用的是分片,mongoDB中使用的也是shardin
2022-02-17 17:45:20 748
原创 关于结合Spring在实际工作中使用策略模式
关于结合Spring在实际工作中使用策略模式一.背景公司内部有一个这种需求,公司内部有一个爬虫的项目,大家都知道爬虫项目需要不停的变换IP,这样才能减少被风控的概率。有了不停变换IP的这种需求,自然而然就有了Ip代理商提供服务,然后我们要从Ip代理商拿去代理IP,这个时候就冒出了一个问题,我们需要将我们节点的公网IP添加到IP代理商的白名单中这样后续才能拿到代理IP。大家都知道一个公司用得IP代理商肯定是多家的,而每一家的IP代理商的添加白名单的方式又不一样。所以需要实现将节点的公网IP添加到代理服务商
2022-02-17 11:34:10 408
原创 MySQL索引优化记录
MySQL索引优化记录一.背景今天和同事讨论并解决了一个线上的MySQL索引优化问题,大概的背景是这样子的,原先有四个字段需要被做查询,也建立了联合索引D_A_B_C,现用A B C D 四个字母表示业务上对应的字段,其中A B C 三个字段是状态值,而D代表的是时间,业务上做的查询是 select A,B,C,D from table_A where A=1 AND B=2 AND C=1 AND D <‘2022-1-12’,由于数据量比较大,通过这个索引去查询数据大概耗时在8秒左右,还好业
2022-01-12 13:39:26 326
原创 如何从一个已经加权重的集合中随机返回一条数据
如何从一个已经加权重的集合中随机返回一条数据一.背景每周的周一早上都是摸鱼的,今天下午的时候我又在摸鱼中(学习),当我摸的正得劲的时候,突然背后站了一个人,然后来了一句,小明有个需求需要你来做一下,然后我肯定是细心听讲,大概的事情是这样的,我司有一个python做的爬虫系统专门用来爬取数据然后回推给内部的业务集群,调用方式是通过http接口的方式调用的,有两种方式,一种是直接访问域名,还有一种是通过ip访问,通过ip访问,这里主要说的是通过ip访问,原先系统会从配置中读取一个集合,集合中存放的是ip,然
2021-11-29 23:04:28 739
原创 监控进程状态
监控进程状态1.背景最近在搞一个公司python的项目,主要的功能是先创建一个主进程然后根据计算系统的逻辑CPU个数来计需要fork多少个子进程来做相同的操作,然后会定时的去监听这些子进程的状态,原先设计的时候是直接判断创建的子进程个数和配置的进程个数是否一样,如果大于或者小于就重启服务,今天由于一个偶然的bug,直接kill -15一个子进程后发现该服务没有重启,需要将这种情况考虑进去,其中包含该进程死掉了,或者成为了僵尸进程。2.什么为僵尸进程?僵尸进程从其他资料上看,描述的都是子进程执行完逻辑
2021-11-25 19:43:12 486
原创 Semaphore源码解析
Semaphore源码解析一.背景上次看完Sempahore在实际工作中的使用后,由于上次时间比较赶,只是写了一个小Demo,来演示Sempahore的使用,今天利用午休时间来看看Semaphore的内部结构以及相应的方法。二.Semaphore的内部1.Semaphore的继承关系Semaphore实现了Seializable接口,可以完成序列化。public class Semaphore implements java.io.Serializable2.Semaphore的成员变量
2021-11-13 14:12:38 479
原创 关于Semaphore的使用述
关于Semaphore的使用1.背景今天在看公司的代码发现了Sempahore在实际场景中的使用,之前准备面试的时候看过一些使用案例,但是都是一些小demo,今天看到的使用方式大概是这样子的,我们有很多定时任务也就是job,每个job启动的时候都会从消息队列中拉取定量的数据进行业务上的处理,每个job都会开启很多线程进行异步处理,但是系统通过配置设置可以启多少个线程,这个时候就用到了Sempahore来控制一次可以运行多少个线程,剩余的线程没有拿个许可就得等待。2.什么是Sempahore个人觉得S
2021-11-08 23:32:59 234 1
原创 关于如何通过反射调用指定的方法实践
关于如何通过反射调用指定的方法实践一.背景大致背景是这样的,我司有一个场景,通过调用RPC接口的方式查询得到一个实体,然后该实体中有多个属性,然后通过定义枚举的方式定义了实体的属性和对应的类型绑定起来,然后透传过去这个实体,通过if…else的方式来判断获取指定属性的值,这种背景下获取一两个属性还好一点,如果获取多个的话需要添加多个if…else,后续可能不是很好扩展,当然我们也可以用策略模式,这里主要使用的是反射。二.什么是反射1.概念:反射其实是一种机制,利用该机制可以在程序运行过程中对类进行解
2021-11-07 13:16:22 507
原创 关于ApplicationListener的使用方式以及原理
关于ApplicationListener的使用方式以及原理1.背景我们都知道,当我们的项目是springboot项目时如果我们想在容器启动的时候做一些配置的加载或者其他的一些操作,我们可以使用@PostConstruct注解,但是我今天主要想深入的是ApplicationListener基于我们监听的事件完成我们想要做的一些操作。2.实现事件监听的方式2.1自定义类实现ApplicationListener接口@Componentpublic class MyApplicationListen
2021-10-21 22:40:47 6327
原创 2021年面试问题汇总
2021年面试问题汇总1.给你一个4核的机器,不断的发送http请求不考虑失败的情况,可以达到多少任务量每秒2.怎么实现分布式锁,并可以实现锁续约3.怎么定位cpu高,慢查询命令4.A,B索引建立索引如何建,A=1OR A=2走没走索引为什么,B OR A走索引吗5.服务慢如何定位问题,CPU高栈信息打印出来看哪些指标6.内存飙升如何分析7.如何实现Feature异步回调,自己实现底层原理8.进程在虚拟内存中如何存在9.如何保证A,B,C三个线程顺序打印ABC,假设使用变量取于的方式瓶颈在
2021-10-09 21:17:29 123
原创 String类源码解读
String类源码解读一.String类实现的类1.String类是日常开发中用到的最多的类,它实现了Serializable, Comparable, CharSequence接口,类被final关键字修饰,所以类不能不能被继承,并且是线程安全的。类实现的关系如下图:二、String类的成员变量1.通过源码我们可以知道String底层依靠的是一个不可变得char数组 //用来存储String字符数组 private final char value[]; //缓存St
2021-09-05 17:00:43 302
原创 算法修炼第一天
算法修炼第一天1.问题:给定一个数组如何将数组中的指定的元素移动到数组的最后面,例如给定数组 [0, 1, 0, 3, 12]如何将数组中的0排到最后?2.思路:将指定元素移动到最后,第一步想的肯定是要遍历该数组判断数组中的元素有哪些是等于你给定的值的,哪些是不等于给定的值,既然要把目标元素移动最后,那就反过来思考先将不是目标元素的移动,然后再数组的末尾添加给定的目标值,直到到达数组的容量,因为我们是知晓数组的容量的和给定的需要移动的目标值的,只需要往后面添加就可以3.代码public cla
2021-08-30 17:10:23 94
原创 Object类源码解读
Object类源码解读一,什么是Object类?就我个人理解Object类默认是一切类的父类,当一个类没有指定父类时,虚拟机默认会为类指定父类为Object类,当然这个是基于JDK1.8的场景下的,1.6之前是编译的时候默认为没有指定父类的类,指定父类为Object类二,Object中的方法2.1 Object中的非核心方法registerNatives():该方法的作用是在调用其他本地方法之前需要为你的类注册本地函数这样你才能调用其他本地方法,所以该方法的调用一定要处于其他方法之前,所以才有了放
2021-08-30 14:50:07 106
原创 关于LinkedBlockingQueue源码解读
关于LinkedBlockingQueue源码解读一.使用背景当使用线程池创建任务时,可以将任务丢入到LinkedBolckingQueue中来达到暂时缓存的目的。二.源码解读2.1.实现哪些接口,继承哪些类首先我们可以看到它继承于AbstractQueue,并实现了BlockingQueue,而AbstractQueue则是继承了AbstractCollection,BolckingQueue则是继承于Queue,最终都继承于Collection。2.2 成员变量/** The capaci
2021-07-27 15:40:18 151
原创 拼音前缀搜索功能开启步骤
如何预判用户搜索拼音未输入完整匹配结果1.背景当前现在有一种场景 例如有用户叫 乐嘉明 对应的拼音是 lejiaming 或者yuejiaming ,假设现在索引已经建立好了,setting中的自定义分析器也早已定义好,如何解决这种问题,用户需要搜索出比如 leji lejiami lejiami能够获取到结果2.方案1.调用下方命令关闭索引,ip和端口为elasticsarch集群中的地址curl --location --request POST 'http://ip:port/indexNa
2021-07-09 14:21:39 194
原创 Elasticsearch中常用curl命令
Elasticsearch5.6中常用curl命令1.查看集群状态curl --location --request GET 'http://ip:port/_cluster/health?pretty'2.查看节点状态curl --location --request GET 'http://ip:port/_cat/nodes?pretty'3.查看分片状态curl --location --request GET 'http://ip:port/_cat/shards?pretty'
2021-06-25 10:46:13 969
原创 查询ealsticsearch中routingId为某个值的文档,并使用python定时脚本删除数据
查询ealsticsearch中routingId为某个值的文档,并使用python定时脚本删除数据一.查看elasticsearch官方文档查询routing为某个值的restful接口如下curl --location --request GET 'http://iP:port/indexName/_search?pretty' \--header 'Content-Type: application/json' \--data-raw '{ "query": { "term": {
2021-06-24 21:50:27 176
原创 Arthas定位问题相关命令
Arthas定位问题相关命令1.下载arthasjar包curl -O https://arthas.aliyun.com/arthas-boot.jarjava -jar arthas-boot.jar2.watch命令用来观察入参,返回值,异常,-x表示层级深度watch com.service.impl.xxxx xxxx "{params,returnObj}" -x 23.monitormonitor -c 5 com.service.impl.xxx xxxx4.jad反编
2021-06-23 14:19:47 278
原创 关于定位elasticsearch某个节点IO读异常高
关于定位elasticsearch某个节点IO读异常高1.背景公司一家客户更新最新的搜索的代码后,搜索的时候读写偶尔飙升到很高,后面运维将给elasticsearch的堆内存给到了12g后,IO一直飙升到很高,一直维持在那个水平2.思考刚开始一点头绪没有,尝试了重启该节点,可是一起来,I/O就维持到很高的水平,从网上查资料很多人说是合并段的问题,但是对底部的概念不是很熟的话不敢乱操作3.查资料原来elasticsearch搜索的时候会先将搜索的内容加载到filesysystem cache中,如
2021-06-16 18:31:01 1763 4
原创 Linux下如何使用telnet连接上Redis获取数据
Linux下如何使用telnet连接上Redis获取数据1.使用telnet连接上sentinel的某个节点,指定IP 和端口telnet ip port2.连接成功后,输入info,查看Redis主节点信息3.使用telnet连接到主节点上,若有密码认证,使用auth password进行认证4.使用redis命令查看想要的数据5.输入quit退出telnet...
2021-06-08 11:13:09 3607 1
原创 2021-05-29
关于匹配数字,英文以及特殊字符的正则表达式记录final static String ENGLISH_WITH_NUMBER="^[0-9A-Za-z`~!#$%^&*()_\\-+=<>?:\" ]*[0-9A-Za-z`~!#$%^&*()_\\-+=<>?:\"]+[ ]*$"; static Pattern englishWithWhiteSpaceNumberPattern = Pattern.compile(ENGLISH_WITH_NUMBER
2021-05-29 16:06:17 66
原创 关于elasticsearch5.6版本的upsert文档操作总结
关于elasticsearch5.6版本的upsert文档操作总结一.upser在ealsticsearch中的概念1.elasticsearch中upsert文档和其他数据库相同,当文档存在时只更新修改的数据,而做到不影响其他字段的值,索引中不存在该文档时就生成文档二.curl请求直接操作elasticsearch中文档示例curl --location --request POST 'http://ip:port/{indexName}/{type}/{id}/_update' \--head
2021-05-28 21:28:34 1651
原创 2021-05-17
elasticsearch数据迁移reindex脚本,需要将目标集群的地址添加至源集群中的yml文件中为白名单curl --location --request POST ‘http://10.247.19.20:9640/_reindex?pretty’ –header ‘Authorization: Basic ZWxhc3RpYzoxMjM0NTY=’ –header ‘Content-Type: application/json’ -d ‘{“conflicts”: “proceed”,
2021-05-17 15:29:34 111
原创 [UpdateRequest] doc doesn‘t support values of type: SringUpdateRequest] doc doesn‘t support
使用http请求局部更新elasticsearch中文档时,最外层需要使用do c包装一层,被包装的实体先不要转换成string类型,不然后续再转换成string类型会多几个换行符,再操作elasticsearch会出现这个错误
2021-05-16 07:23:34 1119
原创 记录一次线上排查elasticsearch的ResourceAlreadyExistsException过程
记录一次线上排查elasticsearch的ResourceAlreadyExistsException过程1.情景我司一家私有云客户,前断时间更新我司最新的补丁后,搜索人员信息的时候搜索不出来出据,后续运维排查问题发现同步数据的工程已经宕机,后又启动服务,发现服务怎么也跑不起来2.过程2.1程序启动的时候会去判断索引是否存在,然后通过程序创建索引,每当程序启动的时候都报如下异常说实话是头一次看见这个问题,从抛出的日志来看是索引已经存在,不让在创建,然后通过google搜索,发现有如下四种情况
2021-05-15 10:59:42 1548
原创 Elasticserch 5.6到Elasticsearch7.11跨版本升级踩坑记录
Elasticserch 5.6到Elasticsearch7.11跨版本升级踩坑记录1.背景公司老的业务使用的是Elasticsearch5.6版本,使用的客户端是TransportClient,java集成的SDK,由于老版本的Elasticsearch不支持加密操作,由于日前网络安全显得很重要,所以需要对索引库进行加密,保证数据的正确性,所以一个工程中要兼容两个版本的Elasticsearch,且能够通过读取环境变量来选择执行哪套代码,所以有了下面这些坑。2.过程2.1 安装Elasticse
2021-04-23 14:07:07 3272 5
原创 HashSet源码解读
HashSet源码解读1.HashSet概述1.HashSet是一个不可重复的无序集合,继承于AbstractSet,实现了Set,Cloneable 和Serializable接口,AbstractSet中重写了hashcode方法和equals方法从而来保证集合中的数据是唯一的。2.HashSet成员变量下面是HashSet的成员变量static final long serialVersionUID = -5024744406713321676L; //序列化idprivate tran
2020-10-10 08:26:00 128
原创 LinkedList源码解读
LinkedList源码解读1.LinkedList概述LinkedList底层的数据结构是双向链表,实现了 List, Deque, Cloneable, java.io.Serializable接口,因为它实现了Deque,所以也可以作为一个双端队列。和ArrayList相比因为没有实现RandomAccess接口,所以不支持下标访问,随机访问元素比较慢。因为底层数据结构是链表,所以在增删数据的时候,只需要改变指针的指向就可以,所以增删数据的效率相对要高一点,不需要批量扩容,也不需要预留空间。在空
2020-10-09 08:45:38 112
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人