- 博客(321)
- 收藏
- 关注
原创 leetcode-16. 最接近的三数之和
通过排序加双指针法,我们能够高效地解决三数之和最接近(3Sum Closest)的问题。该方法利用数组的有序性,通过双指针在固定一个元素的基础上快速查找剩余两个元素,以找到最接近目标值的和。关键步骤回顾:排序数组,简化搜索过程。固定第一个元素,使用双指针查找剩余两个元素。在查找过程中持续更新最接近的和。合理移动指针以优化搜索效率。掌握此类技巧,不仅有助于解决类似的编程问题,还能加深对双指针法和排序在算法中的应用理解。
2025-02-19 04:08:23
611
原创 业务无关-怎么理解幂等性,有遇到过实际场景么,怎么解决的,为什么用redis,redis过期了或者数据没了怎么办
是指对同一操作的多次执行所产生的影响与一次执行的影响相同。在分布式系统、网络通信和API设计中,幂等性是保证系统可靠性的核心机制,尤其在网络不稳定或客户端重试时,避免数据重复处理或状态不一致。:用户点击支付按钮后,因网络延迟重复提交请求,导致重复扣款。
2025-02-11 00:34:10
484
原创 Java-并发编程-特性-可见性-synchronized如何保证可见性?
Java内存模型定义了Java虚拟机(JVM)如何与计算机的内存(主内存)交互,以及如何在多线程环境下保证线程之间的可见性和有序性。主内存(Main Memory):所有线程共享的内存区域,用于存储类的字段、实例变量等。工作内存(Working Memory):每个线程独立拥有的内存空间,用于存储线程使用的变量的副本。线程对变量的操作主要在工作内存中进行,必须通过读写主内存实现线程间共享数据。关键字在Java中不仅用于实现线程间的互斥访问,还通过内存屏障机制保证了内存的可见性。可见性保证。
2025-01-25 18:57:54
959
原创 数据库-MySQL-事务-事务隔离级别的可重复读是如何实现的?
在深入探讨可重复读之前,简要回顾一下事务隔离级别的基本概念。读未提交读已提交可重复读串行化这些隔离级别通过控制事务之间的读写操作,平衡数据一致性和系统并发性能。可重复读防止脏读(Dirty Read):事务只能读取到其他事务已经提交的数据。防止不可重复读(Non-Repeatable Read):在同一事务中,多次读取同一数据行,结果一致,即使其他事务修改了该数据。防止幻读(Phantom Read)
2025-01-23 00:50:08
847
原创 数据库-MySQL-事务-事务隔离级别的读已提交是如何实现的?
读未提交读已提交可重复读串行化不同的隔离级别通过控制事务之间的可见性和锁机制,来防止诸如脏读、不可重复读和幻读等并发问题。读已提交防止脏读(Dirty Read):一个事务只能读取到其他事务已经提交的数据,避免读取未提交的脏数据。允许不可重复读(Non-Repeatable Read):在同一个事务中,多次读取同一数据可能会得到不同的结果,因为其他事务可以在此期间提交修改。允许幻读(Phantom Read):如果一个事务多次执行相同的查询,可能会看到其他事务在其间插入的新行。
2025-01-23 00:44:37
745
原创 缓存-Redis-数据结构-redis哪些数据结构是跳表实现的?
在Redis中,跳表是有序集合(Sorted Set)的核心实现数据结构,提供了高效的有序操作和动态调整能力。跳表的选择基于其实现简单性、性能优势、内存效率以及对动态数据处理的灵活性,使其成为Redis在实现有序集合时的理想选择。
2025-01-23 00:05:34
1249
原创 缓存-Redis-API-Redission-自动续期-watch dog
Watchdog(看门狗)是 Redisson 提供的一种自动续租机制,旨在确保分布式锁在持有期间不会因锁的过期时间设定不当而被提前释放。通过 Watchdog,Redisson 可以在持有锁的过程中动态地延长锁的有效期,避免因业务处理时间超出预期而导致锁被错误释放,从而引发并发问题。在某些场景下,开发者可能希望显式指定锁的有效期,而不依赖于 Watchdog 的自动续租。这时,可以在获取锁时设定leaseTime参数,Redisson 将不会启动 Watchdog 自动续租机制。try {
2025-01-07 06:46:31
1254
原创 缓存-Redis-API-Redission-可重入锁-原理
可重入锁(Reentrant Lock)是一种在同一线程(或同一客户端)在持有锁的情况下,可以再次获取同一锁而不会导致死锁的锁机制。通俗来说,就是一个线程在已经获取到锁的情况下,可以多次进入被锁定的代码块,而不会被阻塞。Redisson 提供的可重入锁(RLock接口的实现)基于 Redis 构建,适用于分布式环境中多实例间的同步控制。与 Java 中的类似,Redisson 的可重入锁允许同一客户端多次获取锁,并通过计数器管理锁的重入次数。
2025-01-07 05:24:48
970
原创 缓存-Redis-API-Redisson-可重试
Redisson 提供的分布式锁(RLock)基于 Redis 实现,允许多个客户端在不同的 JVM 或服务器上协调对共享资源的访问。与传统的本地锁不同,分布式锁能够跨进程、跨机器工作,适用于微服务架构和分布式应用。Redisson 提供的分布式锁功能强大、易于使用,能够有效解决分布式系统中的并发控制问题。通过合理配置加锁等待时间、锁持有时间和重试次数,可以确保锁的高效性和可靠性。然而,在使用分布式锁时,也需注意锁的合理范围、锁的持有时间以及异常处理等问题,以避免潜在的性能瓶颈和死锁风险。
2025-01-07 02:25:33
1124
原创 缓存-Redis-常见问题-缓存击穿-永不过期+逻辑过期(全面 易理解)
将缓存数据设置为永不过期(即不依赖 Redis 的 TTL),这样缓存项本身不会因时间原因自动失效。所有的过期逻辑由应用程序内部控制。我们需要一个数据结构来存储实际数据和逻辑过期时间。// 逻辑过期时间,单位毫秒 public CacheData() {} }// 逻辑过期时间,单位毫秒 public CacheData() {} }// 逻辑过期时间,单位毫秒 public CacheData() {} }
2025-01-07 01:04:18
1202
原创 缓存-Redis-缓存更新策略-主动更新策略-Cache Aside Pattern,先删除缓存,还是先更新数据库?
在中,推荐的操作顺序是先更新数据库,再删除缓存。这一顺序有助于确保数据的一致性和系统的稳定性。然而,在实际应用中,尤其是在高并发和分布式系统环境下,还需要结合互斥锁、版本控制、事务机制以及完善的监控与日志系统,以应对潜在的竞态条件和一致性问题。通过合理设计和实现,可以有效地利用Cache-Aside Pattern提升系统性能,同时保持数据的一致性和可靠性。
2025-01-06 05:16:43
1181
原创 缓存-Redis-缓存更新策略-主动更新策略-除了旁路缓存的其他策略
主动更新策略指的是在数据可能发生变化时,主动地去更新缓存中的数据,而不是等待缓存失效后再去更新。这种策略能够提高数据的一致性和实时性,适用于数据变化频繁且对实时性要求较高的场景。写直通(Write-Through)写后(Write-Behind 或 Write-Back)预刷新(Refresh-Ahead)发布/订阅(Pub/Sub)机制使用 Lua 脚本实现原子更新数据同步与复制Redis 提供了多种主动更新策略,帮助开发者在不同的应用场景下有效地管理缓存数据。
2025-01-06 04:56:37
1546
原创 缓存-Redis-缓存更新策略-主动更新策略-Cache Aside Pattern(全面 易理解)
也称为或旁路缓存模式,是一种数据访问模式,其中应用程序根据需要动态地从缓存或数据库中加载数据。其核心思想是只有当应用程序需要数据时,才从数据库中加载并将其放入缓存;而当数据被修改时,应用程序首先更新数据库,然后使缓存失效或更新缓存。这种模式适用于数据访问呈现出局部性和高读取但低写入的特点。**Cache-Aside Pattern(旁路缓存模式)**作为一种灵活且高效的缓存管理策略,广泛应用于各种高性能和高并发的应用场景中。它通过按需加载和动态更新缓存,兼顾了系统的性能和数据的一致性。
2025-01-06 04:52:30
1257
原创 并发-锁-乐观锁(易理解)
乐观锁是一种基于数据版本控制的并发控制机制。在高并发环境下,乐观锁通过允许多个事务同时读取数据,并在提交更新时检查数据是否被其他事务修改,从而确保数据的一致性。乐观锁适用于冲突较少的场景,因为它避免了频繁的锁操作,提高了系统的吞吐量。**乐观锁(Optimistic Lock)**通过假设并发冲突较少,避免了频繁的锁操作,适用于高并发读多写少的场景。它通过版本号、时间戳等机制,在更新数据时进行冲突检测,确保数据的一致性。
2025-01-05 05:32:42
39
原创 数据库-MySQL-limit优化(全面 易理解)
使用上一页的最后一条记录作为下一页的起点,避免使用OFFSET。示例假设上一页的最后一条记录的SELECT *LIMIT 20;这种方法通过使用索引列的范围查询,避免了高偏移量带来的性能问题。前面已经提到过,这是一种避免高偏移量的有效方法。下面再详细介绍其优点和实现方式。优点高效:避免了高偏移量扫描,查询速度稳定。可扩展:适用于非常大的数据集。实现方式优先获取上一页的最后一条记录的关键字段值,例如,然后在下一页查询中使用该值作为起点。示例假设上一页最后一条记录的SELECT *LIMIT 20;
2025-01-02 04:14:44
1177
原创 数据库-MySQL-刷题-select * from t where a in (1,2) order by b,c;联合索引(a,b,c);order by会走索引吗?
使用联合索引(a, b, c)并不能完全满足的排序需求,因为ORDER BY中不包含索引的最左前缀列a,且a存在多个值,导致无法通过顺序扫描索引来实现全局排序。因此,MySQL 需要执行额外的文件排序步骤(
2024-12-31 03:36:49
892
原创 数据库-MySQL-刷题-select * from t where a=1 order by b,c desc;联合索引(a,b,c),order by是否会走索引?
索引下推是一种优化策略,它将更多的查询条件下推到索引扫描阶段进行过滤,而不仅仅依赖于索引本身来满足查询条件。通过在索引扫描过程中应用额外的过滤条件,数据库可以在更早的阶段排除不符合条件的行,减少后续的数据处理量。索引使用情况联合索引(a, b, c)被部分利用,用于和ORDER BY b。由于c列的排序方向与索引方向不一致,无法完全利用索引进行排序,导致需要额外的文件排序步骤。优化建议调整ORDER BY的排序方向,使其与索引一致。使用覆盖索引来减少回表操作。
2024-12-31 03:03:07
584
原创 数据库-MySQL-刷题-select * from t where a=1 and c=2 order by b;联合索引(a,b,c) order by b是否会走索引?
在您的场景中,联合索引(a, b, c)是适合的索引设计,能够有效优化的查询。通过EXPLAIN分析,可以确认 MySQL 是否如预期使用了索引。为了进一步优化,可以考虑覆盖索引和查询调整,以最大限度地利用索引优势。
2024-12-31 02:55:44
548
原创 数据库-MySQL-索引-索引下推
索引下推是一种优化策略,它将更多的查询条件下推到索引扫描阶段进行过滤,而不仅仅依赖于索引本身来满足查询条件。通过在索引扫描过程中应用额外的过滤条件,数据库可以在更早的阶段排除不符合条件的行,减少后续的数据处理量。
2024-12-30 22:40:00
1205
原创 数据库-MySQL-sql有in会走索引吗?(易理解)
IN操作符在 SQL 查询中是一种常见且方便的条件语句。当涉及的列上存在合适的索引时,IN查询通常能够有效利用索引,提高查询性能。然而,索引的利用效果依赖于多个因素,包括IN列表的大小、数据分布、索引类型以及数据库管理系统的优化策略。为了确保IN设计合适的索引:根据查询模式和条件,创建单列或复合索引。控制IN列表的规模:避免过大的IN列表,必要时使用替代方案如子查询或临时表。定期维护统计信息:确保优化器基于准确的统计信息做出决策。分析查询执行计划。
2024-12-30 03:42:40
2077
原创 数据库-MySQL-索引-满足覆盖索引和最左前缀原则一定会走索引吗?
虽然满足覆盖索引和最左前缀原则显著增加了查询使用索引的可能性,但并不绝对保证一定会走索引。数据库优化器会综合考虑多种因素来选择最优的执行计划。因此,在设计和优化索引时,除了满足这两个原则外,还需全面考虑数据分布、表大小、查询类型等因素,并通过分析执行计划来验证索引的实际效果。
2024-12-30 03:07:46
926
原创 leetcode-146.LRU缓存(易理解)
为了实现一个满足 LRU(最近最少使用)缓存约束的数据结构,我们需要在 (O(1)) 时间复杂度内完成get和put操作。
2024-12-11 18:12:18
541
原创 leetcode-215.数组中的第k个最大元素
除了快速选择算法之外,还有其他方法可以用来找到数组中第 (k) 个最大的元素,不过它们的时间复杂度可能会有所不同。
2024-12-11 16:19:28
275
原创 leetcode-3.无重复字符的最长子串(易理解)
要找到一个字符串中不含重复字符的最长子串的长度,可以使用滑动窗口技术。这种方法可以在 O(n) 时间复杂度内解决问题,其中 n 是字符串的长度。
2024-12-10 23:28:05
423
原创 业务-超卖问题(易理解)
乐观锁通过版本号来检测并发冲突,是一种轻量级的并发控制策略。它适用于读多写少的场景,可以有效减少锁争用,提高系统的并发性能。在使用 MyBatis 实现乐观锁时,关键在于通过条件更新语句确保数据的一致性。乐观锁的设计初衷是为了提高并发性能,允许多个事务同时进行操作,但在提交时检查冲突。因此,它可能导致后到的请求先完成更新。在某些应用场景下,这种行为是可以接受的,但如果业务逻辑对顺序有严格要求,需要额外的机制来保证顺序性。
2024-12-10 20:55:18
1079
原创 leetcode-88.合并两个有序数组(易理解)
为了合并两个已排序的数组nums1和nums2,并将结果存储在nums1中,我们可以采用双指针的方式从后向前进行合并。这种方法的好处是可以避免在nums1中移动元素,从而提高效率。
2024-12-09 18:19:50
482
原创 rpc-dubbo-多版本
通过使用 Dubbo 的注解方式,你可以更加简洁地配置多版本服务。服务提供者和消费者都可以通过注解指定版本号,从而实现不同版本服务的调用。这样可以帮助你在服务升级时更好地进行版本管理和兼容性处理。
2024-12-05 22:40:23
432
原创 leetcode-42.接雨水
使用动态规划的方法来解决“接雨水”问题也是一种有效的策略。动态规划的基本思想是预先计算出每个位置的左侧和右侧的最大高度,然后根据这些预计算的结果来确定每个位置可以存储的雨水量。
2024-12-05 21:10:58
444
原创 分布式协调服务-Zookeeper
dubbo选择zookeeper作为注册中心,zookeeper的znode长什么样子?dubbo是如何暴露接口的?
2024-12-05 00:21:42
502
原创 设计模式-代理模式
在 MyBatis 框架中,Mapper 接口的工作原理确实是基于 JDK 动态代理机制。MyBatis 使用动态代理来创建接口的实现类实例,以便在运行时执行 SQL 语句并返回结果。以下是 MyBatis 如何利用 JDK 动态代理实现 Mapper 接口的工作原理:Mapper 接口定义:动态代理创建代理对象: 作为 :执行 SQL 语句:结果映射:假设有一个简单的 Mapper 接口:在 MyBatis 中使用时,执行过程如下:通过 JDK 动态代理,MyBatis 能够在运行时为 Mapper 接
2024-12-04 14:44:32
654
原创 leetcode-10.正则表达式匹配
不匹配字符,将该组合扔掉,不再进行匹配。- 如果当前字符 `s[i]` 能够匹配 `p[j-1]`(即 `p[j]` 是 `*`,而 `p[j-1]` 是与 `s[i]` 匹配的字符),我们可以认为 `p[j-1]*` 这个组合匹配了 `s[i]`,然后继续尝试匹配 `s[i-1]`,`s[i-2]` 等等。- 具体来说,`f[i][j] = f[i][j-2]` 表示我们不使用 `p[j-1]*`,直接看 `p` 的前 `j-2` 个字符是否能匹配 `s` 的前 `i` 个字符。
2024-12-04 12:20:13
803
原创 MybatisPlus
UserMapper接口继承BaseMapper接口->注入UserMapper对象->调用增删改查。引入MybatisPlus起步依赖。
2024-06-30 01:23:40
423
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人