Low Gravity

在这里,我们用算法解决问题,用代码表达思想

Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是 内存中对象的分配与回收。

Java 堆是垃圾收集器管理的主要区域,因此也被称作GC 堆(Garbage Collected Heap).从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以 Java 堆还可以细分为:新生代和老年代:再细致一点有:Eden 空间、From Survivor、To Survivor 空间等。进一步划分的目的是更好地回收内存,或者更快地分配内存。

阅读全文 »

在上篇文章中,我们深入探讨了 Redis 分布式锁的基本概念,包括其在分布式系统中的重要性以及与传统 JVM 锁的区别,并初步了解了 Redis 如何通过其原子操作特性实现简单的分布式锁逻辑。然而,在实际应用场景中,仅仅依靠 Redis 的基本命令来实现分布式锁存在诸多问题。

自定义 Redis 分布式锁在实现过程中面临着一些关键操作无法保证原子性的困境。例如,加锁操作通常需要执行 SETNX(设置键值对,当键不存在时)和 EXPIRE(设置键的过期时间)两个步骤,如果在这两个步骤之间发生系统故障或异常,可能导致锁无法正确设置或永远不会过期,从而引发死锁情况,使系统陷入瘫痪。解锁操作同样存在风险,非原子性的解锁可能导致不同节点之间误删对方的锁,造成数据混乱和并发冲突加剧。

除了原子性问题,锁续期也是一个不容忽视的挑战。在分布式系统中,业务执行时间往往是不确定的,如果锁的持有时间过短,业务未完成时锁就已过期,可能导致其他节点获取锁并执行相同的业务逻辑,破坏数据一致性;反之,若锁持有时间过长,又会降低系统的并发性能,影响系统整体效率。因此,如何根据业务实际执行时间动态地为锁续期,成为确保分布式锁有效性和系统稳定性的关键因素之一。

为了应对这些复杂的问题,提高 Redis 分布式锁的可靠性和实用性,Redisson 应运而生。Redisson 是一个功能强大的 Java 驻内存数据网格(In-Memory Data Grid),它在 Redis 基础上提供了一系列分布式对象和服务,其中包括高度优化和可靠的分布式锁实现。Redisson 不仅解决了自定义 Redis 分布式锁的原子性问题,通过使用 Lua 脚本将复杂的操作封装为原子操作,确保加锁、解锁和锁续期等操作的完整性和一致性,还提供了诸如锁自动续期、可重入锁、公平锁等丰富的特性,大大简化了分布式锁的使用难度,提高了分布式系统的开发效率和可靠性。通过深入研究 Redisson 分布式锁的实现原理,我们可以更好地理解和应用分布式锁技术,为构建健壮的分布式系统提供有力支持。

阅读全文 »

在现代计算机系统中,随着多核处理器的广泛应用和分布式系统的蓬勃发展,多线程编程已成为常态。多线程环境下,资源共享带来了高效性,但同时也引发了一系列严峻的问题,其中最为突出的便是线程安全问题。当多个线程同时访问和操作共享数据时,数据的一致性和完整性面临巨大挑战,可能导致数据错误、程序异常甚至系统崩溃等严重后果。

在 Java 编程领域,传统的 JVM 锁机制,如 synchronized 关键字和 ReentrantLock,在单进程或单节点应用中有效地解决了线程安全问题。它们基于线程在同一 JVM 内存空间中运行的特性,通过互斥访问共享资源来确保数据一致性。然而,随着分布式系统的兴起,应用架构发生了根本性变化。分布式系统由多个独立的节点组成,这些节点可能分布在不同的服务器上,运行在各自独立的 JVM 中,彼此之间通过网络通信协作。在这种分布式环境下,JVM 锁机制的局限性逐渐显现。由于每个节点的 JVM 内存相互独立,无法实现跨节点的线程互斥,传统的锁机制无法保证分布式系统中共享资源的一致性访问。例如,在一个分布式电商系统中,多个节点可能同时处理订单操作,如果没有有效的分布式锁机制,可能会出现超卖等问题。

为了满足分布式系统对共享资源一致性访问的需求,分布式锁应运而生。它提供了一种在分布式环境下实现互斥访问的机制,确保在任何时刻,只有一个节点能够获取特定资源的锁,从而保证数据的一致性和完整性。Redis,作为一款高性能的内存数据库,以其出色的性能、丰富的数据结构和原子操作特性,成为了实现分布式锁的理想选择之一。其内存存储和快速读写能力使得获取和释放锁的操作能够高效执行,而原子操作保证了锁操作的完整性和可靠性。通过 Redis 实现分布式锁,可以有效地解决分布式系统中的并发冲突问题,为分布式应用的稳定运行提供有力支持。

阅读全文 »

数据库应用开发中,SQL 查询性能直接影响系统的整体响应速度和用户体验。尽管开发人员在编写 SQL 语句时努力确保逻辑正确,但随着业务数据量的不断增加,查询效率问题逐渐凸显。

优化 SQL 查询已成为提高数据库性能的关键环节。而索引作为优化 SQL 的重要手段,其正确使用和理解对于提升查询性能至关重要。

本文将基于这些实际需求,深入介绍 Explain 工具的使用方法,详细分析联合索引的特性和应用场景,结合实际案例探讨 SQL 优化的技巧和策略

阅读全文 »

数据库作为存储和管理数据的核心技术,广泛应用于各类信息系统中。随着数据量的不断增长以及业务复杂性的提高,数据库的性能优化成为至关重要的任务。

