自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(82)
  • 收藏
  • 关注

原创 缓存与数据库内容不一致问题应如何解决

待完成

2022-01-12 16:34:12 433

原创 数据库优化

两个表连接方式:外连接、内连接左表为驱动表,右表为被驱动表最原始的join方式:1、采用一定方式获取左表需要的内容2、对于每条记录遍历被驱动表,寻找匹配的数据(需要重复IO读取多次被驱动表)减少join成本的基本方式:1、采用一定方式获取左表需要的内容2、采用join buffer,同时缓存多条驱动表的数据,这样读取一次被驱动表可以与多条驱动表数据进行匹配,减少了IO成本3、读取被驱动表数据时采用合适的索引方式进行检索...

2021-12-07 16:48:02 579

原创 分布式计算细节

一、如何将分布式计算表的数据映射到分布式KV存储引擎分布式系统里最核心的两个部分就是分布式计算和分布式存储。对于一个分布式数据库而言,一般将计算的sql layer置于分布式存储的kv之上,示意图如下:分布式数据库一般同样支持sql语法,但实现逻辑大不一样。mysql一般直接将数据按照行记录格式进行存储,每一个索引也是直接对应一个文件。而分布式数据库则会将每一个行记录或索引拆分出来,按照key-value的形式在kv存储引擎进行存储。转换规则如下所示:又或者这样: .

2021-11-30 18:14:29 980

原创 MIT6.824 lab3 KVRaft实验分析

2021-11-24 14:58:39 1264

原创 一些有意思的分布式论文

前言因为时间原因,有些分布式论文在看到后没法立即阅读。因此将这些论文和里面有意思的点记录下来,等待日后实践过程中发现需要突破的点时重新阅读来找寻思路。

2021-11-17 15:08:38 253

原创 Scaling Memcache at Facebook论文理解

体会这篇论文读起来很有意思,设计体现了各方面的权衡,里面不仅考虑了分布式的CAP问题,也考虑到了计算机网络发包的机制和其他方面的内容,值得仔细品味。具体总结待完善

2021-11-16 19:26:54 1024

原创 Spark论文理解

待完善

2021-11-16 19:24:00 1531

原创 线程与协程的区别

补充说明内核线程的调度成本主要来自于用户态和核心态之间的状态转换,而这两种转换的开销主要来自响应中断、保护和恢复执行现场的成本。因系统终端线程A停止->保存程序上下文->寄存器、内存分页恢复到线程B挂起时状态->线程B开始执行协程相比之下更加轻量,协程的栈远小于线程的栈,因此可以并发更多数量的协程(协程一般可并存十万级,线程一般200个就不错了)概念1、进程进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单

2021-11-16 14:45:04 680

原创 Java Spring

前言这篇博客主要是对《Spring实战》(第四版)一书的整理。Spring实战电子书:Spring 实战(第 4 版) - Spring 实战(第四版)第五版链接:第 3 章 处理数据 - Spring 实战(第五版)吐槽:现在国内Spring实战出到了第五版,买完看了下跟第四版内容组织差别不小。建议初学者还是先看第四版,第四版开宗明义介绍了Spring的各个概念,个人觉得对于入门帮助更大一些。...

2021-11-14 18:47:00 702

原创 Java基础2

前言本文为对《Java编程思想》一书内容的整理补充说明本次阅读只是大略过了一遍Java基础知识,编程还是需要结合具体项目和实践来加深理解,通过实践来理解也能效率更高另外Java基础知识很多需要对JVM有一定了解,之后需要对JVM记录笔记。Final关键字:对类声明后该类不可被继承,对类成员变量使用后该变量需要直接初始化多态:Java单继承,但可以implement多个接口可以通过接口和基类来指代对应的派生类,Java运行时与C++虚函数类似,自动寻找指定类型的方法实现

2021-11-13 15:20:49 403

原创 Java基础

前言本文为对《Java编程思想》一书内容的总结,旨在加深自己对于java语言的特性和语法的了解。第1章 对象导论接口确定了某一特定对象所能发出的请求。但是,在程序中必须有满足这些请求的代码。这些代码与隐藏的数据一起构成了实现。Java用三个关键字在类的内部设定边界:public、private、protected。复用具体实现:可以使用现有的类作为成员合成新的类,这种概念被称为组合。组合反映了"has-a"关系。继承:Java不支持多继承,只保持单继承。在OOP中,程序采用了后期

2021-11-08 22:39:45 246

原创 技术书单和分布式课程

这里记录自己最近看过的一些书和公开课数据库分布式Java

