- 博客(199)
- 资源 (1)
- 收藏
- 关注
原创 拒绝 If-Else 屎山:利用适配器模式(Adapter)构建第三方登录的“防腐层”实战
本文介绍了如何利用适配器模式构建防腐层(ACL)来解决多渠道第三方登录对接问题。针对不同渠道返回的异构数据(如姓名、性别、日期等格式差异),通过定义通用转换接口和具体渠道适配器,将外部"脏数据"转换为内部标准格式。该方法使业务层代码保持简洁,提升新渠道接入效率40%以上,有效隔离外部数据污染核心逻辑。文章还区分了适配器模式与策略模式的不同应用场景,前者专注数据转换,后者处理业务行为。最终实现只需新增适配器类即可扩展新渠道,大幅提升系统可维护性。
2026-02-03 11:09:51
549
原创 生产环境实战:千万级数据深分页(Deep Paging)从 5s 优化至 500ms 的全过程
本文探讨了性能压测中遇到的MySQL深分页问题及优化方案。针对千万级数据表的批处理任务,原SQL因使用LIMIT 900000,1000导致需要扫描90万条数据,性能急剧下降。提出两种优化方案:1)老代码采用"延迟关联"技术,通过子查询减少回表操作;2)新需求建议使用基于ID的分页查询。此外还分享了产品层面的防御措施(限制最大页数)以及压测中遇到的并发更新锁超时、Redis使用规范等问题。强调在实际业务中要平衡技术优化与产品合理性,避免过度设计。
2026-02-03 10:26:32
465
原创 金融/保险业务中的策略模式深度解析
策略模式在保险系统中的应用:算法封装与互换性 策略模式通过将算法封装为独立对象,实现算法的灵活替换。本文以保险保全系统为例,分析了策略模式的核心要素: 业务挑战: 25+种交易类型 差异化的校验规则和计算逻辑 频繁变更需求 架构设计亮点: 抽象策略类定义标准流程 具体策略实现差异化逻辑 模板方法与策略模式结合 技术优势: 避免if-else/switch-case逻辑 符合开闭原则 独立测试与维护 该模式有效解决了保险业务中多样化交易类型的处理问题,提升了系统的灵活性和可维护性。
2025-11-18 14:06:10
884
原创 Claude Code 提示词大全
《Claude Code高效开发指南》提供了一套完整的AI协作开发模板,覆盖项目全周期的关键场景。从项目初期的环境配置、文档整理,到功能开发时的代码实现、测试编写,再到后期的性能优化、代码审查,都给出了标准化的提示词模板。重点包括:1)任务拆解技巧,建议将复杂需求分步骤实现;2)明确边界要求,保持代码风格一致性;3)提供详细上下文,提升AI理解准确度;4)关键操作确认机制,避免意外修改。还包含实用技巧如文件引用语法、批量处理方法和常见错误规避建议,帮助开发者建立规范的AI协作流程,显著提升开发效率。
2025-11-18 13:50:43
904
原创 【记日本姓名处理引发的有趣故事】
最近在做日本保险项目的时候,遇到了一个有意思的问题:为什么同一个客户的名字,系统里会保存好几份?什么汉字版、片假名版、全角版、半角版......一个名字能玩出这么多花样?
2025-11-18 13:47:16
763
原创 传统的ID生成策略在分布式系统下为什么不行?
本文介绍了分布式ID生成策略,重点分析了传统方案(自增ID、UUID)的局限性,以及雪花算法(Snowflake)在Web应用中的兼容性问题。针对这些问题,提出了雨滴算法(RainDrop)解决方案,该算法通过53位ID设计完美适配JavaScript,支持每秒16384个ID生成,并有效处理时钟回拨问题。文章详细阐述了RainDrop的算法结构、核心优势及代码实现,最后给出了不同场景下的技术选型建议,特别推荐RainDrop作为Web应用的首选方案。
2025-11-17 14:56:03
1003
原创 【设计模式】一文读懂工厂模式
工厂模式是创建对象的一种设计模式。简单来说,创建对象的地方我们就叫做工厂,在工厂中统一管理各种对象。我们通过统一的接口来指向新创建的对象。这里的工厂模式我们可以和策略模式结合来说,因为策略模式需要多种策略,我们就可以使用SpringBoot的自动注入功能,将不同类型的实现类注入到Map或者List中,从而实现工厂模式的效果。工厂模式的优点;解耦:工厂模式对象创建和使用分离;对象集中管理:将对象的创建全部管理到一起;针对简单的对象管理,不推荐使用工厂模式,可能会显得过于复杂了。
2024-08-08 18:30:22
473
1
原创 【设计模式】一文读懂策略模式
学习设计模式不仅仅是炫技,还可以让你 在看各种代码时如鱼得水。碰到一些典型的设计模式,还会惊讶于Coder的设计。今天来分享设计模式中的策略模式,也是最近在实习中看到的。其实策略模式在项目中的应用很多,封装不同的算法,然后只需要调用即可,这样即使你不会设置一些算法(策略),但是你可以拿到别人设计好的策略开箱即用。就像之前说的,策略模式会定义一系列算法,或者叫做策略 - Strategy。每个算法会独立封装在特定的类中,使用哪个策略,直接调用替换即可。
2024-08-06 19:20:36
943
原创 动态规划中的股票问题全解析
3、 dp数组初始化:dp[0][0]为第0天持有股票,dp[0][0] -= prices[i]。dp[0][1]表示第0天不持有股票,dp[0][1] = 0。一定是选最大的,所以 dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);dp[i][j]中i表示第i天,j为[0 - 4]五个状态,dp[i][j]为第i天状态j所剩的最大现金。■ 操作一:第i天买入股票了,那么dp[i][1] = dp[i-1][0] - prices[i]
2024-04-28 11:32:33
1160
原创 动态规划中的背包问题全解析
问题转换:求得石头重量总和,再分解为重量相同的两堆,剩下的就是最小的重量。/**dp[j] 为石头的最小重量 最小容量为 sum / 2石头重量、价值为stones[i]。*/sum += i;dp[0] = 0;i ++){j --){背包原问题:我们有i个物品,记作nums[i],并且每个物品价值为value[i],给定背包容量target,怎样才能装到背包的最大价值?背包问题的本质就是:给出一个数组或者取值范围,能否组成我们想要的target?
2024-04-11 14:36:42
1020
原创 LRU算法中那些你不知道的事
Redis的LRU算法存在缓存污染的问题,比如应用一次读取了大量的数据,而这些数据只会被读取这一次,那么这些数据会留存在 Redis 缓存中很长一段时间,造成缓存污染。当 Redis 进行内存淘汰时,会使用随机采样的方式来淘汰数据,它是随机取 5 个值(此值可配置),然后淘汰最久没有使用的那个。注意,在这个LRU链表中,最常访问的元素我们放在了链表末尾,当元素满时,每次移除链表头的元素。如果使用传统的LRU算法,Redis不想维护一个较大的链表,占用内存空间。,用于记录此数据的最后一次访问时间。
2024-04-08 23:20:32
1071
原创 Elasticsearch的倒排索引是什么?
Elasticsearch是基于 Apache Lucene【lusen】的搜索引擎,支持Restful API风格【可以使用常见的HTTP请求来访问】,并且搜索速度很快,可以提供实时的搜索服务。其实Elasticsearch的功能有很多,比如分布式存储、实时数据分析等很多方面。系统解耦。使用ES之后,我们的搜索功能就完全独立于数据库了,这样就不会影响到其他业务的性能。数据分析。深度分析用户行为,用户对于哪个社区感兴趣,对于哪一条帖子感兴趣,对我们来说至关重要。可以达到毫秒级的查询。
2024-04-01 20:49:58
1358
原创 5分钟看懂 Web3.0 钱包签名登录
可以恢复公钥,通过公钥可以获得公钥的address。最后将通过公钥获得的address和你的钱包地址进行对比,如果相同,我们就可以执行后续的登录逻辑了。Web3钱包,钱包中保存了自己的公钥和私钥信息,私钥用于签名,证明是你在进行当前行为,公钥用于验证,验证是本人的操作。比如我们的网站就是一个私人俱乐部,那么门口有一个保安需要验证我们(前端、用户)的身份,保安就是我们的后端服务。保安拿到你的签名和钱包地址,通过钱包地址从Redis中拿出纸条,利用拿出来的纸条和签名,通过。PS:MetaMask是做什么的?
2024-03-27 23:14:48
2787
原创 【解锁未来】让微软Copilot介绍自己,再由ChatGPT润色文章,到底能成什么样?
今天突发奇想,如果让微软Copilot介绍自己,再由ChatGPT润色文章,到底能成什么样?
2023-11-25 16:30:11
1628
1
原创 【解锁未来】OpenAI:从创始到GPT4的发展
这是一个大型多模态模型,虽然在许多现实世界的场景中,它的能力还不如人类,但在各种专业和学术基准上,它已经能够表现出近似人类水平的性能。例如,GPT-4通过了模拟的律师考试,分数约为全部应试者的前10%。总的来说,OpenAI的发展历程充满了创新和突破,从其创始到GPT-4的发布,OpenAI一直在推动人工智能技术的发展,为人类带来了许多可能性。接下来的几年,OpenAI推出了多个开放平台,如OpenAI Gym和OpenAI API,这些平台为机器学习和自然语言处理提供了强大的工具。
2023-11-20 09:41:54
391
原创 【解锁未来】探索Web3的无限可能-02
简单地说,Web3 是加密货币的延伸,它以新的方式使用区块链来达到新的目的。区块链可以存储钱包中代币的数量、自我执行合同的条款或去中心化应用程序(dApp)的代码。并非所有区块链的工作方式都相同,但一般来说,代币被用来激励矿工处理交易。在像比特币这样的 "工作量证明 "链上,处理交易所需的复杂数学问题的解决是能源密集型设计。在 "权益证明 "链上,交易的处理只需要在链上拥有权益的验证者同意交易是合法的,这个过程的效率要高得多。在这两种情况下,交易数据都是公开的,但用户的钱包只能通过加密生成的地址来识别。
2023-11-02 18:37:32
433
原创 【解锁未来】探索Web3的无限可能性-01
还记得你第一次听说比特币吗?也许那只是一个关于新技术将改变一切的微弱嗡嗡声。也许你会有一种 "FOMO "的感觉,因为那些早早入场的人突然积累了一大笔财富–尽管你并不清楚这些 "钱 "可以合法地花在什么地方(真的很贵的披萨?) 也许你只是想知道自己的公司是否应该制定加密货币战略,以防比特币真的在你的行业中兴起,即使你并不真的关心它。最有可能的是,在比特币进入你的视线后不久–无论那是什么时候–就出现了崩盘。每隔一两年,比特币的价值就会下跌。
2023-10-21 17:45:37
821
1
原创 【面试实战】校园管理平台项目
底层基于Spring Boot。权限模块【负责用户注册、登录、权限控制】,主要用到的技术是Spring Security、Interceptor拦截器。核心模块【首页、帖子、评论、私信、统一异常处理、统一记录日志】,异常处理和记录日志主要运用了Spring AOP的思想,针对项目中的代码进行一个横向的扩展。并且缓存用户的信息、验证码、登录凭证到Redis,减小数据库访问压力。项目介绍:项目基于Spring Boot,大体可以分为四个模块,权限、核心、性能、通知。
2023-06-21 18:48:14
1216
原创 【面试实战】Java基础、集合问题全总结
可变性:String是不可变的,StringBuffer与StringBuilder是可变的。线程安全性:String线程安全;StringBuffer对 方法添加了同步锁,所以也是线程安全的;StringBuilder没有对方法加同步锁,所以是线程不安全的。性能:String每次进行改变的时候,都会产生一个新的对象;StringBuilder每次都会对对象本身进行操作,而不是产生新的对象;相同情况下,使用StringBuilder比使用StringBuffer可以获得一定(10-15%)的性能提升。
2023-06-04 17:10:00
956
1
原创 【面试实战】Kafka面试题
在处理大量数据时,kafka的性能更高,比如我们将event封装为Message存储到数据库,执行的是顺序批量操作。RabbbitMQ的效率要低于Kafka,但是RabbitMQ的消息可靠性更高。消费者负责将消息队列中的Event取出,并将其封装为Message对象,并持久化到数据库中保存。了解到除了Kafka还有其他的消息队列,比如RabbitMQ。是一个分布式流式处理平台,流平台一个关键的功能就是消息队列。
2023-05-31 20:47:16
1002
原创 【面试实战】Redis项目实战
高并发:单台设备的 Redis 的 QPS(Query Per Second,每秒钟处理完请求的次数) 是 MySQL 的 10 倍,Redis 单机的 QPS 能轻松破 10w,而 MySQL 单机的 QPS 很难破 1w。的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。
2023-05-28 19:19:46
1228
1
原创 【面试实战】操作系统面试实战
🙋♂答:PCB是进程控制块,用来描述进程。一个进程存在,必然会有一个PCB,如果进程消失,那么PCB也会消失。进程标识符、用户标识符;进程当前状态;进程优先级:进程抢占 CPU 时的优先级;CPU 中各个寄存器的值,当进程被切换时,CPU 的状态信息都会被保存在相应的 PCB 中,以便进程重新执行时,能从断点处继续执行。PCB通过链表进行组织,把具有相同状态的进程链在一起,组成各种队列。将所有处于就绪状态的进程链在一起,称为就绪队列;把所有因等待某事件而处于等待状态的进程链在一起就组成各种。
2023-05-25 20:24:42
834
原创 【面试实战】计算机网络面试实战
🙋♂答:IP地址用来标识网络中的唯一一台设备。IP 地址(IPv4 地址)由 32 位正整数来表示,IP 地址在计算机是以二进制的方式处理的。IP使用点分十进制来表示,也就是8位一组,共4组,用分割,再将每组转换为十进制。发送方发送数据,设置目标设备的IP地址作为数据包的目的地。路由:如果目标设备与发送方不再同一个子网内,发送方将数据包发送到默认网关中(路由器)。之后路由器查询路由表,根据目的地址转发给下一跳,直到数据包到达目标设备所在的子网。
2023-05-24 20:53:04
1136
原创 【面试实战】Spring基础、IoC、AOP、MVC、Mybatis、Spring Boot
🙋♂答:Spring Bean就是IoC容器所要管理的对象。通过注解的方式,我们可以告诉IoC容器管理什么对象。Spring装配对象的四个注解:@Component(组件):装配普通组件到IOC中。@Repository(仓库):装配持久化层到IOC中。@Service(业务):装配业务逻辑层到IOC中。@Controller(控制):装配控制层/表示层组件到IOC中。Before(前置通知):目标对象的方法调用之前触发After(后置通知):目标对象的方法调用之后触发。
2023-05-23 20:49:26
944
原创 【面试实战】Redis缓存设计
🙋♂答:简名达意。雪崩,就是大量缓存数据在同一时间失效,或者Redis宕机。此时有大量的用户请求无法在Redis处理。直接访问数据库,导致数据库压力剧增,可能造成数据库宕机、等一系列连锁反应,最终整个系统崩溃,这就是缓存雪崩的问题。🙋♂答:缓存击穿可以认为是缓存雪崩的子集。击穿,指的是某个热点数据过期,大量请求访问该热点数据,就无法从缓存中获取,导致MySQL服务器压力剧增,可能引发宕机等一系列问题,最终导致系统崩溃,就是缓存击穿的问题。🙋♂答:缓存穿透,就是大量请求访问。
2023-05-22 20:55:52
1249
原创 【面试实战】Redis过期删除与内存淘汰
🙋♂答:过期删除策略就是删除过期键值对采用的方法。Redis采用惰性删除 + 定期删除两种策略。惰性删除:就是在每次访问key的时候,都先对key的过期时间进行检查。如果过期,就删除,返回null给客户端;没有过期就正常返回。定期删除:会每隔10S 检查一次数据库,先从过期字典中随机抽取20个key,检查这20个key是否过期。如果key的过期数量大于25%,继续重复进行检查;反之停止继续删除。
2023-05-21 22:46:50
584
原创 【面试实战】Redis持久化面试题
🙋♂答:Redis的数据都是存储在内存中的,当Redis重启后,内存中的数据就会丢失,但是Redis实现了数据持久化的方式。主要通过AOF日志和RDB日志来实现。🙋♂答:RDB快照记录某一瞬间的内存数据,记录实际的数据。在恢复数据时,比AOF的效率更高。
2023-05-17 21:18:18
899
原创 【面试题】面试官:昨天问了MySQL,今天问问Redis
计算出剩余的空间大小,可以用来判断空间是否满足修改需求,如果不满足的话,就会自动将 SDS 的空间扩展至执行修改所需的大小,然后才执行实际的修改操作,所以使用 SDS 既不需要手动修改 SDS 的空间大小,也不会出现前面所说的缓冲区溢出的问题。因此, SDS 的 API 都是以处理二进制的方式来处理 SDS 存放在 buf[] 里的数据,程序不会对其中的数据做任何限制,数据写入的时候时什么样的,它被读取时就是什么样的。在更新数据的时候,只更新缓存,同时将缓存数据设置为脏的,然后立马返回,并不会更新数据库。
2023-05-08 22:40:21
582
1
【Java】Java集合框架思维导图。
2022-04-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