- 博客(1632)
- 资源 (33)
- 收藏
- 关注
原创 二维码扫码登录原理,其实比你想的要简单的多
实际上,知道了也没有影响, 因为设备信息是唯一的,只要你的设备信息别人不知道, 别人拿其他设备来访问,验证也是不通过的。前面我们说过,为了安全,手机端它是不会存储你的登录密码的。但是在日常使用过程中,我们应该会注意到,只有在你的应用下载下来后,第一次登录的时候,才需要进行一个账号密码的登录, 那之后呢 即使这个应用进程被杀掉,或者手机重启,都是不需要再次输入账号密码的,它可以自动登录。二维码其实与条形码类似,只不过它存储的不一定是数字,还可以是任何的字符串,你可以认为,它就是字符串的另外一种表现形式,
2025-03-26 10:47:30
579
原创 一次有意思的 SQL 优化实操,30248.271s 到 0.001s
将会更高,从另外一个角度看,该表的数据是300w,以后会更多,就索引存储而言,都是不小的数目,随着数据量的增加,索引就不能全部加载到内存,而是要从磁盘去读取,这样索引的个数越多,读磁盘的开销就越大,因此根据具体。发现没有用到索引,type全是ALL,那么首先想到的就是建立一个索引,建立索引的字段当然是在where条件的字段。快了3w多倍,大大缩短了查询时间,看来索引能极大程度的提高查询效率,建索引很有必要,很多时候都忘记建。的结果是897,即这两个字段联合起来的区分度是比较高的,因此建立联合索引查询效率。
2025-03-15 10:26:38
841
原创 0.0015 秒内启动一个应用,这个框架可以封神了!
为了解决这个问题,Quarkus的Spring 兼容性扩展将 Spring API 映射到现有扩展中的 API,这些扩展已经针对快速启动、降低内存利用率和原生编译进行了优化,例如 RestEasy 和 CDI。需要明确的是,Quarkus 中的 Spring API 兼容性并非为了作为一个完整的 Spring 平台来重新托管现有的 Spring 应用程序。这些 API 是使用了前面提到的 Spring Boot 和 Quarkus 的反应式方法实现的,数据库使用的是PostgreSQL。
2025-03-15 10:16:22
216
原创 终于把深度学习中的知识蒸馏搞懂了!!
知识蒸馏是一种模型压缩技术,旨在将一个大规模的、性能较好的 “教师模型”(Teacher Model)所学到的知识迁移到一个小规模的 “学生模型”(Student Model)中,从而提高学生模型的性能,同时减少计算和存储需求。
2025-03-14 10:03:11
368
原创 SpringBoot + ResponseBodyEmitter 实时异步流式推送,优雅!
ChatGPT 的火爆,让流式输出技术迅速走进大众视野。在那段时间里,许多热爱钻研技术的小伙伴纷纷开始学习和实践 SSE 异步处理。我当时也写过相关文章,今天,咱们换一种更为简便的方式来实现流式输出,那就是 。其实, 并非新技术,早在 Spring Framework 4.2 版本就已被引入。直到最近,我们在开发一个滚动日志输出功能时,才深入了解到它的强大之处。
2025-03-14 10:02:01
435
原创 SQL 中写 in 和 not in? 慎用!
如果id2只有1和2, 那么3<>1 且 3<>2 所以3输出了,但是 id2包含空值,那么 3也不等于NULL 所以它不会输出。单独查询 select id1 from test2 是一定会报错: 消息 207,级别 16,状态 1,第 11 行 列名 'id1' 无效。并没有,一位大神曾经说过,如果是确定且有限的集合时,可以使用。如 IN (0,1,2)。十几分钟,检查了一下 phone在两个表都建了索引,字段类型也是一样的。我想要查询,在test2中不存在的 test1中的id。
2025-03-13 09:49:45
187
原创 高并发实战:海量数据的计数器要如何实现?
与此同时,计数的访问量级也有质的飞越。而 Redis 基于通用性的考虑,对于内存的使用比较粗放,存在大量的指针以及额外数据结构的开销,如果要存储一个 KV 类型的计数信息,Key 是 8 字节 Long 类型的 weibo_id,Value 是 4 字节 int 类型的转发数,存储在 Redis 中之后会占用超过 70 个字节的空间,空间的浪费是巨大的。不过,即使经过上面的优化,由于计数的量级实在是太过巨大,并且还在以极快的速度增长,所以如果我们以全内存的方式来存储计数信息,就需要使用非常多的机器来支撑。
2025-03-13 09:47:16
812
原创 四种 API 架构风格及对比
这些观点的问题在于,它们的出发点只是为某种技术背书,而不是去考虑它实际的属性和特性如何与当前的需求相匹配。SOAP 严格的消息结构,安全性和授权功能使其成为在 API 和客户端之间执行正式软件协议的最合适的选择,同时又符合 API 提供者与 API 使用者之间的法律合同。复杂的系统和微服务。服务端在接受到消息后,将信息的内容反序列化,执行所请求的操作,然后将结果发送回客户端。归根结底,去针对一些小型的用例来尝试某种特定 API 架构,并去了解它是否适合你的用例以及是否解决了你的问题,这样做是比较合适的。
2025-03-12 10:21:57
822
原创 一次 诡异 的 JVM OOM 事故 原创
上面的流程是我解决过内存溢出的套路,虽然很糙,但很实用,比如曾经帮助艺龙支付团队解决过订单查询内存溢出问题、西南某航空公司用户中心内存溢出问题等等。2、通过 top -p Pid (进程号)分析进程资源占用,判断是爆炸性的内存增长,还是缓慢的内存增长。我的第一反应是:非常明显的 JVM 内存溢出表现 ,不过不知道是爆炸性的内存增长,还是缓慢的内存增长。最后,我有点担心,是不是 JVM 内存分配小了才导致 OOM 了,同学的回复是 :12 G。定时任务这四个字如电光火石般在我眼前闪过,基本八九不离十了。
2025-03-12 10:21:00
882
原创 为什么程序员不应该长期留在一家公司?
最近,我最近在和两个月前加入公司的一位程序员交谈。他以初级程序员的身份加入,在公司呆过的时间从未超过一年半。这并不是个例情况。我见过的大多数优秀程序员都会在 1-3 年后离职,除非他们是公司的股东。对软件开发者来说,这样做的原因有很多,也是很正常的一件事。我们将讨论开发人员为什么会这样做,我们可以从关于“如今跳槽是很正常的事”的一些统计数据开始。
2025-03-02 08:43:20
485
原创 SpringBoot中15个常用启动扩展点,你用过几个?
我们从这些spring&springboot的扩展点当中,大致可以窥视到整个bean的生命周期。在业务开发或者写中间件业务的时候,可以合理利用spring提供给我们的扩展点,在spring启动的各个阶段内做一些事情。以达到自定义初始化的目的。此篇总结,如果有错误或者疏漏的地方,恳请指正。👦小2,近10年程序员,国内互联网大厂资深工程师,新晋奶爸一枚。爱写作爱分享。🍀分享:技术成长、程序员生活、职场经验、育儿心得等内容。,有想法,可以评论区留言交流。
2024-12-26 09:56:56
760
原创 MyBatis中的 10 个宝藏技巧!
说到 MyBatis,很多小伙伴都会用,但未必用得“惊艳”。实际上,这个轻量级的持久层框架还有很多隐藏的“宝藏技巧”。如果你能掌握这些技巧,不但能让开发更高效,还能避免掉入一些常见的“坑”。今天就从浅入深,分享 10 个让人眼前一亮的 MyBatis 开发技巧,每一个都配上具体的场景和代码示例,务求通俗易懂,希望对你会有所帮助。有些小伙伴会遇到这样的问题:数据库表字段是下划线命名,但 Java 对象是驼峰命名。比如 对应 userName。如果直接用默认的 。
2024-12-25 09:58:38
258
原创 SpringBoot + minio + kkfile 实现文件预览
3.1中返回一个文件名,该文件名为上传文件在minio中的唯一名称,使用该名称请求minio文件预览地址。3.2中的接口返回一个地址,将地址放到kkfileviewer文件预览服务中,可以预览文件。这里以kkfile 4.4.0-beta版本为例。
2024-12-24 10:02:15
560
1
原创 大厂的Git代码规范
master 为主分支,也是用于部署生产环境的分支,需要确保master分支稳定性。develop 为开发环境分支,始终保持最新完成以及bug修复后的代码,用于前后端联调。一般开发的新功能时,feature分支都是基于develop分支创建的。线上出现紧急问题时,需要及时修复,以master分支为基线,创建hotfix分支。 开头的为修复分支,它的命名规则与 feature 分支类似。 开头,后面可以加上开发的功能模块, 命名示例:。文件,减少不必要的文件提交和冲突,净化代码库环境。
2024-12-23 12:57:41
585
原创 订单超时自动取消的7种方案
在电商、外卖、票务等系统中,订单超时未支付自动取消是一个常见的需求。这个功能乍一看很简单,甚至很多初学者会觉得:"不就是加个定时器么?" 但真到了实际工作中,细节的复杂程度往往会超乎预期。这里我们从基础到高级,逐步分析各种实现方案,最后分享一些在生产中常见的优化技巧,希望对你会有所帮助。每种方案都有自己的适用场景,大家在选择的时候,记得结合业务需求、订单量、并发量来综合考虑。如果你的项目规模较小,可以直接用延时队列或 Redis;而在大型高并发系统中,消息队列和事件流处理往往是首选。
2024-12-22 09:27:28
1045
原创 MySQL 中 Varchar(50) 和 varchar(500) 区别是什么?
大家好,我是小2,一个程序员,也是一个奶爸~为什么这么规定?我在网上查了一下,主要基于两个方面网上说和存储空间上是一样的,真的是这样吗?基于性能考虑,是因为过长的字段会影响到查询性能?本文我将带着这两个问题探讨验证一下。
2024-12-16 11:35:45
769
原创 详解CompletableFuture
CompletableFuture在JDK1.8提供了一种更加强大的异步编程的api。它实现了Future接口,也就是Future的功能特性CompletableFuture也有;除此之外,它也实现了CompletionStage接口,CompletionStage接口定义了任务编排的方法,执行某一阶段,可以向下执行后续阶段。
2024-12-16 11:10:33
931
原创 基本功 | 一文讲清多线程和多线程同步
一个进程内多个线程并发执行的情况就叫多线程,每个线程是一个独立的执行流,多线程是一种编程模型,它与处理器无关、跟设计有关。并行计算:充分利用多核,提升整体吞吐,加快执行速度。后台任务处理:将后台线程和主线程分离,在特定场景它是不可或缺的,如:响应式用户界面、实时系统等。我们用2个例子作说明。
2024-12-14 10:59:38
1086
原创 全域用户建模在美团首页推荐的探索与实践
总的来说,我们通过多阶段递进式探索验证的方式,在美团首页推荐召排模块引入多展位、多应用渠道的多源用户交互数据,并在落地过程中解决美团多展位、多业务、时空场景强相关性的特点导致的严重跨域信号负迁移挑战。全域用户建模经过多期算法落地已经取得显著业务收益,缓解了首页推荐用户行为稀疏导致的模型训练不充分及用户兴趣预估有偏问题,大幅提升了首页猜喜推荐系统在全面理解用户行为模式上的能力。此外,我们在排序模块的部分创新成果也已在CIKM2024会议上发表。
2024-12-14 10:58:47
771
原创 用线程池,注意避坑
线程池是 Java 中处理多线程的强大工具,但它不仅仅是“直接用就完事”的工具。很多小伙伴在用线程池时,因为配置不当或忽略细节,踩过许多坑。今天跟大家一起聊聊线程池中容易踩的 10 个坑,以及如何避免这些坑,希望对你会有所帮助。线程池是强大的工具,但如果我们日常工作中用得不好也非常容易踩坑。这篇文章通过实际代码示例,我们可以清楚看到线程池的问题所在及改进方法。希望这些内容能帮你避免踩坑,写出高质量的线程池代码!线程池用得好,效率杠杠的;用得不好,程序天天崩!
2024-12-13 19:09:27
687
原创 使用 try-catch 捕获异常会影响性能吗?大部分人都会答错!架构文摘
不知道从何时起,传出了这么一句话:Java中使用try catch 会严重影响性能。然而,事实真的如此么?我们对try catch 应该畏之如猛虎么?
2024-12-13 19:07:33
1192
原创 MySQL中这14个神仙功能,惊艳到我了!!!
我最近几年用MYSQL数据库挺多的,发现了一些非常有用的小玩意,今天拿出来分享到大家,希望对你会有所帮助。
2024-12-11 16:35:56
948
原创 Spring Boot性能提升的核武器,速度提升500%!
大家好,我是小2,一个程序员,也是一个奶爸~虚拟线程是 Java 21 引入的一个新特性,用于简化并发编程。
2024-12-11 10:04:59
718
原创 SkyWalking 和 ELK 链路追踪实战
SkyWalking和 ELK 各自在 APM 与日志管理领域发挥着重要作用,尽管原生 ELK 不直接支持链路追踪,但通过与 SkyWalking 的集成,可以互补优势,共同提升微服务架构下的可观测性。
2024-12-10 10:02:37
1364
原创 公司大佬对 Excel 导入、导出的封装,那叫一个妙啊!
最近在封装公司统一使用的组件,主要目的是要求封装后开发人员调用简单,不用每个项目组中重复去集成同一个依赖l,写的五花八门,代码不规范,后者两行泪。为此,我们对EasyExcel进行了二次封装,我会先来介绍下具体使用,然后再给出封装过程。
2024-12-10 09:52:23
224
原创 【推荐系统-召回07】双塔模型——正负样本的选择
既然都曝光给用户了,这所有80个都认为是用户很感兴趣的了,你咋能做召回的负样本呢?一个物品成为负样本的概率越大,模型对这个物品打压就会越狠,对负样本应该打压,但这里打压的太狠了。可以把全体物品当做负样本,把它们叫做简单负样本,这些物品绝大多数都是用户根本不感兴趣的,我们把物品i被抽到的概率记作pi,它正比于物品i的点击次数,反映出物品的热门程度。被排序模型过滤掉,说明用户对这些物品的兴趣不够强,他们可以作为排序模型的负样本,首先是简单负样本:简单负样本是未被召回的物品,这种物品通常是用户不感兴趣的。
2024-12-09 13:38:09
1319
原创 【推荐系统-召回08】双塔模型——线上召回和更新
把昨天一天的数据打包成tf record的文件,在昨天模型参数的基础上做训练,把昨天的数据过一遍,1、这些是前天一天积累的数据,到了昨天凌晨的时候,我们把前天的数据打包成tf ricker的文件,也就是说昨天凌晨模型初始化的时候,参数用的是前天凌晨全量训练出的模型,而不是随机初始化。全量更新不需要实时的数据流,对生成训练数据的速度没有要求,延迟一两个小时也没有关系,今天凌晨的全量更新是基于昨天凌晨全量训练出来的模型,而不是用下面增量训练出的模型。
2024-12-09 13:36:00
763
1
原创 你知道Java类是如何被加载的吗?
正式由于上面这些原因,如果所有的 ClassLoader 都由自己去加载 Class 文件,就会导致对于同一个Class文件,存在多份InstanceKlass,所以即使是同一个Class文件,不同InstanceKlasss 衍生出来的实例类型也是不一样的。写完这篇文章,手也不痒了,甚爽!这篇文章从双亲委派讲到了Class文件的加载,最后又绕回到双亲委派,看似有点绕,其实只有理解了Class的加载机制,才能更好的理解类似双亲委派这样的机制,否则只死记硬背一些空洞的理论,是无法起到由内而外的理解的。
2024-12-06 13:33:59
596
原创 Map 只会 put、get?快来学这几个“新”方法
看名字就知道是compute方法衍生出来的方法,这个方法只在key不存在的时候,执行computer计算,如果说key对应的value存在,就直接返回这个value。可以看到,这些JDK8引入的Map的方法,都可以在某些特定场景下简化我们的代码,虽然不嫌麻烦的话,put、get等方法都可以搞定,让我想起一张远古的图。Map是我们日常编程中十分常用的数据接口,的在JDK8中,Map引入了几个新方法,可以简化我们对Map中数据的操作。看方法名也可以知道,这个方法是遍历map的数据使用的。
2024-12-06 13:33:08
452
原创 Redis6为什么引入了多线程?
Redis 6 引入多线程技术,是为了应对日益增长的高并发和大规模数据存储的需求。通过将网络 I/O 和持久化等操作进行多线程化,Redis 6 能够更好地利用现代多核处理器的优势,提高性能和吞吐量。然而,这种多线程设计依然保留了 Redis 核心单线程模型的优点,确保了操作的顺序性和数据的一致性。多线程的引入使得 Redis 在高负载、低延迟场景下表现更加出色,但也要求开发者对系统性能进行精细调优,以便最大化地发挥多线程的优势。
2024-12-05 10:22:31
953
原创 Arrays.asList() 数组转换成集合酿成的线上事故!
返回的是一个固定长度的List集合,没有add和remove具体实现方法,不能进行增删操作,否则会报错。如果需要进行增删操作,可以使用进行封装,如:。希望本文能够帮助大家避免类似的线上事故,提高代码的健壮性和可靠性。在实际开发中,务必注意的使用场景,确保代码的正确性和稳定性。同时,也应该从这次事故中吸取教训,加强代码审查和测试,避免类似问题的再次发生。
2024-12-05 10:13:31
830
原创 优雅且安全的三方接口设计,这门道太多了
为每个三方应用生成唯一的API密钥对(AK/SK),其中AK用于标识应用,SK用于进行签名和加密。AK:Access Key Id,用于标示用户。SK:Secret Access Key,是用户用于加密认证字符串和用来验证认证字符串的密钥,其中SK必须保密。通过使用Access Key Id / Secret Access Key加密的方法来验证某个请求的发送者身份。在进行接口调用时,客户端需要使用AK和请求参数生成签名,并将其放入请求头或参数中以进行身份验证。
2024-12-04 10:06:56
1214
原创 30 款 IDEA 宝贝插件,yyds!
大家好,我是小2,一个程序员,也是一个奶爸~很多程序员都想把IDEA打造成一站式开发工具,于是安装了各种各样的插件,今天给大家推荐30款IDEA插件,总有几款适合你!在这里直接搜索就行了。
2024-12-04 10:03:43
813
原创 Spring-Smart-DI !动态切换实现类框架
是用来配置环境变量相关的配置点,如果想要自定义配置比如在数据库中可实现自己的ProxySPI注解。比如自定义注解,并标记上实现并指定具体配置获取逻辑实现类即可。然后就可以像一样去使用了,下面是实现的伪代码@Inherited@ProxySPI(DbProxyFactory.class) // 指定配置获取逻辑@Component@Autowired@Override// todo 根据注解从数据库获取要注入的实现类。
2024-12-03 14:12:21
478
1
原创 为什么有的程序员一直在做需求,而有的人却主导大型项目?
故不积跬步无以至千里,不积小流无以成江海。先从做好每一件小事开始,把每个业务需求做到120分,深度思考,发现问题,解决问题,逐步建立起靠谱有责任心技术牛的人设,逐步负责有技术难度的事情,跟随公司业务发展积累自己的业务领域经验与技术深度,从而获得双赢的回报。这是我对如何积累技术深度这件事的理解,或许会有一些片面和偏激,毕竟不是谁都有一个能知人善任的好领导,不是谁都能遇到一个快速发展的业务,不是谁都能遇到有技术难度与技术挑战的场景,无论我怎么说,都会有幸存者偏差的存在。
2024-10-16 10:14:58
349
原创 Mybatis框架用到了哪些设计模式?
MyBatis使用代理模式来实现动态SQL和懒加载。通过JDK动态代理或CGLIB代理,MyBatis可以在运行时创建接口的实现,从而在执行方法时添加额外的行为。
2024-10-15 09:48:38
765
原创 多年以后,PageHelper 又深深给我上了一课!
关于PageHelper的介绍就这么多,真的是折磨我好几天,要不是项目紧急,来不及替换,我一定不会使用这个组件。莫名其妙的就会有个方法出现问题,一通排查,发现都是这个PageHelper导致的。虽然我已经全局搜索使用的地方,保证。
2024-10-15 09:48:03
871
Java 并发编程实战(英文版)
2017-01-07
Java RESTful Web Service实战 高清完整.pdf版下载
2017-01-01
Java RESTful Web Service实战 [韩陆著]
2016-12-31
大型网站技术架构:核心原理与案例分析+李智慧
2016-12-31
Spring 3.x 企业应用开发实战】完整高清扫描版).pdf
2016-07-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人