西维蜀黍

【Cache System】Cache Replacement - LRU(Least Recently Used)算法

LRU

LRU(Least Recently Used),近期最少使用算法, 常应用于缓存中的数据淘汰, 其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高“。

  ...


【Network】HTTP 常用状态码(Status Code)

2XX - 成功

请求正常处理完毕

  • 200 OK: 从客户端发送的请求在服务端被正常处理了。
  • 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
  • 204 No Content: 服务器接受的请求已成功处理,但返回的响应报文的主体部分不包含实体(浏览器页面不更新,仅发送信息给服务器)
  • 206 Partial Content: 客户端进行了范围请求,而服务器成功执行了这部分请求

3XX - 重定向

浏览器需要执行某些特殊的处理以正确处理请求。

  • 301 Moved Permanently 永久性重定向,请求的资源已经分配了新的URI,以后应该使用资源现在所指的URI

  • 302 Found 临时性重定向,请求的资源临时分配了新的URI,希望用户本次可以使用新的URI访问(比如,未登陆时,302 重定向到登录页面)

  • 304 Not Modified 服务器端资源未改变,可直接使用客户端未过期的缓存,不包含任何响应的主体部分

4XX - 客户端错误

客户端是发生错误的原因所在。

  • 400 Bad Request 请求报文中存在语法错误
  • 401 Unauthorized 请求需要有通过HTTP认证的认证信息。另外如果之前已进行一次请求,则表示用户认证失败
  • 403 Forbidden 对请求资源的访问被服务器拒绝了,如未获得文件系统的访问授权,访问权限出现某些问题
  • 404 Not Found 服务器上没有请求的资源
  • 499 client has closed connection 服务器端处理的时间过长,客户端主动断开链接,ngix定义的状态码

5XX - 服务器错误

服务器是发生错误的原因所在。

  • 500 Internal Server Error 服务器在执行请求时发生了错误,Bug或临时故障
  • 503 Service Unavailable 服务器暂时处于超负荷或正在进行停机维护,现在无法处理请求
  ...


【Database】分库分表(DB sharding)

What Is Database Sharding?

Sharding is a method for distributing a single dataset across multiple databases, which can then be stored on multiple machines. This allows for larger datasets to be split in smaller chunks and stored in multiple data nodes, increasing the total storage capacity of the system.

Sharding is known as partitioning, and each smaller subsets called prtitions

Similarly, by distributing the data across multiple machines, a sharded database can handle more requests than a single machine can.

Sharding is a form of scaling known as horizontal scaling or scale-out, as additional nodes are brought on to share the load. Horizontal scaling allows for near-limitless scalability to handle big data and intense workloads. In contrast, vertical scaling refers to increasing the power of a single machine or single server through a more powerful CPU, increased RAM, or increased storage capacity.

什么时候会考虑分库分表

单库/表太大

  • 单个数据库的能力已经达到瓶颈或者存在潜在瓶颈,比如
    • Table row count > 10,000,000.
    • Table size > 10GB.
    • Performance bottleneck (e.g. Querying Response Time < 99%, i.e., more than 1% queries take more than 10ms).
    • 单库太大,以至于所在服务器上磁盘空间不足
    • 单库上操作出现了I/O瓶颈

解决方法:切分成更多更小的库或者表

水平分库分表(Horizontal Partitioning)

水平分库

当数据库中单表的数据量很大时,采用水平分区的方式对数据进行拆分(将同一个表中不同的数据拆分到不同数据库或同一个数据库的不同表中)。比如,以对某个主键进行hash取模的方式(以保证对N个数据库的访问负载是均衡的),将数据分布表到N个数据库或表中。

值得一提的是,进行分库分表后,进行对跨库的表join、事务操作或者数据统计、排序时,又出现了新的性能问题。

使用原因

大部分互联网业务数据量很大,单库容量容易成为瓶颈,如果希望:

  • 线性降低单库数据容量
  • 线性提升数据库写性能

此时可以使用水平切分架构。

一句话总结,水平切分主要解决“数据库数据量大”问题,在数据库容量扛不住的时候,通常水平分库。

水平分表