其中,索引作为一种能够显著提升查询效率的数据结构,在数据库操作中扮演着关键角色。然而,许多开发人员和数据库管理员对索引的理解仅停留在表面,未能深入掌握其底层原理和适用场景,导致在实际应用中无法充分发挥索引的优势,甚至可能因不当使用而影响数据库性能。

本文将从索引的类型、实现方式、创建时机、优缺点以及相关的优化原则等方面进行详细阐述,揭示索引背后的核心原理,为数据库性能优化提供坚实的理论基础。

阅读全文 »

在众多的传输层协议中,TCP(传输控制协议)和 UDP(用户数据报协议)无疑是最为重要和常用的两种协议。它们的设计目标和特性截然不同,以满足不同应用场景下的多样化需求。TCP 协议以其面向连接、可靠传输的特性,成为了许多对数据准确性和完整性要求较高的应用的首选。例如,在文件传输过程中,用户期望文件能够完整无误地从源端传输到目的端,任何数据丢失或错误都可能导致文件损坏无法使用,TCP 通过其复杂的连接建立、数据确认、重传机制等确保了数据的可靠交付;在电子邮件的发送和接收中,同样不容许邮件内容在传输过程中出现丢失或篡改,TCP 的可靠性保证了邮件的准确传递。

UDP 协议则以其简洁高效、低延迟的特点,在对实时性要求较高的应用场景中发挥着重要作用。例如,在即时通讯应用中,如 QQ 语音和视频通话,用户更注重信息的即时传递,少量的数据丢失或错误在一定程度上可以被接受,但如果传输延迟过高,通话将变得卡顿,严重影响用户体验,UDP 的无连接特性使得它能够快速地将数据发送出去,减少了建立和维护连接的开销,从而降低了延迟;在线直播领域也是如此,观众希望能够实时观看主播的画面和声音,UDP 能够满足这种对实时性的严格要求。

阅读全文 »

在分布式系统中,单点故障可能导致整个系统的瘫痪,影响用户体验和业务正常运转。传统的主从模式虽然在一定程度上提高了可用性,但主服务器宕机时仍需手动切换从服务器为主服务器,这一过程不仅耗时费力,还会造成服务中断。

为了克服这些问题,Redis 哨兵模式应运而生。它提供了一种自动化的故障检测和转移机制,能够实时监控 Redis 实例的运行状态,在主服务器发生故障时自动将从服务器切换为主服务器,并通过发布订阅模式通知其他从服务器进行相应配置更新,确保整个 Redis 集群的持续稳定运行。

这种模式大大提高了 Redis 服务的可靠性和容错能力,使得企业能够更好地应对高并发、大数据量的业务场景,保障系统的不间断服务,满足用户对系统性能和稳定性的严格要求。

阅读全文 »

对于60%的程序员而言,Java的三层架构Controller、Service、Dao可以说是“越往后走天越黑”,特别是到了Dao层,提着灯笼也只能看到脚边一米开外的河边小石子,只闻对岸风啸马嘶却不知到底是人是鬼,只能借着MyBatis或JPA这些ORM框架隔着宽宽的河举行一场又一场的刺刀战,你砍我一刀,我刺你一剑。

诚然,很多人对MySQL数据库的印象就是一个模糊的大铁柜,闭上眼睛深吸一口气仿佛还能嗅到一股铁锈味。只知柜子里藏着很多张表,表里面存着很多行数据,再详细一点的呢?不知道。

MySQL有太多太多细节,根本无法用四、五篇文章说透,但我仍希望这个系列的文章能成为非常好的入门教程,让从来没接触过SQL优化的同学也能快速建立较为系统的知识框架,方便日后学习其他专栏时进一步拓展。

阅读全文 »

实际上数据库范式不止3种,但大家熟知的就三种。

第一范式

所有列应该不可再分

比如,往contact列存储”18257500000,杭州,523839000@qq.com“是比较糟糕的做法,因为此时该列包含了phone、address、email三个维度的数据,应该拆成phone、address、email三个字段分别存储,这样对更新和查询都有好处。

第二范式

必须存在业务主键,且非主键字段应该依赖于全部业务主键(之所以写“全部”,因为可能存在复合主键)

说人话就是:每张表最好都设定主键。虽然某些列可能具备主键的特质(比如user表的id_card),但个人认为主键最好与业务无关,比如自增id。

阅读全文 »

这篇文章我想和你聊一聊,关于 Redis 分布式锁的「安全性」问题。

Redis 分布式锁的话题,很多文章已经写烂了,我为什么还要写这篇文章呢?

因为我发现网上 99% 的文章,并没有把这个问题真正讲清楚。导致很多读者看了很多文章,依旧云里雾里。例如下面这些问题,你能清晰地回答上来吗?

  • 基于 Redis 如何实现一个分布式锁?
  • Redis 分布式锁真的安全吗?
  • Redis 的 Redlock 有什么问题?一定安全吗?
  • 业界争论 Redlock,到底在争论什么?哪种观点是对的?
  • 分布式锁到底用 Redis 还是 Zookeeper?
  • 实现一个有「容错性」的分布式锁,都需要考虑哪些问题?

这篇文章,我就来把这些问题彻底讲清楚。

读完这篇文章,你不仅可以彻底了解分布式锁,还会对「分布式系统」有更加深刻的理解。

阅读全文 »
0%