跳至主要內容
郑天祺的博客

郑天祺的博客

吾志所向,一往无前;愈挫愈勇,再接再厉。

介绍页

介绍页

关于郑天祺

郑天祺
此站是郑天祺的个人站,记录分享学习平时学习,喜欢编程的小伙伴可以加我共同探讨,一起进步。

QQ

image-wechat
image-wechat

郑天祺小于 1 分钟
非暴力沟通

《非暴力沟通》(Nonviolent Communication,简称NVC)由心理学家马歇尔·卢森堡提出,核心是通过转变沟通方式,在诚实表达自己的同时尊重与倾听他人,从而化解冲突、建立深度连接。它不仅是沟通技巧,更是一种看待自己与他人的思维模式。
其核心可概括为以下 “四要素模型” ,配合具体场景举例说明:

一、四要素详解与举例

1. 观察(Observation)

  • 原则:客观描述事实,不掺杂评判或推测。
  • 常见误区:混淆事实与评价(如“你总是迟到”是评价,“本周你迟到了三次”是观察)。
  • 举例:
  • 暴力沟通:“你整天玩手机,根本不关心孩子!”(带有批评)
  • 非暴力沟通:“我看到你这周每天晚饭后都在刷手机,孩子找你讲故事时你仍在看屏幕。”(仅陈述事实)

zheng大约 4 分钟产品产品
深入理解 SELECT ... FOR UPDATE:确保数据库并发操作的一致性

引言

在多用户、高并发的Web应用和分布式系统中,确保数据库操作的一致性和完整性是至关重要的。当多个事务同时尝试修改同一数据时,可能会导致数据不一致、脏读、不可重复读或幻读等问题。为了应对这些挑战,SQL 提供了 SELECT ... FOR UPDATE 语句,它可以在查询的同时锁定所选的行,防止其他事务对其进行修改,直到当前事务提交或回滚。
本文将深入探讨 SELECT ... FOR UPDATE 的工作原理、使用场景、最佳实践以及潜在的风险,并通过实际案例帮助读者更好地理解和应用这一功能。


zheng大约 14 分钟数据库mysql
interrupt方法对线程的影响

在Java中,interrupt() 方法是 Thread 类中的一个实例方法,用于中断线程。它并不直接终止线程的执行,而是设置线程的中断状态(即把该线程的中断标志设为 true)。线程可以定期检查这个中断状态,以判断是否应该提前退出或改变行为。以下是 interrupt() 方法对线程的影响:

1. 中断状态

  • 当调用 thread.interrupt() 时,如果线程正在运行,那么它的中断状态将被设置为 true。线程可以通过 Thread.currentThread().isInterrupted() 来检查自身的中断状态。
  • 如果线程已经处于中断状态,则再次调用 interrupt() 不会有额外的效果。

zheng大约 3 分钟java基础java
联合索引问题

联合索引(Composite Index)是数据库中一种重要的索引类型,它允许基于多个列的组合来加速查询。理解联合索引的实现原理有助于优化查询性能和设计高效的数据库结构。以下是关于联合索引实现原理的详细解释:

1. 联合索引的结构

联合索引本质上是一个B+树(或类似的平衡树结构),其中每个节点存储的是多个列的组合值。假设你有一个联合索引 ABC,那么索引树的结构是基于列 ABC 的组合值来排序的。


zheng大约 9 分钟数据库mysql
BigKey问题

BigKey 问题是指在 Redis 中某些键包含的数据量过大,导致这些键的操作(如读取、写入、删除等)消耗过多的内存和CPU资源,进而影响整个Redis实例的性能。解决 BigKey 问题的关键在于识别并优化这些大键,以提高系统的稳定性和响应速度。以下是几种常见的解决方法:

1. 识别 BigKey

使用 redis-cli 工具

  • MEMORY USAGE 命令:可以用来查看某个键占用的内存量。
    redis-cli --raw MEMORY USAGE <key>
    
  • SCAN 命令:结合 MEMORY USAGE 可以批量扫描并检查多个键的大小。
    redis-cli --bigkeys
    

zheng大约 4 分钟数据库redis
java线程池队列问题

问题:
Java线程池,5核心、10最大、20队列,第6个任务来了是什么状态?第26个任务来了是什么状态?队列满了以后执行队列的任务是从队列头 or 队尾取?
核心线程和非核心线程执行结束后,谁先执行队列里的任务?

在Java中,线程池的配置和行为由ThreadPoolExecutor类控制。根据你提供的参数,假设你创建了一个具有以下配置的线程池:

  • 核心线程数(corePoolSize):5
  • 最大线程数(maximumPoolSize):10
  • 任务队列容量(queue capacity):20

zheng大约 4 分钟java基础线程
跳表

跳表(Skip List)是一种数据结构,旨在提供高效的插入、删除和查找操作,同时保持相对简单的实现。它结合了链表和二叉搜索树的优点,通过引入多级索引来加速查找过程。跳表最早由William Pugh在1989年提出,并因其高效性和易于实现而被广泛应用于各种场景,尤其是在分布式系统和内存数据库中。

1. 基本概念