水平分表也称为横向分表,比较容易理解,就是将表中不同的数据行按照一定规律分布到不同的表中(这些表保存在同一个数据库中),这样来降低单表数据量。最常见的方式就是通过主键或者时间等字段进行 Hash 和取模后拆分。

  ...


【Distributed System】一致性哈希(Consistent Hashing)

问题

在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点。

  ...


【Distributed System】分布式事务(Distributed Transactions)

背景

事务(Transaction)

**事务(Transaction)**提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元,组成事务的所有操作只有在所有操作均能正常执行的情况下方能提交,只要其中任一操作执行失败,都将导致整个事务的回滚。简单地说,事务提供一种“要么什么都不做,要么做全套(All or Nothing)”机制。

数据库本地事务 - ACID

说到数据库事务就不得不说,数据库事务中的四大特性,ACID:

原子性(Atomicity)

一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

就像你买东西要么交钱收货一起都执行,要么要是发不出货,就退钱。

  ...


【Java】锁 - Lock 接口

Lock接口

我们现在就来看看lock接口定义了哪些方法:

//获取锁 
void lock(); 

//获取锁的过程能够响应中断
void lockInterruptibly() throws InterruptedException 

//非阻塞式响应中断能立即返回,获取锁放回true反之返回fasle 
boolean tryLock();

//超时获取锁,在超时内或者未中断的情况下能够获取锁 
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

//获取与lock绑定的等待通知组件,当前线程必须获得了锁才能进行等待,进行等待时会先释放锁,当再次获取锁时才能从等待中返回
Condition newCondition();
  ...


【Java】关键字 - synchronized关键字中的锁状态

无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁

这四种锁是指锁的状态,专门针对synchronized关键字对应的互斥锁的。在介绍这四种锁状态之前还需要介绍一些额外的知识。

首先为什么synchronized能实现线程同步?

在回答这个问题之前我们需要了解两个重要的概念:“Java对象头”、“Monitor”。

  ...


【Lock】独享锁(Exclusive Lock) VS 共享锁(Shared Lock)

独享锁(Exclusive Lock) VS 共享锁(Shared Lock)

独享锁(Exclusive Lock)也叫排他锁,是指该锁一次只能被一个线程所持有。如果线程T对数据A加上排它锁后,则其他线程不能再对A加任何类型的锁。获得排它锁的线程即能读数据又能修改数据。JDK中的synchronized和JUC中Lock的实现类就是互斥锁。

共享锁(Shared Lock)是指该锁可被多个线程所持有。典型的就是ReentrantReadWriteLock里的读锁,它的读锁是可以被共享的,但是它的写锁确每次只能被独占。

  ...


【Distributed System】分布式锁(Distributed Lock)

背景

对于锁大家肯定不会陌生,在Java中synchronized关键字和ReentrantLock可重入锁在我们的代码中是经常见的,一般我们用其在多线程环境中控制对资源的并发访问,但是随着分布式的快速发展,本地的加锁往往不能满足我们的需要,在我们的分布式环境中上面加锁的方法就会失去作用。于是人们为了在分布式环境中也能实现本地锁的效果,也是纷纷各出其招,今天让我们来聊一聊一般分布式锁实现的套路。

  ...


【Distributed System】分布式系统

背景

集中式系统(Central Systems)

在学习分布式之前,先了解一下与之相对应的集中式系统(Central Systems)是什么样的。

**集中式系统(Central Systems)**用一句话概括就是:一个主机带多个终端。终端没有数据处理能力,仅负责数据的录入和输出。而运算、存储等全部在主机上进行。现在的银行系统,大部分都是这种集中式的系统,此外,在大型企业、科研单位、军队、政府等也有分布。集中式系统,主要流行于上个世纪。

集中式系统的最大的特点就是部署结构非常简单,底层一般采用从IBM、HP等厂商购买到的昂贵的大型主机。因此无需考虑如何对服务进行多节点的部署,也就不用考虑各节点之间的分布式协作问题。但是,由于采用单机部署。很可能带来系统大而复杂、难于维护、发生单点故障(单个点发生故障的时候会波及到整个系统或者网络,从而导致整个系统或者网络的瘫痪)、扩展性差等问题。

  ...