
Java
文章平均质量分 88
最爱彩虹糖
学习中
展开
-
Redis缓存热key问题常用解决方案
前言 做一些C端业务,不可避免的要引入一级缓存来代替数据库的压力并且减少业务响应时间,其实每次引入一个中间件来解决问题的同时,必然会带来很多新的问题需要注意,比如上篇文章《数据库与缓存一致性实战》中提到的如何做缓存的一致性。那么其实还会有一些其他问题比如使用Redis作为一级缓存时可能带来的热key、大key等问题,本文我们就热key(hot key)问题来讨论,如何合理的解决热key问题。正文背景 &nbs原创 2022-02-06 20:09:30 · 8805 阅读 · 2 评论 -
1104 二叉树寻路 java 100%解法
前言很久没写博客了,最近在刷题,写了个简单的双百题目,于是来分享记录一下。题目在一棵无限的二叉树上,每个节点都有两个子节点,树中的节点 逐行 依次按 “之” 字形进行标记。如下图所示,在奇数行(即,第一行、第三行、第五行……)中,按从左到右的顺序进行标记;而偶数行(即,第二行、第四行、第六行……)中,按从右到左的顺序进行标记。给你树上某一个节点的标号 label,请你返回从根节点到该标号为 label 节点的路径,该路径是由途经的节点标号所组成的。示例 1:输入:label = 14输出原创 2021-07-31 16:05:11 · 243 阅读 · 0 评论 -
基于源码分析Java FutureTask任务执行原理
前言 之前有分享关于FutureTask异步编程获取线程执行结果的文章,获取异步线程执行结果多种姿势,当时就在思考FutureTask的相关实现原理,应该不会太复杂,这两天抽空看了一下源码,觉得简单清晰且有助于对Java JUC下多线程思想的理解,就把自己对于这块的理解记录分享出来。本文内容主要包括针对FutureTask基本属性,关键方法的解析。正文FutureTask使用 对于Future原创 2021-03-26 23:12:41 · 537 阅读 · 0 评论 -
Java多线程获取异步执行结果的多种姿势
前言 由于java虚拟机对于进程中线程映射为内核级线程即真多线程的映射方式,因此在各个优秀的开源框架、服务容器中多线程技术使用非常广泛,我们自己的业务项目中,也经常遇到需要异步执行的任务,在不方便引入消息中间件的情况下,直接另开一个线程执行即可,但是如果遇到一些需要获取执行结果的业务,就只能为了多线程异步方式再引入线程间通信逻辑,便显得捉襟见肘。 jdk 1.5以后新引入了Future和Calla原创 2021-03-12 23:29:35 · 7276 阅读 · 0 评论 -
由一次Redis慢请求定位到的排行榜bug过程
前言 我是怎么也没想到排行榜的这个文章居然还能连载,直到这周在观察线上Redis性能后,不断深挖发现了一行bug代码导致一名用户(榜单第一名数据)的问题,觉得整个分析过程还是需要记录一下。周榜方案细节回顾 之前有过一个排行榜文章,基于zset与bloom filter的排行榜与点赞方案设计,里面大量使用到Redis中间件,其中周榜的功能完全由Redis Zset数据结构来实现,功能上从测试或者线原创 2021-01-22 14:28:11 · 653 阅读 · 0 评论 -
基于zset与bloom filter的排行榜与点赞方案设计
前言 最近有做较多关于排行榜需求相关迭代,在这期间关于技术方案也进行了很多的思考和调研,到底采用哪种方式更贴合业务,在不过度设计的基础上多多考虑扩展性和稳定性,最终选型中有Mysql、Redis zset、bloom filter等技术,因此在这里做个总结与分享。 排行榜和feed流中个人数据进行点赞的需求很常见,如下图所示为一个排行榜的展示大概展示内容,包括用户基本信息、排行、排行所依赖的数据、原创 2021-01-02 20:36:13 · 898 阅读 · 0 评论 -
ffmpeg格式化输出多媒体文件信息
前言 前段时间有一批音视频数据需要获取其内容格式等详情信息,打算用python、java等语言实现脚本来处理,后来找了opencv、Multimedia针对语言的一些类库还是不能满足需求,最后目光回到了ffmpeg,作为强大的音视频编码神器,这些信息肯定是有的,因此找了一下格式化输出信息的相关参数,这篇文章内容不多,算是一个记录。正文 既然各个生态中对于这块支持不好,那么就直接使用ffmpeg在原创 2020-12-26 20:24:01 · 1560 阅读 · 0 评论 -
聊一聊不同技术栈中hashmap扩容机制
前言hash简介 作为后端开发,说HashMap是我们最经常接触到的数据结构都不为过,而HashMap如其名最主要依赖的算法就是hash散列算法来存储和读取数据。 以关键码值K为自变量,通过一定的函数关系h(K)(称为散列函数),计算出对应的函数值来,把这个值解释为结点的存储地址,将结点存入到此存储单元中。检索时,用同样的方法计算地址,然后到相应的单元里去取要找的结点。通过散列方法可以对结点进行原创 2020-12-04 23:15:13 · 539 阅读 · 0 评论 -
Mysql大表update的正确姿势
前言 有些时候在进行一些业务迭代时需要我们对Mysql表中数据进行全表update,如果是在数据量比较小的情况下(万级别),可以直接执行sql语句,但是如果数据量达到一个量级后,就会出现一些问题,比如主从架构部署的Mysql,主从同步需要需要binlog来完成,而binlog格式如下,其中使用statement和row格式的主从同步之间binlog在update情况下的展示:格式内容statement记录同步在主库上执行的每一条原创 2020-11-20 20:41:53 · 5596 阅读 · 0 评论 -
直播技术演进中对于网络相关的思考
前言 webrtc是谷歌提出来的一种实时互动的直播技术,我本人其实对于直播相关业务的参与度并不高,也并不了解这些直播使用的底层技术,只是偶然进入了一次webrtc技术分享会议,发现对于直播技术的探索过程是与计算机网络相关知识息息相关的,于是就进行回看记录总结,希望能与各位分享。正文直播技术分类 当前市面上直播相关产品有很多种,站在使用者的角度,无非是1v1、1vN、N V N。而站在技术人的角度原创 2020-11-01 13:44:45 · 453 阅读 · 1 评论 -
记一次线上问题排查引发数据库事务与分布式锁的思考
背景 这周有用户反馈关于某个服务数据异常无法正常展示,在后台看日志是server在从数据库中查询完数据,使用Java stream聚合数据时出现了唯一用户 —— 唯一物品的多条数据(隐去业务具体字段名称,以用户、物品作为此次问题的字段),这些异常数据在我们的业务逻辑中是不应该出现的,且通过日志和代码在问题定位的过程中也是相对比较坎坷,因此记录分享一下。正文业务逻辑与日志信息 如下所示为我们整个原创 2020-07-17 22:15:42 · 589 阅读 · 0 评论 -
正排索引与倒排索引的理解
前言 最近在学习调研ElasticSearch,ES是一款热度较高的开源搜索服务器,能够提供近实时的数据全文检索功能,而实现检索功能一个其中较为重要的思想就是使用倒排索引,之所以成为倒排,与我们关系型数据库如Mysql的正排索引的区别在哪?在这篇文章总结一下我对两种索引的理解。正文正排索引 拿Mysql Innodb的聚簇索引来说,如下图所示,一个极简版(无页属性)的B+树索引结构大概是这样,原创 2020-07-11 20:42:03 · 2670 阅读 · 0 评论 -
https可否有效应对dns劫持、http内容劫持
前言 近期客户端为了缩包,对很多项目进行了h5化相关的工作,但在上线后发现有部分内容被http内容劫持,具体现象就是部分页面被植入广告,由于之前大多采用http协议,被劫持肯定是束手无策,因此准备切换协议,而https多了关于域名证书验证与交互数据加密的步骤,之前也有对过https交互原理以及Charles抓包工具的原理做过相关学习总结,详见 https原理初探。 https是建立于http的基础上,原创 2020-06-16 21:30:55 · 5290 阅读 · 0 评论 -
Redis多种部署方式及交互原理
前言 Redis作为目前使用较为广泛的中间件之一,大量使用于缓存、分布式锁、业务排行榜甚至是持久化的场景中,性能及可用性是我们关注的重点,本文主要探索Redis部署的几种方式及交互原理。部署方式单节点 单节点(standalone)模式即在操作系统实例中单节点启动Redis进程如下图,暴露对应的服务端口号即可。缺点也比较明显,既无法保证高可用,也无法很好的支持横向扩展(只能增加宿主机配置)。原创 2020-06-07 23:06:16 · 710 阅读 · 0 评论 -
服务下线、合并、缩容注意事项
前言 对于一个当前产品需求频繁迭代更换的年代,应用中的某个模块被下线、服务根据使用量扩缩容、数据库扩充合并的操作肯定是必不可少,而最近由于对一些服务资源使用的不合理,也对这些资源进行了下线、缩容、合并等操作。正所谓由奢入俭难,下线服务、数据库合并都是非常危险的操作,并不是直接操作kill进程、释放数据库那么简单,需要注意的地方很多,因此总结一下。服务下线 如果被下线服务前提是流量少,则需要做相关原创 2020-05-31 22:36:58 · 961 阅读 · 0 评论 -
前端跨域原理及测试方式
前言 近期项目组做了很多客户端原生转h5化的工作,将原生的业务逻辑在fe前端实现一遍,因此需要后端配合工作最多的就是要处理各个接口、静态资源的跨域问题,接下来对跨域原理及问题进行一个小的总结。跨域原理原因 跨域是浏览器在h5页面施加的一个安全限制,不允许浏览器在当前网站执行或者调用其他“非同源”的资源和脚本,源如:“https://www.baidu.com:10080”,是由三元组组成,即:协议原创 2020-05-12 23:03:00 · 676 阅读 · 0 评论 -
关于服务端反爬虫的限制及告警方案
前言 当前对于一些大型网站的开放式服务,有相当一部分流量都是爬虫程序导致,大概占比在20%左右,爬虫程序会增加服务端数据及流量开销、内部资料外泄等很多问题。 反爬虫也成了当前服务端需要关注的一些问题,其中笔者所在的组内就遇到了被爬虫程序恶意爬取免费资源的问题,因此开始研究关于反爬虫的限流...原创 2020-02-19 23:16:50 · 1539 阅读 · 0 评论 -
服务下线的注意事项
前言 对于一个当前互联网产品需求频繁迭代更换的年代,应用中的某个模块被下线肯定是必不可少,而站在服务端的角度,一个服务的完整的生命周期也是是要包含服务下线这一步的,而笔者最近也对组内的一些已经重构的服务进行了下线操作。大家要知道的是,下线服务是一个非常危险的操作,并不是直接操作kill进程、释放数据库那么简单,整个下线流程需要注意的地方很多,...原创 2019-12-27 22:22:13 · 2010 阅读 · 0 评论 -
java使用nlp工具完成英文词性还原、分词
前言 在一些英文处理的业务中,有时候会面临一些场景:判断这个单词是否在当前句子中,但英文相对比较棘手的问题是有很多词汇的变形如单复数、过去时、现在进行时、将来时等等,这样采用简单的字符串匹配操作肯定是不合适了,因此一直需要一个nlp分词器将句子中词汇分开、词性还原等。 正好找到了一个斯坦福提...原创 2019-12-19 22:35:09 · 2581 阅读 · 0 评论 -
http header及nginx的header转发问题
前言 最近在项目http请求中使用header频次颇多,于是总结一下header的用法及遇到的一些坑。常见请求体公共header 名称示例说明Hostwww.xxx.com本次http请求的host地址Content-Typeapplication/js...原创 2019-12-11 21:38:07 · 2400 阅读 · 0 评论 -
java stopwatch及System.currentTimeMillis使用
前言 在参与一些对性能要求较高的服务和特殊接口开发时,往往会去定位一些业务代码的耗时,通常需要写出下面的代码去计算和打印出业务耗时,这样写还经常减错值导致计算错误。 long serviceAStart = System.currentTimeMillis(); serviceA.doSth(); long servi...原创 2019-11-16 18:10:33 · 2056 阅读 · 1 评论 -
java 启动jar包 报错找不到主启动类
问题来源 springboot + maven 打包成jar包后,使用java jar命令启动jar包时,报错:Could not find or load main class org.springframework.boot.loader.JarLauncher问题解决 需要在...原创 2019-11-12 21:23:02 · 7955 阅读 · 0 评论 -
java.io.IOException: Server returned HTTP response code: 400 for URL 问题定位与解决
一、前言 今天在做数据迁移时,项目旧数据迁移至新数据仓库中,有网络资源下载 重传的需求,于是在整理的过程中,出现了上述问题, java.io.IOException: Server returned HTTP response code: 400 for URL。 当时使用的是 org.apache.commons.io.FileUtils 封装的文件下载包,...原创 2018-11-14 22:32:28 · 42351 阅读 · 2 评论 -
web开发中静态资源与动态资源的区别
一、静态web页面1、在静态Web程序中,客户端使用Web浏览器(IE、FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Request),告诉服务器我现在需要得到哪个页面,所有的请求交给Web服务器,之后WEB服务器根据用户的需要,从文件系统(存放了所有静态页面的磁盘)取出内容。之后通过Web服务器返回给客户端,客户端接收到内容之后经过浏览器渲染解析,...转载 2018-09-03 14:01:09 · 9730 阅读 · 1 评论 -
Java中Guava工具类库(一、Optional,Preconditions,Ordering)
前言 Guava读作“瓜娃”,番石榴的意思。它是一种基于开源的Java库,其中包含谷歌正在由他们很多项目使用的很多核心库。这个库是为了方便编码,并减少编码错误。这个库提供包括用于集合,缓存,反射,支持原语,并发性,常见注解,字符串处理,I/O和验证的实用方法。 使用Guava可以使自己的代码可读性增加、执行效率增加,最重要的是简单好用,让很多代码简洁化,在编写代码的过程中,更专...原创 2018-09-01 20:26:24 · 2141 阅读 · 0 评论 -
webservice构建中的报错问题
1.java.net.SocketException: Permission denied 在linux或mac系统上运行编译webservice客户端时出现权限报错问题,这是由于linux和unix对于非root权限用户不能使用1024以下的端口,对于一些服务,过高的权限,会带来一定的风险。报错如下:Exception in thread "main" com.sun.xml...原创 2018-08-28 09:59:38 · 5244 阅读 · 0 评论 -
访问控制RBAC实战
1. 需求分析某公司要求设计出一个公司内部的一个资源管理系统。需求如下:1. 公司内部分有总经理,产品经理,每个产品生产线下又分为财务,质监,生产,销售员工,之下又有产品生产线普通员工和公司的基础员工等,每个员工都有自己的权限,可以查看或修改相应的文件。2.用户权限在层次上到下依次递减。3. 每个用户可以拥有多个职位,但为了保密,用户不能同时拥有两个不同产品的生产线的职位。作为总经...原创 2018-05-10 20:40:15 · 2427 阅读 · 2 评论 -
Post与Get方法初探以及Restful接口测试
前言 REST – REpresentational State Transfer首先,之所以晦涩是因为前面主语被去掉了,全称是 Resource Representational State Transfer。通俗来讲就是:资源在网络中以某种表现形式进行状态转移。分解开来: Resource:资源,即数据(前面说过网络的核心)。比如 newsfeed,friends等;原创 2017-09-01 10:24:22 · 16852 阅读 · 0 评论 -
为什么不应该重写service方法?
转载自:https://my.oschina.net/dtkking/blog/89443 故事通常是这样开始的:从前,有一个程序猿,他语重心长地对孙子说:“孩子,要是你以后写servlet,最好不要重写service方法啊”孙子大为不解,程序猿又说:“听爷爷的,准没错,爷爷的爷爷就是这么说的……”——为什么不应该重写service方法呢?如果你也曾思考过这个问题,但暂时无解,...转载 2017-07-04 15:57:52 · 2457 阅读 · 0 评论 -
关系型数据库中联合主键和唯一索引的应用
一、前言 在项目开发中往往会遇到两个实体对象之间存在多对多关系的情况,此时我们会维护两个实体对象表,一个关系表,用来存放两者之间的关系。比较典型的案例是学生表、课程表、学生课程关系表。在这种关系表中,我们可以确定的是,学生和课程关系虽然是多对多,但一个确定的学生id和一个确定的课程id在关系表中只能存在一个。如下图所示:,业务逻辑就是一个学生只能有当前课程的一个分数。t_stu...原创 2018-12-13 13:53:53 · 4359 阅读 · 0 评论 -
微信红包分割算法
一、前言看小灰公众号有个文章,如何实现抢红包算法,很感兴趣,便跟着研究了一下。如一个红包100元,分为5个人去抢,我自己脑海中首先浮现的就是挨个取随机数就行了呗,即 第一个随机范围为(0,100),值为i,第二个的随机范围就变为(0,100-i),以此类推即可。但这样就会暴露出几个较大的问题,即红包分配及其不均匀,并且前面拿到大红包的概率会更大。因此公众号中出了另外两个方案。1. 二倍...原创 2019-03-03 21:44:40 · 5722 阅读 · 0 评论 -
服务端日志规范
一、前言日志是表现当前程序运行的状态、记录之前程序运行轨迹定位问题来源的,当前的测试及生产环境中,如果没有稳定日志的输出,是很让开发者提心吊胆的,但是如果有太多杂乱又无意义的日志也是令人伤神。当程序出现问题时候,如果能直接从日志中发现问题,问题解决的效率便会加倍提升,而发现不了问题可能的原因是很令人受挫的。本文想讨论的就是在程序中需要重视起来的日志规范。二、正文日志内容一条...原创 2019-06-10 22:46:44 · 1126 阅读 · 0 评论 -
skywalking(二)告警相关配置
前言 继上一篇配置了skywalking+nacos+gateway+demoservice之后,这一篇主要提供一个skywalking告警规则的配置,及dingding告警相关数据的发送。正文告警基本流程 skywalking发送告警的基本原理是每隔一段时间轮询skywalking...原创 2019-09-28 09:12:58 · 7934 阅读 · 2 评论 -
微服务链路追踪——skywalking
前言 skywalking是分布式系统的应用程序性能监视、分布式链路追踪工具,跟听云、博瑞等一系列服务器监控组件服务类似,开源的相关类似组件有zipkin、pinpoint等,由于笔者所在项目组准备升级springcloud,缺少相关链路监控组件,而zipkin属于springcloud1.0相关,因此暂时选择调研skywalking并对其进...原创 2019-09-22 11:34:02 · 7047 阅读 · 1 评论 -
sql注入原理及防范方式
前言 sql注入是一种危险系数较高的攻击方式,现在由于我们持久层框架越来越多,大部分框架会处理这个问题,因此导致我们对它的关注度越来越少了。最近部门在整理安全漏洞时,提到了一些关于sql注入的修改点,因此共同记录学习一下。正文原理 sql注入的原理是将sql代码伪装到输入参数中,传递...原创 2019-08-16 21:56:54 · 2650 阅读 · 0 评论 -
基于分布式锁的防止重复请求解决方案
一、前言 关于重复请求,指的是我们服务端接收到很短的时间内的多个相同内容的重复请求。而这样的重复请求如果是幂等的(每次请求的结果都相同,如查询请求),那其实对于我们没有什么影响,但如果是非幂等的(每次请求都会对关键数据造成影响,如删除关系、建立关系等),那就会轻则产生脏数据,重则导致系统错误。 &nb...原创 2019-07-28 11:01:53 · 2363 阅读 · 0 评论 -
单例及Java框架中涉及到的单例
前言 单例模式是设计模式中最简单也是最常用的设计模式之一,单例顾名思义就是系统中只有唯一实例,这个唯一实例的获取方式就是通过一个方法的调用获得,而不是通过正常流程中的new实例化。多年前在学习设计模式时就了解到单例有多种实现方式,今天就来总结一下,并且探索一下在当前java生态框架中的应用场景。正文 ...原创 2019-08-25 21:47:13 · 577 阅读 · 0 评论 -
java的对象及引用
前言 java虽说是“一切皆对象”,但是也会引出一系列的关于对象创建的问题。如 String str1 = new String(“aaabb”); 和 String str2 = “aaabb”; 的区别,抑或是上述两个语句创建了多少个对象,(str1==str2) ? 这些说法其实我在之前也是不太确定,仅有一些模糊的认识,接下来就一起...原创 2019-06-30 15:39:08 · 1508 阅读 · 0 评论 -
微服务之API网关对比
前言 微服务化是当前一大趋势,API网关是仅次于注册中心的存在(上一篇已经讲到注册中心),API网关可以减少对域名的管理、服务统一鉴权、服务日志traceId等,内容大多是之前组内安排的任务,于是把结果分享出来。正文 当前对API网关组件的调研维度如下:社区生态热度、易用性、路由转发及...原创 2019-07-14 22:10:01 · 2519 阅读 · 0 评论 -
微服务之注册中心对比
前言 微服务化是当前一大趋势,注册中心则是微服务最基础的组件,是之前组内安排的任务,于是把结果分享出来,本文对当前业界比较流行的微服务组件进行了调研,并作出了总结。正文 当前对微服务组件的调研维度如下:社区生态热度、易用性、性能、cap分布式特性、当前组件维护状态、重点功能等。组件介...原创 2019-07-13 19:59:14 · 2080 阅读 · 0 评论