跳表本质上是一个多层链表,每一层都是对下一层的“抽样”或“稀疏表示”。最底层(通常称为第0层)包含所有元素,按升序排列。每一层之上的层则只包含一部分元素,形成一个稀疏的索引。随着层数的增加,每一层的元素数量逐渐减少,直到最顶层可能只有少数几个元素。


zheng大约 5 分钟数据库数据库
mysql的死锁

1. 死锁的概念

死锁是指两个或多个事务互相等待对方释放资源,导致所有事务都无法继续执行的情况。每个事务都在等待其他事务持有的锁,形成一个循环依赖,从而导致系统无法继续前进。

2. 死锁的原因

死锁通常发生在并发事务之间争夺资源时,特别是在以下情况下:

  • 多个事务以不同的顺序锁定相同的资源:例如,事务A先锁定了表T1,然后尝试锁定表T2;而事务B先锁定了表T2,然后尝试锁定表T1。如果两个事务同时进行,可能会形成死锁。

  • 长时间持有锁:如果一个事务长时间持有锁而不释放,可能会导致其他事务等待过久,增加死锁的可能性。

  • 嵌套锁:当一个事务在一个事务内部又启动了另一个事务(嵌套事务),并且这两个事务都持有了不同的锁,可能会导致死锁。

  • 索引覆盖不全:如果查询没有使用合适的索引,可能会导致更多的行被锁定,增加了死锁的风险。

  • 隐式锁:某些操作(如SELECT ... FOR UPDATE)会隐式地获取行级锁,如果没有正确管理这些锁,可能会引发死锁。


zheng大约 7 分钟数据库mysql
多级缓存如何保证数据一致

多级缓存系统中的数据一致性是一个复杂的问题,尤其是在分布式环境中。为了保证数据的一致性,可以采用以下几种策略和技术:

  1. 写直达(Write-Through)

    • 在这种模式下,当数据被更新时,更新会立即写入到所有层级的缓存和后端存储中。这确保了所有的缓存和存储都包含最新的数据。
    • 优点是数据一致性容易维护,因为每个写操作都会同步更新所有地方的数据。
    • 缺点是写操作的性能可能会受到影响,因为它需要等待所有层级的更新完成。
  2. 写回(Write-Back/Write-Behind)

    • 写回模式下,更新只会在最靠近应用的缓存层进行,并标记为脏数据。之后,这些更新会被异步地传播到较低层级的缓存和持久化存储。
    • 优点是写操作的延迟较低,因为不需要等待所有层级的更新完成。
    • 缺点是在某些情况下可能导致数据不一致,特别是如果在数据从缓存传播到持久存储之前发生了故障。
  3. 缓存失效(Cache Invalidation)

    • 当数据被修改时,不是更新缓存中的数据,而是简单地使相关的缓存项失效。下次访问该数据时,会从持久化存储重新加载数据并填充缓存。
    • 优点是可以避免复杂的同步逻辑,且不会浪费资源去更新可能很快又被覆盖的数据。
    • 缺点是可能会增加读取延迟,特别是在高并发环境下,多个请求可能会同时尝试重新加载相同的数据。
  4. 时间戳或版本控制

    • 每个缓存条目可以附加一个时间戳或版本号。当有新的数据写入时,更新时间戳或版本号。读取时,检查时间戳或版本号以确定是否需要刷新缓存。
    • 优点是可以更精确地管理缓存的有效期,减少不必要的刷新。
    • 缺点是增加了额外的元数据管理和比较开销。
  5. 事件驱动的更新

    • 使用消息队列或发布/订阅机制来通知各个缓存层有关数据变更的信息。每当数据发生变化时,发布一个事件,所有订阅者(如其他缓存节点)都会接收到通知并相应地更新它们的副本。
    • 优点是可以实现近乎实时的一致性,并且适合分布式系统。
    • 缺点是增加了系统的复杂性和依赖于消息传递的可靠性。
  6. 一致性哈希(Consistent Hashing)

    • 用于分布式缓存系统中,通过将键映射到环上的位置,使得添加或移除缓存节点时,只有最小数量的缓存项需要迁移。
    • 优点是减少了缓存不一致的可能性,并提高了系统的可扩展性。
    • 缺点是实现较为复杂,且在某些场景下可能仍会导致部分数据的短暂不一致。
  7. 两阶段提交(Two-Phase Commit, 2PC)

    • 一种强一致性协议,适用于需要严格一致性的事务处理。它涉及到协调者和参与者之间的两个阶段:准备阶段和提交阶段。
    • 优点是能够提供严格的事务一致性。
    • 缺点是性能较低,特别是在网络分区或节点故障的情况下,可能会导致事务长时间挂起。
  8. 最终一致性(Eventual Consistency)

    • 这是一种宽松的一致性模型,允许不同节点上的数据在一定时间内存在差异,但最终会达到一致状态。
    • 优点是提供了较好的性能和可用性。
    • 缺点是在某些应用场景中,可能无法接受数据的临时不一致。
  9. 读修复(Read Repair)

    • 在读取数据时,如果发现数据不一致,可以在返回结果的同时尝试修复不一致的数据。
    • 优点是可以在不影响读取性能的前提下提高数据的一致性。
    • 缺点是增加了读取操作的复杂度,并且可能会引入额外的延迟。

zheng大约 4 分钟缓存缓存
2
3
4
5
...
17