tanzhuo

tanzhuo

专研技术的程序员

只狼:影逝二度

《只狼:影逝二度(Sekiro:Shadows Die Twice)》是一款由From Software制作的第三人称视角的动作冒险沙盒类游戏,玩家将操控一位忍者,拯救他的主人——拥有日本贵族血统的大能的皇子,并向他的天敌复仇。 游戏背景方面是两条线,一条是苇名一心盗国,一条是樱龙和不死之力。先说苇名一心盗国,苇名之地原是苇名族的驻地,后来被内府势力侵并。到了战国末期,剑圣苇名一心为了收回被占领的土地带领苇名众及苇名的庶家也就是同源不同姓的平田家击败了内府士兵,从初次遇见苇名一心孙子苇名弦一郎的对话中得知平田家的家主是弦一郎的叔父。 苇名一心盗国 平田家的从属忍者就是在战场上收养了主角只狼的巨型忍者枭,其特征是一身毛发披肩,繁体版译名为猫头鹰。而与此同时另一个无主的忍者猿猴也就是日后破旧寺庙的佛雕师,则在战场上将自己的饭团给了在当时还是小女孩的永真,但是猿猴并没有亲自抚养永真,而是寄托给了自己的好友药师道玄,原因是喝完酒的猿猴说跟着一个药师总比要跟着一个忍者好,后来医术精湛的永真成为了苇名一心的专属药师,同时也学习了苇名一心的剑术。从这点上也能看出枭和猿猴同为忍者的不同,猿猴
4 min read

IntelliJ IDEA 2020 JRebel破解

IDEA 安装好最新版的JRebel之后。 点击激活页面 选择在线服务器授权激活。 输入服务器授权URL地址 URL地址为:https://jrebel.qekang.com/ [https://jrebel.qekang.com/5d45985a-26e1-4172-95ad-e75e551605a2]{GUID} 其中的GUID需要生成(生成地址): Generate GUIDs onlineGuidGen - webbased tool for generating GUIDs. [https://www.guidgen.com/]进入网站后生成GUID之后填写入URL地址中。 勾选同意协议,点击激活。 至此JRebel破解成功。
1 min read

MySQL 事物死锁解析

在使用mysql数据库中,随着我们业务与功能模块的增加、数据库的事物数量会随之上升。在开发业务功能的场景中我们会经常开启事物操作数据,或者开启分布式全局事物操作数据时、事物过多,在并发进行的场景中往往会有几率产生事物死锁问题。 那么我们来分析一下事物死锁产生的原因: 两个 session 连接:一个session持有T1事物,另外一个session持有T2事物。 1.T1事物修改rows1 2.T2事物修改rows2 3.T2事物修改rows1 4.T2等待T1释放rows1的x锁 5.T1事物修改Rows2 6.T1等待T2释放rows2的x锁 7.相互等待死锁 死锁在没有外力的干扰下,程序本身无力解决此问题。 必须借助人为或者另外的守护线程来解决此死锁问题。 解决死锁的方法也很简单:释放其中一个事物,让其回滚即可。 但回滚有一个问题,回滚哪个事物更合理,mysql采用的是根据undo log 中谁的条数更多,谁的权重越大,则舍弃权重更小的事物进行回滚,可以更好解决事物死锁。让其回滚的数据量尽量减少,以减少服务的性能牺牲。 系统中任何一个事务发生死锁的概率
3 min read

开发IDEA插件记录