2021-11-08 22:26:41 60

原创 待搞清楚的概念

平时读技术书的时候遇到了很多不太熟悉的概念,因为个人习惯,一般喜欢初步了解名词后等看完全书再重新阅读整理,所以这里把概念记下来,以防之后遗漏掉。LSM日志记录树XA分布式模型...

2021-11-04 19:35:10 77

原创 分布式锁实现方式

Redission机制:分布式锁_曾子墨-CSDN博客_分布式锁数据库、缓存、zookeeper三种机制各自实现方式综述:三种实现分布式锁的方式_vincent-CSDN博客_分布式锁

2021-11-04 15:34:49 1543

原创 RPC与Restful的区别

RPC与Restful的区别RPC传值与传引用的区别参数传递有两种形式:一种是按值传递,另外一种是按引用传递。按值传递参数的情况相对比较简单,我们只需要把值复制到网络消息中即可;按引用传递的情况就变得复杂的多,单纯的传递引用的地址空间毫无意义,因为在远程系统当中,这一地址空间指向的可能是另外一个完全不同的事物。因此,要做到支持传递引用参数,我们需要向网络中来发送参数的副本,把它们存放在远程系统的内存中,并向他们传递一个指向远程系统调用函数的指针,然后向客户端返回该对象并复制其引用。如若需要在

2021-11-02 20:48:53 3319

原创 RAFT论文常见问题总结

1、因为网络问题,先发的appendEntry通知比后发的appendEntry通知晚到server那里怎么办?答:完全覆盖,没有影响。考虑到leader更换的问题,没有办法对log顺序进行检查,即使出现第一次结束nextIndex=5,第二次结束nextIndex反退到4的情况也只能接受(中间可能会导致大步回退的情况,按照原始论文只能接受)2、如果一个leader分发log获得一半以上回复,然后自己commit后没有通知其他follower就崩掉怎么办?答:Raft里面有描述过,后续l

2021-11-02 16:49:02 222

原创 CRAQ链式复制与RAFT选举优缺点比较

本文产生于自己读DDIA一书时的困惑:如果链式复制和RAFT同样支持多节点读,而且CRAQ还可以有效降低带宽需求依次复制,为何主要还是使用RAFT待完成

2021-11-01 19:38:42 215

原创 Spanner论文理解

BigTable、MegaStore、Spanner三个概念并行,有各自不同的应用场景Spanner数据库最核心的贡献(个人感觉):True Time

2021-10-27 14:06:24 400

原创 分布式事务(Distributed Transactions)

Q: Why don't people use three-phase commit, which allows workers tocommit or abort even if the coordinator crashes?A: Three-phase commit only works if the network is reliable, or ifworkers can reliably distinguish between the coordinator being deada..

2021-10-26 12:31:40 302

原创 CRAQ论文学习理解

