- 博客(586)
- 资源 (2)
- 问答 (1)
- 收藏
- 关注
原创 (图文详解+源码解析)卓望一面:你可以介绍一下常见的分布式ID生成算法吗?
本文介绍了三种主流分布式ID生成方案及其优缺点: 美团Leaf号段模式:通过预分配ID段到内存提升性能(5W+/s),支持高可用和趋势递增,但存在ID连续暴露业务量、依赖数据库等问题,适合订单等需要有序ID的场景。 Twitter Snowflake及增强版:去中心化生成64位ID(含时间戳、机器ID和序列号),美团Leaf通过ZK分配WorkerID,百度UidGenerator采用RingBuffer预生成ID实现超高并发(600W+/s)。优点是无序安全性高,但强依赖时钟,适合消息ID等高QPS场景。
2025-10-26 23:22:51
610
6
原创 从夯到拉的Redis和MySQL双写一致性解决方案排名
本文探讨数据库与缓存同步策略,对比五种方案:1)同步更新缓存存在乱序问题;2)先删缓存后更新数据库可能产生脏读;3)先更新数据库后删缓存仍可能不一致;4)延迟双删通过等待主从同步后二次删除解决一致性问题;5)基于binlog的canal方案实现严格顺序同步,但需引入MQ增加成本。最优方案是延迟双删,在保证数据一致性与系统复杂度之间取得平衡,而canal+MQ方案虽可靠但成本较高。
2025-10-22 16:43:54
638
原创 Redis学习笔记-QuickList
Redis 3.2引入的Quicklist是一种混合数据结构,它是由ziplist节点组成的双向链表,结合了ziplist的高内存效率和linkedlist的操作性能优势。Quicklist通过将多个元素存储在ziplist节点中,减少了指针开销,同时避免了大规模连锁更新的风险。目前它是Redis List类型唯一的底层实现,取代了早期的linkedlist+ziplist组合。用户可以通过配置调整内部ziplist节点的大小,在内存效率和操作性能之间取得平衡。
2025-10-16 19:26:30
769
原创 卓望一面:caffeine比Redis缓存比,有什么优势,为什么要用到caffeine,解决了Redis存在的什么问题,但是他又存在什么其他问题
本文分析了Caffeine与Redis两种缓存的本质区别和协同关系。Caffeine作为本地缓存,具有无网络延迟、无需序列化、高性能的优势,适合处理高频热点数据;Redis作为分布式缓存则提供数据共享和更强一致性。文章指出Caffeine解决了Redis在网络延迟和序列化上的瓶颈,但自身也带来了数据一致性、内存限制等问题。最后给出了典型的二级缓存架构方案,建议将两者结合使用,Caffeine作为L1缓存拦截高频请求,Redis作为L2缓存提供数据共享,形成互补的缓存体系。
2025-10-14 21:11:37
705
原创 卓望一面:泛型擦除-new ArrayList<String>之后可以塞一个Integer吗?
本文展示了如何通过反射绕过Java泛型检查。示例代码创建了一个泛型为String的ArrayList,然后使用反射获取add方法并强制传入Integer类型值,成功绕过了编译期类型检查。程序输出显示List中同时包含String和Integer对象,验证了运行时泛型类型擦除机制。这种方法虽然可行,但会破坏类型安全,容易导致运行时异常。
2025-10-14 21:07:29
144
原创 `String`、`StringBuilder` 和 `StringBuffer`区别&卓望一面面试题
Java中处理字符串的三个核心类String、StringBuffer和StringBuilder各有特点:String是不可变的,线程安全但频繁修改性能差,适合存储固定文本;StringBuffer可变且线程安全,适合多线程环境;StringBuilder可变但非线程安全,单线程下性能最优。选择时根据线程安全和性能需求决定:不变用String,单线程修改用StringBuilder,多线程修改用StringBuffer。
2025-10-14 20:39:56
1020
原创 卓望一面:如何做日志脱敏
Java日志脱敏是保护用户隐私的重要措施,主要方法包括:1)利用Log4j2的正则替换功能或Logback的自定义转换器,在日志框架层实现脱敏;2)自定义Appender或Layout,对日志内容进行深度处理;3)重写敏感对象的toString()方法,直接输出脱敏数据;4)使用第三方脱敏工具库,通过注解标记敏感字段。其中日志框架的扩展机制是最推荐的方式,既能降低代码侵入性,又能保持灵活性和性能。
2025-10-14 19:13:32
922
原创 卓望一面:cat怎么一页一页查看
摘要: 本文介绍了Linux中less和more两个分页查看命令的用法及区别。less功能更全面,支持前后滚动、搜索、跳转等操作,常用快捷键包括空格翻页、/搜索、g/G跳转首尾行等。more仅支持向下翻页,功能较基础。两者均可通过管道符|与cat命令结合使用查看文件内容,但less交互性更强,推荐优先使用。
2025-10-14 19:03:49
324
原创 SkipList跳表(全网最全最细致易懂保姆级别手把手教程)
跳表是一种高效的数据结构,支持快速查找、插入和删除操作。本文通过具体示例详细讲解了跳表的三大核心操作: 查找操作:以查找target=12为例,演示了从最高层逐层下沉的搜索路径,最终在最底层找到目标节点。 插入操作:以插入8为例,分两步说明:首先记录每层的前驱节点,然后通过随机算法确定新节点高度(假设为3层),并更新各层指针完成插入。 删除操作:以删除6为例,展示如何定位各层前驱节点(查找阶段停在Level 0的节点3),为后续指针更新做准备。 这些操作充分利用跳表的多层索引结构,平均时间复杂度为O(log
2025-10-14 12:47:41
642
原创 设计模式-适配器模式
该代码演示了适配器设计模式。核心是将220V电源适配为5V输出:Adaptee类提供220V电压,Target接口定义5V标准,Adapter类实现接口转换(220V/44=5V)。客户端通过Adapter包装Adaptee后,可无感知地使用标准接口。这种模式在不修改原有类的情况下,通过中间层解决接口不兼容问题,使新旧组件能协同工作。典型应用场景如电源转换、旧系统改造等。
2025-10-11 23:50:51
571
原创 设计模式-代理模式
摘要: 本文展示了代理模式(Proxy Pattern)的实现。通过Subject接口定义抽象,RealSubject类实现核心功能,ProxySubject类作为代理,在调用RealSubject.request()方法前后添加增强逻辑(如前置/后置处理、性能监控)。代理模式通过组合方式扩展功能,实现延迟初始化和方法增强。代码示例演示了原始和增强两个版本的区别,体现了代理模式在不修改原有代码基础上增加功能的优势。完整代码已托管至Gitee仓库。
2025-10-11 22:52:32
497
原创 单图像去雨研究综述
单图像去雨是计算机视觉领域一个典型且高度不适定 (ill-posed) 的逆问题 [1, 2, 3, 4]。其核心任务是从单张观测到的雨天图像III中恢复出清晰、无雨的背景图像BBB,而其中的雨水成分RRR是未知的。这个问题的本质是模糊的,因为单张雨天图像可能存在多种有效的分解方式 [1]。在深度学习占据主导地位之前,去雨任务是通过基于优化的框架来解决的,这些框架依赖于手工设计的先验知识来正则化这个不适定的问题 [1, 7, 14, 21]。
2025-10-03 20:50:54
741
原创 扩散模型在单图像去雾领域的研究现状
本文系统梳理了扩散模型在单图像去雾领域的研究进展。首先阐述了基于大气散射模型的去雾理论基础和早期手工先验方法(如暗通道先验)的局限性。随后分析了深度学习在去雾中的应用,包括CNN参数估计、端到端架构和GAN感知增强,指出这些方法在信息丢失场景下的不足。最后聚焦扩散模型,探讨其通过逐步去噪的生成方式,在保持物理一致性和生成高质量细节方面的优势,为单图像去雾提供了新的研究范式。
2025-10-03 20:38:00
905
原创 HttpMediaTypeNotSupportedException: Content type ‘text/plain;charset=UTF-8‘ not supported
文章摘要:系统报错"Content type 'text/plain;charset=UTF-8' not supported",原因是Postman请求的Content-Type设置为text/plain,而后端接口@RequestBody注解要求接收JSON格式数据。解决方案是将Postman的Content-Type改为application/json,并在Body部分选择raw/JSON格式发送请求。
2025-09-18 20:08:54
233
原创 前端获取到的token为undefined
本文记录了前端获取token为undefined的问题排查过程。通过在后端接口增加打印日志,并在浏览器控制台查看错误信息,发现后端正确返回了token但前端获取失败。最终定位到问题原因是前端代码在获取token时缺少了"data"字段的访问。文章通过图文展示了完整的调试过程,重点突出了接口日志打印和代码审查在问题诊断中的关键作用。
2025-09-17 11:18:55
485
原创 ZipList优缺点总结
摘要: ZipList是一种极致节省内存的数据结构,通过无指针开销、变长编码和连续存储实现高效内存利用率,尤其适合存储少量小元素。其优点包括高内存效率和顺序访问性能,但对写操作敏感,存在连锁更新风险(O(N²)复杂度)和随机访问效率低(O(N))的缺点。Redis在元素较少时使用ZipList,超出阈值则转换为其他结构。后续引入的Listpack通过改进编码方式解决了连锁更新问题,成为其替代方案。ZipList的核心设计体现了以时间换空间的权衡。
2025-08-17 14:44:08
690
原创 (ZipList入门笔记三)——Entry 节点
Redis的ZipList(压缩列表)采用连续内存存储,通过Entry节点实现高效内存利用。Entry由三部分组成:1)previous_entry_length变长字段记录前节点长度,支持反向遍历;2)encoding变长字段编码数据类型和长度,支持字符串和整数存储;3)content存储实际数据。ZipList特点包括无指针设计、变长编码和连续内存布局,但存在连锁更新风险,可能导致性能下降。因此ZipList适合存储少量小元素,大容量场景会转为更高效的数据结构。
2025-08-17 14:38:30
994
原创 (ZipList入门笔记二)为何ZipList可以实现内存压缩,可以详细介绍一下吗
想象一下,如果你要存储的数据只是一个很小的整数(例如数字 5,实际只需要 1 字节),那么为了存储这 1 字节的数据,你就要付出 16 字节的指针开销。正因为如此,Ziplist 只适用于存储元素数量较少、内容较小的场景(List, Hash, Zset),并且在后来的 Redis 版本中,逐渐被性能更稳定的。,它实际上只需要 1 个字节,但系统依然会为其分配 4 字节,剩下的 3 字节就被浪费了。的长度,当在列表的某个位置插入一个新节点,或者删除了一个节点,可能会导致其。这种极致的压缩是有代价的。
2025-08-05 22:45:42
972
原创 (ZipList入门笔记一)ZipList的节点介绍
Redis 的 Ziplist(压缩列表)是一种紧凑的内存数据结构,用于存储少量元素的 List、Hash 和 Zset。其结构包含:32位的 zlbytes(总字节数)、zltail(尾节点偏移量),16位的 zllen(节点数),可变长度的 entry(节点数据),以及1字节的 zlend(结束标记 0xFF)。每个 entry 由 previous_entry_length、encoding 和 content 组成,通过变长编码和前驱节点长度实现双向遍历,极大节省内存。Ziplist 以连续内存布局
2025-08-05 22:17:34
3601
原创 win11获取最高权限(比管理员权限还要高)
获取 Windows 11 的 SYSTEM 权限是一个高风险操作,仅限合法技术研究使用。SYSTEM 账户拥有最高系统权限,误操作可能导致系统崩溃或安全漏洞。常见方法是使用微软官方工具 PsExec:下载 Sysinternals Suite,以管理员身份运行命令提示符,执行 psexec -s -i cmd.exe 命令即可获得 SYSTEM 权限的交互窗口(可通过 whoami 验证)。务必谨慎操作,严禁用于非法用途。
2025-08-01 15:15:01
1404
原创 Java的依赖注入的理解
本文深入浅出地讲解了Java中的依赖注入(DI)概念。首先介绍了控制反转(IoC)的核心思想,指出传统方式下对象自己创建依赖会导致高耦合和测试困难的问题。然后详细阐述了依赖注入的三种主要实现方式:构造函数注入(推荐使用)、Setter方法注入和字段注入(通过注解实现),并分析了各自的优缺点。最后用一个餐厅点菜的生动比喻来说明DI的优势。文章强调在现代Java开发中,尤其是使用Spring框架时,依赖注入是必须掌握的关键概念,它能有效解耦代码,提高可测试性和灵活性。
2025-07-31 16:57:16
894
原创 AOF和RDB分别适用于什么场景 高读写场景用RDB还是AOF好
Redis持久化方式对比:RDB通过定时快照提供高效备份,适合容忍数据丢失的场景;AOF记录所有写命令,确保数据完整性但恢复较慢。对于高读写场景,推荐混合持久化(4.0+),结合RDB快速恢复和AOF数据安全的优势,实现性能与可靠性的最佳平衡。
2025-07-30 11:03:46
1101
原创 Http401和403什么意思
HTTP 401和403状态码都表示访问被拒绝,但有本质区别。401(未授权)意味着身份认证失败,服务器无法确认用户身份,需要重新提供有效凭证。403(禁止访问)则表示身份已确认但权限不足,即使重新认证也无法访问。简单来说,401是"无法验证你是谁",403是"知道你是谁但不允许访问"。两者的核心差异在于前者是认证问题,后者是授权问题。
2025-07-30 10:59:03
905
原创 某老牌大厂面试官:MySQL的Join和On哪个先执行?
SQL查询中,JOIN和ON是一个整体操作,先于WHERE条件执行。JOIN确定表的连接方式,ON定义连接条件,两者共同生成一个虚拟中间表。WHERE子句随后对该中间表进行过滤。在LEFT JOIN中,ON条件决定右表匹配方式(不匹配时保留左表行),WHERE则对所有结果行进行过滤,可能导致LEFT JOIN效果失效。理解这个执行顺序(FROM/JOIN→WHERE→GROUP BY等)对正确编写SQL查询至关重要,特别是在处理表连接和过滤条件时。
2025-07-30 10:58:00
958
原创 某老牌大厂面试官:MySQL的Join和On哪个先执行?
SQL查询中,JOIN和ON是一个整体操作,先于WHERE条件执行。JOIN确定表的连接方式,ON定义连接条件,两者共同生成一个虚拟中间表。WHERE子句随后对该中间表进行过滤。在LEFT JOIN中,ON条件决定右表匹配方式(不匹配时保留左表行),WHERE则对所有结果行进行过滤,可能导致LEFT JOIN效果失效。理解这个执行顺序(FROM/JOIN→WHERE→GROUP BY等)对正确编写SQL查询至关重要,特别是在处理表连接和过滤条件时。
2025-07-30 10:56:03
778
原创 server error - Ports are not available: exposing port bind: An attempt was made to access a socket
摘要:在配置Cassandra服务时发现7000和7001端口无法使用,但排查显示端口未被占用。通过执行netsh int ipv4 show excludedportrange protocol=tcp命令发现6986-7085端口范围被系统保留。解决方案是选择不在该保留范围内的其他端口进行配置。
2025-07-22 22:30:04
218
原创 Public Key Retrieval is not allowed
摘要:本文介绍了在Spring Boot的yml配置文件中添加MySQL连接参数allowPublicKeyRetrieval=true的方法,该参数用于解决JDBC连接时的公钥检索问题。配置方式是在数据库URL后追加参数,并附有截图说明。这个设置适用于需要绕过SSL公钥验证的特殊场景,但需注意安全性考量。
2025-07-19 19:56:53
254
原创 div和span区别
本文通过Vue组件演示了HTML中DIV和SPAN标签的核心区别:1)DIV是块级元素,独占一行;SPAN是行内元素,可同排显示;2)DIV可设置宽高,SPAN尺寸由内容决定;3)DIV适合布局容器,SPAN适合文本样式控制。示例包含基础对比、尺寸设置差异、实际应用场景(DIV用于页面结构,SPAN用于文本修饰)及混合使用案例,通过可视化样式直观展示了二者的不同特性和适用场景。
2025-07-18 17:15:26
1039
原创 This model provider doesn‘t serve your region. Visit https://docs.cursor.com/account/regions for mor
cursor禁用了中国区IP解决方案
2025-07-17 18:01:17
1937
原创 TCP和UDP区别
TCP与UDP是网络传输层的两大核心协议,主要区别体现在: 连接方式:TCP需三次握手建立连接,UDP无连接; 可靠性:TCP提供确认重传机制保证可靠传输,UDP不保证数据必达; 有序性:TCP确保数据有序,UDP不保证顺序; 性能:TCP因复杂控制机制速度较慢,UDP轻量高效; 头部开销:TCP头部至少20字节,UDP仅8字节。 典型应用场景: TCP适用于网页、文件传输等可靠性优先的场景 UDP适用于直播、视频通话等实时性优先的场景
2025-07-13 23:34:03
2123
3
原创 京东面试官:WebSocket 和 HTTP 有什么区别?
WebSocket与HTTP协议对比摘要(149字): HTTP协议采用单向请求-响应模式,每个请求需附带完整头部信息,通信开销较大,适用于传统网页浏览等场景。WebSocket通过HTTP完成握手后升级为全双工通信,建立持久化连接,仅需2-10字节帧头,实现服务器主动推送,适合实时聊天、在线游戏等高频交互场景。两者关键差异在于:HTTP无状态、短连接、高开销;WebSocket有状态、长连接、低延迟,分别对应"寄信式"和"通话式"通信模型。WebSocket弥补了H
2025-07-13 23:19:04
609
原创 讲一下LongAdder
摘要:文章通过超市收银台的比喻,对比了Java中的AtomicLong和LongAdder两种并发计数实现。AtomicLong在高并发时因CAS重试导致性能下降,而LongAdder采用"分散热点"策略,通过主账本(base)和分账本(Cell[])实现高效写入。LongAdder适用于读少写多的场景(如访问量统计),以空间换时间提升性能;AtomicLong则更适合低并发或需精确原子更新的场景。主要差异体现在高并发写入性能、读取耗时和内存占用等方面。
2025-07-12 11:09:49
430
原创 千辛万苦3面却倒在性格测试?这太离谱了吧!
一位求职者在多轮测开面试表现优异,却因性格测试被拒。痛定思痛后,他总结出四大答题策略:强烈建议选择体现"积极主动"和"团队协作"的选项;中性题目可随意作答;坚决避开"消极被动"类答案。企业最青睐的性格特质包括责任心、抗压能力和目标导向。文章以红字突出关键建议,辅以图片说明,为求职者提供了一套实用的性格测试通关指南。
2025-07-11 23:13:55
225
原创 HTTP/3.0的连接迁移使用连接ID来标识连接为什么可以做到连接不会中断
HTTP/3通过QUIC协议的"连接ID"实现了网络切换时的无缝连接迁移,与HTTP/2的TCP连接形成鲜明对比。传统HTTP/2基于四元组(IP+端口)标识连接,网络切换时连接会中断;而HTTP/3通过固定不变的连接ID识别会话,即使IP地址变化也能保持连接不中断。这就像从固定电话(认号码)升级到微信通话(认房间号),移动设备切换Wi-Fi和蜂窝网络时,视频、下载等传输不会中断。图文对比显示:HTTP/2需要重新建立连接,HTTP/3则可自动恢复,显著提升了移动网络体验。
2025-07-08 16:07:12
688
原创 golang的defer
本文用通俗易懂的方式解释了Go语言中的defer机制。将defer比作"临时便签",即在函数执行时记录需要延迟执行的操作,待函数结束前按后进先出的顺序执行。通过回家关灯锁门、文件操作等生活化示例,对比展示了使用defer可以简化资源清理代码,确保无论函数如何退出都能执行必要操作。关键点包括:defer的执行时机是在包含它的函数返回前,执行顺序是后进先出,且适用于各种退出情况(正常返回、panic等)。这种"便签"类比帮助开发者直观理解defer的作用机制。
2025-07-06 12:27:52
425
原创 字节二面:进程,线程,协程区别
进程、线程和协程是三种并发编程模型,主要区别在于资源占用、切换开销和调度方式。进程拥有独立的内存空间,资源消耗大但稳定性高;线程共享进程资源,切换开销较小;协程由用户态控制,切换开销最小且适合高并发场景。进程适用于资源隔离,线程适合共享数据,协程则针对I/O密集型任务。三者在调度方式、通信机制和应用场景上各有特点,选择合适模型可优化程序性能。
2025-07-06 11:54:43
1666
原创 JWT鉴权的流程和原理
JWT鉴权流程与原理详解 JWT(JSON Web Token)是一种无状态认证机制,由Header、Payload和Signature三部分组成,通过Base64Url编码后用点连接。其核心原理是服务器用密钥对前两部分签名生成令牌,客户端存储后每次请求携带,服务器只需验证签名和时效而无需查询数据库。 鉴权流程包含:用户登录→服务器验证并签发Token→客户端存储→后续请求携带→服务器验证。JWT自带用户信息,适合跨域和微服务场景,但存在无法主动失效、体积较大等缺点。关键优势是无状态扩展性强,但需妥善保管签
2025-07-01 01:43:04
1031
原创 RocketMQ 消息长轮询
RocketMQ通过长轮询机制(Pull+Hold)实现高效消息消费,平衡了实时性和资源消耗。当消费者请求消息时,Broker会检查队列:有消息立即返回,无消息则挂起请求(最长15秒),期间若有新消息到达立刻响应。这种方法减少了无效请求,实现准实时消费,同时保持流量控制。关键参数包括Broker挂起时长(15秒)和消费者拉取超时(20秒)。RocketMQ的PushConsumer实际是基于长轮询的拉取模型,封装了复杂逻辑,提供简单高效的推送体验。
2025-06-27 23:52:49
643
PHP写链表 页面刷新问题
2021-06-17
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