之前一直在使用一款插件叫 mybatis log plugin,它里面的 sql log 参数补全这个功能我比较喜欢,之前低版本好像并没有进行收费,但高版本之后它开始收费了。于是我打算自己开发一个类似的功能插件,取名叫 mybatis log analysis , 1.0.0版本的话首先会完成sql log 解析并自动参数补全,sql美化等简单功能。 之后待时间充裕之后将会把其他的使用功能也开发出来,如xml java 链接跳转,一键生成 controller,service,entity,mapper,xml等功能点。 目前已经开发完成1.0.0版本 并提交到了 IDEA PLUGIN 库中。 在开发插件的时候,简单的功能实现起来很简单, 但想要实现比较复杂的功能就必须要对IDEA 提供的API 等方法有个比较深层次的了解,可是我在官方插件文档上并没有找到比较完善的API 文档。只有一些官方给出的demo代码。这样的话就不得不花点时间去看demo代码并阅读理解才行。感觉会将是一个不太友好的学习曲线。 贴上已经开发出来的插件地址:https:
1 min read

近几年的工作心得

不知不觉从事互联网行业已有3年,回想起初学习搭建demo项目的时候, 感觉每天很充实,不断收获新的知识,掌握不同的技能。 从第一次写 Hello Word,到自己做一些简单的游戏,爬虫,管理系统。 一路走来总感觉这个行业的知识体量是非常庞大的。深刻的感觉到了互联网行业门槛虽不高,但其天花板很高,随时都有种宛如站在巨人的肩膀上看更高的巨人的感觉,长期在行业中也感觉到每个人接触到的技术层次也是各不相同。 其中开源的社区是非常重要的存在,在开源社区中,总能找到新鲜技术点,新的想法,新的项目,新的概念。如果想要快速提升技术实力,必须尝试几次自主构建项目,编写到维护以及上线,这是算是职业上的必经之路。自己独立完成第一次设计系统时,凭借自己学习到的知识,搭建出自认为效率不错的,结构优秀的架构,能收获不少的成就感。 随着工作经历越来越多,会逐渐发现自己的技术栈还是存在一定局限性,需要更多且各个方面的知识补充。将会从安全,可靠,可用,高性能,监控,维护,扩展,整体体系,部署方案等方面进行设计。但这样的技术瓶颈,往往不能快速突破。 因为想要突破再次瓶颈已不是只看几本书,一个专业领域知识能够弥补的
5 min read

分布式锁与 Spring 事物管理顺序问题

这个是网上的网友提问,我给他推理并解决了他的问题。故此记录一下 。 他在使用zookeeper的临时顺序节点分布式锁来修改mysql中的数据值,此功能类似于售票机制,高并发下,要求售票数量保持一致。不可以数量多或少。 使用zookeeper的临时顺序节点分布式锁的时候,他锁住service层时,执行完整个service方法时,锁释放,但此时方式上标注的spring 管理的声明式事物却还未提交。这样的场景在并发情况下会导致数据问题。 理所当然他的数据库中数据会出现异常情况。100个线程同时执行1次一次拿1张,100张票应该为剩余0,而他的结果却并不是0,没有达到预期值。 原理是:第一个线程执行update方法结束之后,但由于事物还未提交完成。分布式锁却已经先一步释放,下一个线程执行此方法时 select 获取的还是update之前的脏读数据。导致数据出现问题。因为spring声明式事物@Transactional(rollbackFor = Exception.class) 是基于aop,方法执行完成之后的再执行的环绕通知,但环绕通知提交事务时,zookeeper的锁却已经释放
2 min read

Java后台架构理解

最近自己搭建了一些架构,就此写一下对于后台架构的理解。 在平时工作中,总是在考虑什么样的项目结构是最合理,最实用的呢? 有人觉得能让开发人员大大降低工作重复度,使用简单,设计优美,健壮,可扩展的架构,就应当是很不错的架构,但此架构只是项目级别的。 项目一开始从单机项目转变为集群并扩展到微服务,分布式。监控中心,注册中心,配置中心,网关,熔断,降级,分库,分表,容灾,各种中间件的加入与合理搭配,部署配置docker  k8s ,逐渐形成一个庞大的架构体系,保证服务高可用的同时服务器的数量也从一台两台上升至几十台上百台,这样的项目会慢慢成长为庞大的系统体系。 架构设计大到整个系统架构的宏观,架构设计又小到每行代码的微观。 dto 的 aop自动参数校验 ,result 对象封装,代码自动生成,service,mapper,controller,serviceImpl 的合理生成,各个jar包之间的引用,在线文档生成,又到每个数据库字段类型,字段大小,统一表前缀,字段前缀,分布式锁,乐观锁,
7 min read

