- 博客(111)
- 资源 (2)
- 收藏
- 关注
原创 zookeeper实现分布式锁Demo
分布式锁的产生原因,单服务集群或者分布式开发的环境下,多个JVM无法进行锁操作。实现方式又Redis 或者zookeeper。实现原理:在zookeeper上创建临时节点,因为只有一个系统可以创建成功,创建不成功的话会报不存在的错误。当一个拿到锁得系统执行完之后,.close()方法。即关闭临时节点。其它线程可以创建即拿到锁。这个过程利用事件通知zookeeper的handleDataDeleted当节点删除时触发事件,可以用于通知其它线程拿锁。Redis和zk实现分布式锁的区别:Redis是n..
2021-07-13 10:12:12 235
原创 ConcurrentHashMap1.7源码详细解读
1.首先看构造函数public ConcurrentHashMap() { this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR, DEFAULT_CONCURRENCY_LEVEL);}其中
2021-06-10 17:02:06 209
原创 谷歌建议框架 EventBus 理解源码
写这个建议框架为了便于观察者模式:一 ,实现第一个类import com.google.common.base.Preconditions;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/** * 观察者综合类 */public class ObserverAction { private Object target;//表示观察者的类 priva
2021-02-02 14:11:52 179
原创 byte[]转换成压缩流
1.当我们拿到一个文件之后,我们会把它压缩然后压缩,然后读取流。这样中间会有很多次落地成文件很不方便。有一个简单的办法如下方法。别人拿到这个压缩后的byte[] 可以之间转换成zip的压缩文件。/** * 源流 转换成ZIP流 * * @param sourceData * @return byte[] */public byte[] getZipByte(byte[] sourceData, String name) { ByteArrayOutputStream bos =
2021-01-22 09:07:19 1550
原创 程序员社招面试,从行为,人性的角度分析如何面试。
我想每个人都多多少少遇到很心酸的面试经历吧,从小白的时候面试,满怀期待的去了,面试完了发现是培训机构,说你这个水平不行啊,我们公司培训你一下....。工作了1,2年感觉有经验了,去面试好几个问题没答上来,好点的说一句啊,今天到这里吧。不好的直接开启人生导师模式....我今天写的这篇文章目的是,不是告诉你面试背题,刷题,什么jvm原理,hashMap原理,而是从另一个方面告诉你该如何面试。假如有下边这样一个场景,程序员A,程序员B面试同一个职位,假如面试官问了一道题,A程序员正好在做地铁.
2020-05-29 13:41:05 799 3
原创 大小顶锥动态求解中位数以及如何动态求解TopK
有这样一个问题,一个有序数组(从大到小) 长度为13 中位数为 18int arr[] = new int[]{1, 3, 5, 6, 11, 14, 18, 21, 27, 29, 31, 56, 59}但是我们这个数组是动态的,每次都插入一个数据,这样没插入依次中位数就要破环,而且还要每次排序,这样会很慢。我们思路是这样维护一个大小,顶堆。大顶堆:堆顶元素是整个集合中最大的元素,同理 小顶堆是整个集合最小的元素。这里 我们采用数组形式实现顶锥(另一种实现方式是链表形式)...
2020-05-24 14:14:16 540
原创 Redis以二进制形式存储对象
代码已测试 直接测试就可以 ,注意 实体类一定要 实现 Serializable 接口 不然会报错import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Component;import javax.annotation.Resource;i...
2020-01-15 17:01:34 6308
原创 外包和直招的区别,谁能学到东西
你有没有自己思考过一个问题,外包和直招的本质区别,为什么会存在外包,你可能会想,很简单啊活多人少,多找几个外包人员.找过工作的人都知道遇到外包的岗位,多是一些公司在社会上临时找的,然后安排你去甲方公司面试,首先你跟本不是这家公司的员工,只是你发了个简历他联系到你,然后派你去甲方公司面试对不对.稍有点杠精的人就会问为什么,甲方公司不自己面试你,非要中间倒这么一手,关键你不也是社会上找工作的吗,又...
2019-07-03 15:12:06 13093
原创 数据库的隔离级别和索引使用
先说一下回表, innoDB采用B+树的方式,它分为主键索引(聚簇索引),业务类索引(非聚簇索引),当我们查询一个字段的时候,mysql 会返回主键 然后 再把数据返回,这样的话 按照最左匹配原则,age 是会走索引的,但是sex 没有索引 ,这样就是增加一次回表,即先通过age 查询id 然后 用id 找出数据 看看sex是否符合。先看一下隔离级别, 隔离级别首先要明确 ,隔离的越重,那么自然会失去效率,为什么有这么多的隔离级别,其实就是平衡业务关系尽可能的提高效率。
2024-05-31 14:28:04 346
原创 ThreadLocal-家常唠嗑版
2. Threadlocal 为啥不用线程id 作为key 呢 ,当时我也这样想的,因为一个线程Thread id 是唯一的 ,但是一个线程从开始到结束,中间会经历不止一个Threadlocal ,比如一个线程过来,代码把用户信息存到Threadlocal 1,把合同信息存入到Threadlocal2, 把贷款明细存到Threadlocal3 ,那么你的线程ID 是唯一的, 当你Threadlocal.get() 的时候取得是啥。你要站离你家最近的位置,你不可能在跑之前离你家远的那个了对吧。
2024-05-13 14:47:02 815
原创 手写一个民用Tomcat (08)
/得到一个新的processor,这个processor从池中获取(池中有可能新建)//首先根据uri最后一个/号来定位,后面的字符串认为是servlet名字。//从池子中获取一个processor,如果池子为空且小于最大限制,则新建一个。//这是单线程 一个请求一个请求获取socket。//如果容器内没有这个servlet,先要load类,创建新实例。// 等待connector提供一个新的socket。// 等待connector提供一个新的socket。
2024-04-25 10:25:27 868
原创 手写一个民用Tomcat (07)
照样能把value=jxd 取出来 这样 一个数组 就能完成了,虽然data 原数组被改变 这样看似不太好但是,但是节省空间 不然你就要2个数组才能完成,一个取值一个。* ,当我们遇到第一个=的时候 下一个是value=jxd 那么之前那个key(name) 就没有用了,因为已经赋值到map里边了 ,所以读取。* ox 是一个查找指针 ,当遇到 = 或者&时候,进行取舍,=前边表示key ,& 前边表示value 如果没有& 表示结尾。//因为post 请求又是会带sessionid。
2024-04-23 13:51:26 1251
原创 手写一个民用Tomcat (06)
照样能把value=jxd 取出来 这样 一个数组 就能完成了,虽然data 原数组被改变 这样看似不太好但是,但是节省空间 不然你就要2个数组才能完成,一个取值一个。* ,当我们遇到第一个=的时候 下一个是value=jxd 那么之前那个key(name) 就没有用了,因为已经赋值到map里边了 ,所以读取。* ox 是一个查找指针 ,当遇到 = 或者&时候,进行取舍,=前边表示key ,& 前边表示value 如果没有& 表示结尾。//由上面的URLClassLoader加载这个servlet。
2024-04-18 10:21:53 987
原创 大于,小于,小于等于,大于等于,获取数据范围的小工具
还有15.4以上的档位,要在动态的筛选出其中一条数据,传入的值是 compareValue 10.4 因为我们后来会需要很多条件,如果用mysql 语句 每次增加新的判断条件 会要引入两个字段进行 判断,如果增肌4个条件就要增加8个字段。//isSatisfied 默认fasle ,第一个条件如果成立,则返回true,继续判断第二个条件。例如(0,10],(10,20)表示 大于0 小于等于10,大于10 小于20的数据。再开发中我们经常 遇到 大于, 小于,小于等于,大于等于四种组合的工具。
2024-04-17 10:22:55 931
原创 手写一个民用Tomcat (05)
继续我们这次的优化,上次是request, 这次是response,同时request,response 针对 引入门面模式,把负责的逻辑隐藏起来,展示一个 好的好的门面给servlet。没什么难点,主要就是引入门面模式进行整理,之前都暴露着各种方法,用户在使用的时候会看到,同时 也避免 被更改 和强转的风险。//由上面的URLClassLoader加载这个servlet。//首先根据uri最后一个/号来定位,后面的字符串认为是servlet名字。//headers是一个保存头信息的map。
2024-04-16 16:50:07 1098
原创 手写一个民用Tomcat (04)
我们这一版就要是把所需要的数据 取出来,放到map 集合里边,先看第一个 我们能获取 请求方式GET, 请求路径 以及 请求协议 HTTP/1.1 然后 空一行, 获取到 请求头。if (i == (end - 1)) { //每个字符都相等,则匹配上了,返回开始位置。//解析第二段uri,以空格结束 解析出/servlet/com.yixin.HelloWorldServlet。//pos是查找字符串buf在uri[]中的开始位置。//如果后边都没有了,依旧没有查到 难就查不到了。
2024-04-14 14:04:30 1576
原创 手写一个民用Tomcat (03)
这就是 形成了一套 运行 机制,我通知你干活,你干完活之后 告诉我 ,我们在02那篇文章的时候是这样的,JxdHttpConnector 领导一直紧跟着JxdHttpProcessor 员工,直到员工干完活,一个领导盯着一个员工很累的,现在是 这个领导 统一指挥一个 团队,员工自己干完活之后反馈给领导。JxdHttpConnector引入一个队列池,每接到一个请求,就冲队列池中取出来,执行这个请求,执行完之后再放回队列池中,继续等待下一个处理。// 回收processor,员工归队。
2024-04-09 11:11:25 1035
原创 手写一个民用Tomcat (02)
System.out.println("进入>>>>>>HelloWorldServlet.service方法");//由上面的URLClassLoader加载这个servlet。//首先根据uri最后一个/号来定位,后面的字符串认为是servlet名字。//交给HttpProcessor 处理。//获取PrintWriter。//根据HTTP协议响应头定义,里面包含变量。// service(),由它来写动态内容到响应体。//创建servlet新实例,然后调用。//生成响应头,填充变量值。
2024-04-07 10:51:54 1066
原创 0基础如何进入IT行业?
学习了JAVA 之后 你先工作一段时间 ,你自己就会慢慢探索其他方向的,先不还要考虑太多,那些都不是这个阶段考虑的,假设你现在找到一个靠谱的学习班了,那么你需要先试着,自学一下JAVA, 什么不会咋办, 那就 一点点抄写代码,从最简单的开始,比如计算 一个等差数列,打印一个hello world ,对就是 访者 别人的代码 一点点再电脑上打出来,然后运行。其次就是,一定多学习一下框架使用,比如的Spring,mvc,SpringCloud,redis ,数据库 就学会mysql 就行 ,
2024-04-07 10:37:04 325
原创 手写一个民用Tomcat (01)
我对接口的理解是 一种规范,我在开发的时候突然有点感悟,就是你开发一套系统,或者写一个小的业务,在你使用我这个系统、业务的时候,你要 遵守我的规范,怎么解释规范呢,就是用接口去理解。System.out.println("进入>>>>>>HelloWorldServlet.service方法");上面是一个静态资源 else 如果不关注的话 可以不看注释掉,我这边是获取D盘下边的 txt 文件 相应的页面上,没啥 东西。//首先根据uri最后一个/号来定位,后面的字符串认为是servlet名字。
2024-04-05 17:41:48 1084
原创 浅显易懂的简单说一下jvm内存模型
这里注意下,有一个问题,就是循环引用,你想啊 有两对象 相互引用对方 ,这两对象永远没有被使用了,但是还相互指向对方, 那是不是 永远不会被清除掉,这就是GC Root解决的问题, 可达性分析算法 ,原理就是一路追踪到最后, 看看到底最终的哪一个对象,有没有被人使用,最终没有被使用 那么整个一条链路 就没有存在的意义。GC回收对象,有的对象被经常用到,有的呢没有被经常用到,这些经常用的对象 要是反复被创建是不是非常麻烦,举个生活中的例子,你整理一间屋子 是不是经常用到的东西会放到显眼,而且好拿的位置。
2024-04-02 16:25:43 792
原创 实现一个Google身份验证代替短信验证
System.out.println("拿到这个字符串 二维码工具:去生成二维码图片就可以了" + getQrCodeText(secretKeyBase32, "jxd", "hdjz"));咱们国内是用手机短信做验证,当然 这个google身份验证只是一个辅助验证登陆方式。谷歌身份验证器,我本身是一个基于时间做加密计算然后得出相同结果 本身很简单。详细的可以百度一下搜索原理,我们这里只是介绍一下使用。* @param secretKey 密钥。* @param secret 密钥。
2024-03-29 13:59:28 947
原创 最近接到一个大项目,给公司设计抢商品代金劵业务
我们系统上线之后,咋说呢 还是有问题,具体过程心酸~,后来我们该用预约方法(这样可以提前预知多少数据请求),因为我们公司业务较特殊,很多客户和业务员让他们预约的话,有些繁琐,具体细节不赘述了。而epoll 多了一个回调,主动通知,但是呢 不是主动通知你,而是主动放到一个完成队列里边去 ,就是完成的都放到一起,你自己处理。举一个例子,比如你干一件事,这件事中有很多过程,你时间上无法控制的,比如你去买星巴克咖啡,下完单之后他给你制作,你不会在哪里等,你跑到卖炸鸡的那边 再买炸鸡。这样可以支持很高的。
2024-03-18 14:05:07 1079
原创 有趣的链式调用
今天在公司接收一个其他人做的项目,发现一个有趣的链式调用。先看下这个链的chou'xianpublic abstract class AbstractHandler { protected String uuid; protected String code; protected String logMessagePrefix; protected String logMessageFormat = "[%s]-[%s-%s]-[接口%s]-[%s]--
2022-03-28 09:47:22 186
原创 MySql行级锁的一些实用小思考
mysql的引擎是InnoDB你有没有遇到过这种场景, 你有一个收款表, 表里边有一个余额字段 , 然后 这个余额字段 频繁的update,我们假设很多人往你余额里边充钱, 当然也有很多人在你这里取钱,也就是说这行余额不断的加减运算,不断的更新。那么 高并发下 会锁表 是不是会非常慢(你这一行属于是典型的热点行数据) 那么我们怎么提高 并发能力呢。先说一个比较好的办法,就是 你把这个余额 分成好几行,然后 让每个往里存钱的 或者取钱的事务 随机访问 余额行就可以,这样就能提高并发能力, 比较好的做.
2022-03-04 14:52:25 577
原创 数据库建立索引要考虑回表问题
这个文章我们略过很复杂的技术细节,直接告诉你怎么用,如果你有兴趣可以自己查下资料学习。毕竟知识只有自己总结过的才是自己的。注:我们讨论的是你的数据库引擎是InnoDB什么是回表:看下边的sql,其中表user 且name 建立索引select * from user where name='张三';这条sql 语句因为name 建立了 索引,索叶子节点是保存的主键id(你可以这样理解就是索引下边挂着注主键),然后 拿到主键id之后 在查询user 所有信息。注意这里 拿索引下边的
2022-03-03 16:35:03 534
原创 关于流的关闭方式自动方式写法
大家先看下这个方法 try catch 后边final 还要 里边继续try catch 关闭流:public static byte[] obj2byte(Object obj) { if (obj == null) return null; byte[] ret = null; ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream out = null; tr.
2022-02-22 10:23:57 879 1
原创 最新的XXL_JOB正确使用
springboot 整合xxljob 首先你需要启动一个xxl_job的管理中心 就这这个页面。一般公司都会给你配置好你的项目如何整合:在spring boot的配置文件中加上如下配置,注意 1:admin.addresses 就是你xxljob的管理页面地址。2: 下边这个端口号 自己写一个9097,这个端口号就是 你执行器的端口号,一会要配置到管理页面上 zhxxl: job: admin: addresses: http://localhost:8.
2022-01-05 15:48:07 4318
原创 注意Mybatis-Plus IN操作数组的时候不能使用基本数据类型。
看下这个操作 如果你 status 接收到的是一个int[]数组 ,Java 基本数据类型你实际上是查不到数据的public List<Test> queryByOrderNoAndStatus(String orderNo, int... status) { wrapper.eq("order_no", orderNo).in(status != null, "status", status); List<Test> testList= mapper.sele.
2021-12-09 19:36:18 749 1
原创 接口隔离原则的设计
我们在做java 开发中,要做到单一职责原则,也就是我不必要的依赖不需要引入。我们举个例子有一个类Modem, 有以下四个方法,但是如何我们有没有办法做到,一部分人调用能看到一部分方法。public class Modem{public void dial(String pno) {}public void hangup() {}public void send(char c) {}public void recv() {}}接口隔离设计:1.增加接口Connectio
2021-10-26 15:56:26 119
原创 工厂枚举设计模式
工厂设计模式我们制单,但是我在开发中遇到一位同事他用的这种方式挺有意思。废话不多说直接上代码。以下以FTP文件操作为demo定义枚举类@AllArgsConstructor@Getterpublic enum FileTypeEnum { UNKNOWN(0, "/upload/insurance", "", "未知"), A_FILE(1, "/upload/insurance/A_FILE", "A文件前缀", "A类文件"), B_FILE(2, "/u
2021-09-28 14:27:08 2263
原创 多线程下SimpleDateFormat为什么报错?
我们有一个工具类提供了一个简单的解析方法:代码如下class SimpleDateFormatTest implements Runnable { private static final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override public void run() { try { tr...
2021-09-06 11:09:31 511
原创 Nacos的分布式配置中心一些配置细节操作
1.首先要明确你是基于SpringBoot 操作nacos 还是基于Spring Cloud 操作Nacos这是 Naocs 的官网Open API 指南 (nacos.io)2.如果基于Spring Cloud操作一定注意要在bootstrap.yml 配置不要在application.yml配置nacos信息,如下图所示,不然会失败,bootstrap是整个项目全局的配置优先级最高,而application时基于SpringapplicationContext 的配置,配置一下基础信..
2021-07-22 10:23:41 214
原创 读写锁简单Dome
读写锁一般用于项目中清理缓存,下边就是一个小的Demo.当线程操作写方法时,读线程等待。publicclassCache {staticMap<String, Object> map= newHashMap<String, Object>();staticReentrantReadWriteLock rwl= newReentrantReadWriteLock();staticLock r= rwl.readLock();staticLock...
2021-07-09 11:34:58 119
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人