Low Gravity

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

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

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

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

阅读全文 »

在众多的传输层协议中,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?
  • 实现一个有「容错性」的分布式锁,都需要考虑哪些问题?

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

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

阅读全文 »

在早期的 Web 应用中,主要以静态文档浏览为主,这种无状态性并未带来明显问题。但随着互联网的演进,交互式 Web 应用逐渐成为主流。用户不再仅仅满足于浏览网页,而是期望能够进行登录、发表评论、购物、在线协作等丰富多样的操作。这些交互式功能的实现依赖于服务器能够识别用户身份,并跟踪用户在不同页面和操作之间的状态信息,以提供个性化的服务和准确的交互响应。例如,在购物网站中,用户需要将商品加入购物车,服务器必须清楚知道这些商品属于哪个用户,以便在结算时准确计算总价并处理订单;在社交平台上,用户的登录状态决定了其能够查看和操作的内容,以及与其他用户的交互权限。

为了克服 HTTP 协议无状态性带来的挑战,满足 Web 应用对用户身份识别和状态跟踪的需求,Cookie、Session 和 Token 等技术应运而生。它们在 Web 开发领域中扮演着至关重要的角色,共同构建了现代 Web 应用中用户认证和状态管理的基础架构,为实现安全、高效、个性化的 Web 服务提供了不可或缺的支持,推动了 Web 应用向更加复杂和功能强大的方向发展。

阅读全文 »

“>>>” 表示无符号右移,正数情况下, a >>> b 等价于 a / Math.pow(2,b)

以 -16 >>> 2 为例子 负16右移2位

  1. 将-16转为2进制 (用补码表示负数)
    • 16 = 00000000 00000000 00000000 00010000
    • 取反并补码 = 11111111 11111111 11111111 11101111 + 1 = 11111111 11111111 11111111 11110000
    • 右移2位 = 00111111 11111111 11111111 11111100 = 10进制 1073741820
0%