Java远程桌面实现

突发奇想,使用java是否可以实现远程共享桌面的功能呢? 当然可以了,都是跑代码,但是java效率比较低,为啥,也不是因为java代码执行效率低下,而是因为出于Java自带的屏幕截屏工具效率过低,java提供了robot类来实现桌面截屏,2k屏幕一张jpg大小在200kb左右,一张截图我使用的rx2700x cpu 一张截图竟然需要30毫秒 距离1秒30帧率还是差距有的,更别提1秒60帧率。就算如果1秒60帧率 如何使用 java 高效的传输到各个远程端呢 ? 有人会说使用多线程截图,来提高帧率,这样的做法,我个人觉得不太科学,为啥?因为占用太高cpu资源,应该寻找高效并占用cpu资源较少的方法。 并且图片传输不可取,因为一张图片太大 ,200kb,1s 30张就是 6000kb 严重占用带宽。 最好的方式使用视频流,使用开源的h.264视频格式,还有更好的h.265 但是我并没有找到对应的开源jar。h.265技术还处于收费阶段。h.264视频格式 为根据每一帧中的像素点变化来记录其数据。而不需要记录整个图片中绝大部分像素信息。所以h.264格式的视频体积远远小于图片传输的数
2 min read

MySQL 亿级数据导出excel文档

前言 公司SaaS系统需要给用户提供列表数据导出 excel 文档的功能。 但有的公司的列表数据如财务流水已经高达千万,亿级别,对于这样的数据导出,我们需要提出一个解决方案。不然在月底几百家公司进行导出excel,将会导致mysql QPS急剧上升,服务器cpu,ram,瞬间到达报警阀门。大批量导出可能会导致服务器不可用甚至面临宕机(提示:对于财务等敏感数据,需要做文件加密或者临时文件授权下载操作)。 具体方案 方案的出发点:大批量导出,不能影响正常业务运行。 单独部署一个数据库从库节点进行查询压力分担,再单独部署多组服务器跑上Springboot项目作为MQ的消费者集群,所有的导出请求均请求至MQ队列中,Springboot会采用拉模式主动拉取MQ队列中的导出Excel任务消息进行执行,合理的使用了MQ的削峰填谷以及异步功能。并在SpringBoot项目中严格分配线程池资源。 具体的任务消费者通过亿级分页方案分批量查询mysql列表数据,并使用ali easy excel api进行数据硬盘落盘,完成输出后上传oss(也可以使用oss内网流传输,直接传到oss文件系统中
4 min read

MySQL 亿级数据分页

随着公司业务增大,数据量也是随之剧增。MySQL作为一款社区免费开源数据库。想要用它做几百万的数据分页。光靠limit是不靠谱的。当然不是诋毁mysql,mysql作为开源插拔式存储引擎数据库,已经是可以满足绝大部分的应用场景需求。使用mysql管理100tb也不是问题。但是使用方式却是一个问题。 limit接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。 limit在偏移量小于10w时性能还勉强可以接受,但随着偏移量越来越大,性能急剧下降。 公司单表账务数据已经到达230w ,做分页limt  来查询最后一页的数据,怕是没有个20秒是查询不出来的。当然具体的时间也要根据是否有索引,字段数量,数据内容而定,查询条件而定。 为了解决分页效率问题,我采用方案是: select id from table limit 100000,20 (带上where条件作为子查询) 由于主键id原本就是主键索引,所以limit的速度效率很高。并把条件字段加入复合索引,效率才会有质量的提升 。 但如
3 min read

随心笔记

技术无止境 创新不停驻