CRAQ实现链接:《Object Storage on CRAQ: High-throughput chain replication for read-mostly workloads》论文总结 - BrianLeeLXT - 博客园核心CRAQ本身也有很多地方基于Zookeeper实现。Zookeeper提供了API来统计集群信息以及实现选举、服务发现等功能。Dubbo里面的服务发现模块是基于Zookeeper实现。CRAQ与RAFT为不同的实现容错的机制,他通过分散写(每个

2021-10-25 16:16:36 526

原创 乐观锁,悲观锁与MVCC

发生冲突的情况在数据库中,并发控制是指在多个用户/进程/线程同时对数据库进行操作时,如何保证事务的一致性和隔离性的,同时最大程度地并发。当多个用户/进程/线程同时对数据库进行操作时,会出现3种冲突情形:读-读,不存在任何问题 读-写,有隔离性问题,可能遇到脏读(会读到未提交的数据) ,幻影读等。 写-写,可能丢失更新加锁可以解决全部的问题(可以理解为通过加锁让程序执行往串行化发展),但是极度影响执行效率。因此开始寻求不用锁来解决冲突的方法。MVCC的作用MVCC主要用于处理读—

2021-10-19 19:22:26 187

原创 Redis独立功能的实现

前言Redis系列博客为对黄健宏老师《Redis设计与实现》一书内容的整理第三大章多机数据库的实现主要与分布式内容相关,没必要在这里整理,掌握思想就好,这里先忽略第18章 发布与订阅Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。通过执行subscribe命令,客户端可以订阅一个或多个频道,从而成为这类频道的订阅者:每当有其他客户端向被订阅的频道发送消息,频道的所有订阅者都会收到这条消息。...

2021-10-19 16:59:28 116

原创 Redis客户端与服务端

前言Redis系列博客为对黄健宏老师《Redis设计与实现》一书内容的整理第13章 客户端

2021-10-19 14:38:50 1336 1

原创 Redis事件

前言Redis系列博客为对黄健宏老师《Redis设计与实现》一书内容的整理第12章 事件Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件:* 文件事件:Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接,而文件事件就是服务器对套接字操作的抽象。 服务器与客户端的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信操作。* 时间事件:Redis服务器中的一些操作(例如serverCron函数)需要在给定的时间点执行,而时间事件

2021-10-18 22:06:28 174

原创 Redis单机数据库的实现1

前言Redis系列博客为对黄健宏老师《Redis设计与实现》一书内容的整理第9章 数据库服务器中的数据库Redis服务器通过db数组来保存redis数据库默认情况下,Redis客户端的目标数据库为0号数据库,但客户端可以通过执行select命令来切换目标数据库select操作会更新redisClient(客户端)db属性指针指向的数据库内容数据库键空间Redis是一个键值对数据库服务器,redisDb结构的dict字典保存了数据库中的所有键值对,我们将这个字典称为键空

2021-10-18 15:28:36 104 1

原创 Redis对象

前言Redis系列博客为对黄健宏老师《Redis设计与实现》一书内容的整理第八章 对象Redis基于数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象都至少使用了一种前面提到的数据结构。使用对象的一个好处是:我们可以针对不同的使用场景为对象设置多种不同的数据结构实现,从而优化对象在不同场景下的使用效率。除此之外,Redis的对象系统还实现了基于引用计数计数的内存回收机制。当程序不再使用某个对象的时候,这个对象所占用

2021-10-17 13:55:48 80

原创 一些有意思的设计技巧

1、写实复制fork后子进程和父进程共享内存,直到子进程产生写操作时才开始创建数据副本,分开处理2、隐式锁使用事务号来减少必须生成锁的情况以及生成锁的时间3、redis rehashredis可能保存大量数据,内存不够进行迁移时一次全腾过去会很浪费CPU时间;因此选择使用渐进式rehash,每次crud数据时把ht[0]对应的一小部分数据挪到ht[1],分批处理...

2021-10-17 11:46:57 53

原创 Redis数据结构与对象

前言Redis系列博客为对黄健宏老师《Redis设计与实现》一书内容的整理引言Redis优势——它内置了集合数据类型,并支持对集合执行交集、并集、差集等集合计算操作,之前需要使用一段甚至一大段SQL查询才能实现的功能,现在只需要调用一两个Redis命令就能够实现了,整个模块的可读性得到了极大的提高。通过了解Redis的内部实现,理解每一个特性和命令背后的运作机制,可以帮助我们更高效地使用Redis,并避开那些会引发性能问题的陷阱。...

2021-10-15 10:43:54 99

原创 数据库中的锁问题

前言本博客主要是对《MySQL是怎样运行的》一书的内容进行整理,另外添加了自己对于锁机制与MVCC机制之间应用场景和作用的辨析以及解决幻读的方法的总结锁机制和MVCC机制的辨析MVCC机制主要用于处理读——写之间的冲突,因此MVCC能处理脏读、不可重复读以及快照读的幻读问题;锁机制主要用于处理写——写之间的冲突,锁机制用于处理脏写问题(脏写一般都是通过加锁来处理),另外锁机制还用于处理当前读的幻读问题。使用锁可以解决脏写、脏读、不可重复读、幻读这四个问题,但是问题在于锁机制的性能较差

2021-10-14 17:23:13 290

原创 MVCC依然可以产生幻读的原因

不同引擎mvcc实现不一样。以innodb为例的话,mvcc本身是通过trx_id(事务隐藏列)来实现的版本维护,不能读取到ReadView开启时还没提交的事务的记录。mysql里面实际上有两种读,一种是“快照读”,比如我们使用select进行查询,就是快照读。在快照读的情况下不会产生幻读的问题。另一种读则是“当前读”,例如delete,update,insert等语句,都需要满足直接忽略事务号读取最新数据的要求。否则可能产生下述情况:在执行这几个操作时会读取最新的记录,即使是别的事务提交

2021-10-14 15:23:40 491

原创 事务隔离级别和MVCC

前言本博客主要是对《MySQL是怎样运行的》一书的内容进行整理第21章 事务隔离级别和MVCC我们希望让不同的事务“隔离”地执行,互不干涉。这也就是事务的隔离性。串行执行过于严格,会严重降低系统吞吐量和资源利用率,增加事务的等待时间,因此需要采用其他机制来保证并发执行的事务的执行结果与串行执行的结果一样。两个并发的事务在执行过程中访问相同数据的情况有四种:读——读,读——写,写——读,——写——写。只有在至少一个事务对数据进行写操作时,才可能带来一致性问题。这一致性通常通过加锁来

2021-10-14 12:29:06 288

原创 数据库事务简介

前言本博客主要是对《MySQL是怎样运行的》一书的内容进行整理第18章 事务简介事务的四个特性ACID:原子性,一致性,隔离性,持久性原子性在任何一个可能的时间点都可能发生意想不到的多无(数据库本身的错误、操作系统的问题甚至直接断电)而使操作执行不下去。因此需要添加原子性的限制,“要么全做,要么全不做”。如果在执行操作的过程中发生了错误,就把已经执行的操作恢复成没执行之前的样子。隔离性不仅要保证事务的操作以原子性的方式执行完成,还要保证其他的状态转换不会影响本次的

2021-10-13 18:45:16 83

原创 B+树索引

前言本博客主要是对《MySQL是怎样运行的》一书的内容进行整理第六章 B+树索引数据库中,各个数据页可以组成一个双向链表,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表。可以通过数据页的页目录寻找对应的槽,通过槽使用二分法快速查找到对应的信息。查找信息流程1、定位到记录所在的页2、从所在的页内查找相应的记录一个简单的索引方案新分配的数据页编号可能并不是连续的,也就是说我们使用的这些页在磁盘上可能并不挨着1、下一个数据页中数据主键的大小必须大

2021-10-12 13:02:01 3105

原创 InnoDB数据库存储结构

前三章内容MySQL一定要注意字符集的格式和比较规则,否则在传入中文或者其他内容时可能会出现异常第四章 InnoDB记录存储结构Innodb是一个将表中数据存储在磁盘上的存储引擎,但是真正处理数据的过程则是发生在内存中,因此需要把磁盘中的数据加载到内存中,处理完毕后需要把数据传回给磁盘。为了避免一条条读取数据,InnoDB采用以页为单位从磁盘获取数据的方式。InnoDB中页大小通常为16KB。延伸:磁盘与内存的交互有很大的学问,在实际处理时必须要斟酌。例如,以spark为例。.

2021-10-11 16:17:36 375

原创 数据库参考资料

这里记录了我学习数据库时主要参考的资料1、MySQL是怎样运行的——从根上理解MySQL

2021-10-11 15:40:51 152

原创 6.824 Lab2 PartB实验部分

测试文件内容分析func TestBasicAgree2B(t *testing.T) { servers := 3 cfg := make_config(t, servers, false) defer cfg.cleanup() cfg.begin("Test (2B): basic agreement") iters := 3 for index := 1; index < iters+1; index++ { // 开始对应index处不应该有任何日志记录 nd,

2021-10-04 15:34:58 232

原创 6.824 Lab2 PartA实验部分

测试文件测试内容分析func TestReElection2A(t *testing.T) { servers := 3 cfg := make_config(t, servers, false) defer cfg.cleanup() cfg.begin("Test (2A): election after network failure") leader1 := cfg.checkOneLeader() // if the leader disconnects, a new on

2021-09-29 11:35:39 284

原创 ZooKeeper: Wait-free coordination for Internet-scale systems论文理解

一个基于Zookeeper的分布式锁实现方法:zookeeper分布式锁避免羊群效应(Herd Effect) - 一个苦逼的程序员 - 博客园

2021-09-28 19:30:14 270

原创 数据结构与算法之美专栏笔记

前言这个课讲的内容比较简单,不过在简单过一遍的过程中依然发现了一些自己之前没太想过或者说基础不牢固的地方,在这里整理一下。笔记数组数组和链表的区别数组是连续分配的内存块,因此即使内存剩余很多若是有很多碎片的话数组依然无法很好利用内存。链表则对每个节点的位置没有要求,相对分散。作为代价,链表便于插入删除,而数组则易于随机访问。同时,因为内存连续,CPU可以更好缓存数组内容(缓存通常一次缓存一个页)。计算机堆栈结构int main(int argc, char* ar

2021-09-17 00:24:14 113

原创 RAFT论文理解

机制:client将动作请求发给server的application层->application层将日志下发给raft层->raft leader发送日志给其他follower->收到回复后,raft leader报告给application层->application层进行执行,将结果返还给client...

2021-09-16 11:01:34 357 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除