- 博客(287)
- 资源 (3)
- 收藏
- 关注
原创 PG的常用命令
9. 创建表:create table tbname ([字段名1] [类型1], [字段名2] [类型2], .... primary key (字段名m, 字段名n,...);11. 重命名一个字段:alter table [表名] rename column [字段名A] to [字段名B];10. 在已有的表中添加字段:alter table [表名] add column [字段名][类型];12. 删除表中的字段:alter table [表名] drop column [字段名];
2023-07-09 11:39:18
3147
原创 分布式数据库难题(四):单机事务
首先,设想这样一个例子:你正在开发一个应用程序来帮助医生管理医院的轮班。通常,医院会安排多个医生值班,医生也可以申请调整班次,但是前提是确保至少一位医生还在该班次中值班。现在的情况是,Alic和Bob是两位值班医生,两人碰巧都身体不适,因而都决定请假,不幸的是,他们几乎同一时刻点击了调班按钮,如下图所示:每笔事务总是首先检查是否至少有两名医生目前在值班。如果是的话,则有一名医生可以安全离开。由于数据库正在使用快照隔离级别,两个检查都返回有两名医生,所以两个事务都安全地进入到下一阶段。
2022-09-18 15:58:10
836
原创 分布式数据库难题(三):数据一致性
一直以来,在“分布式系统”和“数据库”这两个学科中,一致性(Consistency)都是重要概念,但它表达的内容却并不相同。对于分布式系统而言,一致性是在探讨当系统内的一份逻辑数据存在多个物理的数据副本时,对其执行读写操作会产生什么样的结果,这也符合 CAP 理论对一致性的表述。而在数据库领域,“一致性”与事务密切相关,又进一步细化到 ACID 四个方面。其中,I 所代表的隔离性(Isolation),是“一致性”的核心内容,研究的就是如何协调事务之间的冲突。.........
2022-08-05 23:01:23
2108
原创 分布式数据库难题(二):数据复制
复制主要指通过互联网在多台机器上保存相同的数据副本,通过复制的方案,主要希望达成一下目的(1)使数据在地理位置上更接近用户,从而降低访问延迟;(2)当部分组件出现故障,系统依然可以继续工作,从而提高可用性;(3)扩展至多台机器以同时提供数据访问服务,从而提高读吞吐率;...
2022-08-01 22:48:51
491
原创 分布式数据库难题(一):数据分区
面对海量数据或者非常高的查询压力,我们需要将数据拆分成分区,采用分区的目的主要是提高可扩展性,将数据和查询负载均匀分布在所有节点上。如果节点平均分担负载,那么理论上10个节点应该能够处理10倍的数据量和10倍于单个节点的读写吞吐量。而如果分布不均匀,则会出现某些分区节点比其它分区承担更多的数据量或查询负载,称之为写倾斜。......
2022-07-30 21:36:32
697
1
原创 抓包工具的使用
tcpdump是Linux下一个强大的抓包工具,支持针对网络层、协议、主机、网络或端口的过滤,凭借其强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具。1. 使用教程执行tcpdump --help命令后,tcpdump的使用语法如下:tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ] [ -C file_size ] [ -E algo:secret ] [ ....
2022-02-20 18:05:41
2702
原创 正则表达式
1. 什么是正则表达式2. 基本语法 2.1 字符类 2.2 数量限定符 2.3 位置限定符 2.4 其它特殊字符3. 实战演练 在工作中,为了提高工作效率,我们必须要学会使用Linux下的各种工具,它们强大而高效。正则表达式则是这些高效的工具之一,无论是文本处理命令grep、sed、awk中使用正则表达式,还是在代码编译器VS Code中使用正则表达式,都可以快速地帮助我们进行文本的查找或者替换,提高编写代码或者解决问题的工作效率,减少时间的浪...
2022-02-20 15:51:20
596
原创 无日志定位代码段
在生产环境中,一般情况下不会打开core文件开关,所以如果进程运行过程中core掉了,就无法找到程序的调用栈,而且此时日志文件中也没有记录core掉的原因,那么此时如何找出程序是core在哪行代码呢 ?笔者在工作中就遇到过这样一个问题。1. 现场分析// todo2. 定位代码段// todo...
2022-01-03 10:52:03
573
原创 Redis(二十二):Redis迁移工具
1. Redis-shake2. Redis-migrate-tool3. Redis-full-check1. Redis-shake1.1 简介 redis-shake是阿里云Redis&MongoDB团队开源的用于redis数据同步的工具。redis-shake是我们基于redis-port基础上进行改进的一款产品。它支持解析、恢复、备份、同步四个功能。恢复restore:将RDB文件恢复到目的redis数据库。 备份dump:将源red...
2021-11-24 20:02:40
2612
原创 Redis(二十一):Redis性能测试
1. redis-benchmark的使用2. python脚本对redis进行测试 通常我们开发完一个系统之后,如何验证这个系统的好坏呢,这就需要做性能测试,Redis也不例外。幸运的是,Redis源码中已经提供了测试工具redis-benchmark,当我们从源码中编译完成Redis之后,就可以使用redis-benchmark对Redis进行性能测试。1. redis-benchmark的使用 redis-benchmard的使用语法如下:redis-benchmar...
2021-11-24 19:18:21
2162
原创 InnoDB(三):InnoDB表的逻辑和物理存储
1. InnoDB逻辑存储结构 所有的数据都被放在一个空间中,这个空间称为表空间(table space),表空间又由段(segmet)、区(extent)和页(page)组成,如下图所示。(1)表空间(table space) 表空间是存储引擎的最高层,所有的数据都存放在表空间中。如果没有开启innodb_file_per_table,则所有数据都存放在默认的共享表空间中,如果开启这个参数,那么,每张表的数据可以单独放到一个表空间中。表空间就是存放表的地方,它可以是一个物理文件...
2021-10-24 17:56:36
2546
原创 Redis(二十):Redis中执行Lua脚本
1. Lua脚本 1.1 简介 1.2 使用lua脚本好处2. Redis客户端中Lua脚本的使用3. Redis服务器中lua环境 3.1 创建并修改lua环境 3.2 lua伪客户端 3.3 lua_scripts字典 在redis分布式锁的那篇博客中我们介绍到,为了避免在分布式环境中释放别人的锁,释放锁时需要使用 GET + DEL 两条命令,而为了让着两条命令作为一个原子操作执行,我们可以使用Lua脚本来保证,接下来我们介绍Lua脚本1. Lua脚...
2021-08-08 16:49:34
9224
原创 Redis(十九):Redis分布式锁
1. 分布式锁简介 1.1 线程锁、进程锁和分布式锁 1.2 分布式锁实现方式2. Redis分布式锁 2.1SETNX命令 2.2如何避免死锁 2.3 如何处理锁过期 2.4 如何避免释放别人的锁1. 分布式锁简介1.1 线程锁、进程锁和分布式锁 在介绍分布式锁时,我们有必要介绍线程锁、进程锁和分布式锁三者的区别:(1)线程锁 主要用来给方法、代码块加锁。当某个方法或者代码块使用锁时,那么在...
2021-08-01 16:13:52
379
2
原创 InnoDB(二):InnoDB体系架构
1. 体系架构 InnoDB的体系架构如下图所示: 从InnoDB的体系架构图可以看出,InnoDB主要由后台线程、内存池和文件三个部分组成。后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存是最近的数据,此外将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB能恢复到正常运行状态。2. 后台线程 InnoDB有不同的后台线程,用于处理不同的任务。2.1 Master Thread master thread是一...
2021-07-25 17:54:25
744
原创 InnoDB(一):Mysql存储引擎简介
1. Mysql体系结构2. Mysql存储引擎1. Mysql体系结构1.1 数据库和实例数据库:数据库是物理操作系统或其它形式文件类型的集合。在mysql中,数据库文件可以时frm、MYD、MYI、ibd结尾的文件。当使用NDB时,数据库的文件可能不是操作系统上的文件,而是存放于内存之中的文件,但是定义仍然不变。 实例:实例是mysql数据库后台线程以及一个共享内存区组成,共享内存可以被运行的后台线程所共享。需要牢记的是,数据库实例才是真正用于操作数据库文件的。 mysql数据..
2021-07-25 12:15:17
484
2
原创 Redis(十八):Redis协议
1. Redis协议介绍2. 请求和响应 2.1 请求响应模式 2.2 请求格式 2.3 响应格式3. 协议分类1. Redis协议介绍 Redis 支持 8 种核心数据结构,每种数据结构都有一系列的操作指令,除此之外,Redis 还有事务、集群、发布订阅、脚本等一系列相关的指令。为了方便以一种统一的风格和原则来设计和使用这些指令,Redis 设计了 RESP,即 Redis Serialization Protocol,中文意思是 Redis 序列化协议...
2021-07-18 16:01:54
2799
原创 Linux内存管理(五):PTmalloc、TCmalloc、Jemalloc比较
1. 内存管理目标2. 三种内存管理的比较1. 内存管理目标 内存管理的目的是实现了malloc(),free()以及一组其它的函数,以提供动态内存管理的支持。分 配器处在用户程序和内核之间,它响应用户的分配请求,向操作系统申请内存,然后将其返回给用户程序。 为了保持高效的分配,分配器一般都会预先分配一块大于用户请求的内存, 并通过某种算法管理这块内存。来满足用户的内存分配要求,用户释放掉的内存也并不是立即就返回给操作系统,相反,分配器会管理这些被释放掉的空闲空间,以应对用户以后...
2021-07-04 17:58:37
6745
原创 Linux内存管理(四):Jemalloc
1. Jemalloc简介 jemalloc 是由 Jason Evans 在 FreeBSD 项目中引入的新一代内存分配器。它是一个通用的 malloc 实现,侧重于减少内存碎片和提升高并发场景下内存的分配效率,其目标是能够替代 malloc。jemalloc 应用十分广泛,在 Firefox、Redis、Rust、Netty 等出名的产品或者编程语言中都有大量使用。具体细节可以参考 Jason Evans 发表的论文 《A Scalable Concurrent malloc Implemen...
2021-07-04 12:21:05
13632
原创 Redis(十七):Redis模块
1. redis模块简介2. 添加自定义模块3. redis中安装布隆过滤器1. redis模块简介 Redis Modules System是4.0出现一大改动点,使得可以通过外部模块对Redis进行功能性扩展。2. 添加自定义模块 Redis的模块采用的是动态链接库的方式,可以启动的时候加载,也可以在运行时加载(MODULE LOAD),在Linux系统里面,可以通过dlopen,dlsym等实现动态加载库,在业务系统里面,经常用于将业务代码和框架代码进行分离,以实现...
2021-06-30 23:54:12
1169
原创 Redis(十六):Redis事务
1. 事务的实现2. 带WATCH的事务3. 事务的ACID特性1. 事务的实现 Redis通过MULTI、EXEC、WATCH等命令来实现事务功能,事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而去执行其它客户端的命令请求。事务的执行分为事务开始、命令入队和事务执行三个阶段。1.1 事务开始 MULTI命令的执行标志着事务的开始:redis> MULTI1.2 命令入队 每个re...
2021-06-27 17:35:30
235
原创 Redis(十五):Redis和Memcached比较
Memcached 是一个高性能的分布式内存对象缓存系统,由LiveJournal的Brad Fitzpatrick开发,用于动态Web应用以减轻数据库负载。它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-...
2021-06-27 16:13:36
245
原创 Redis(十四):Redis集群方案
Redis集群是Redis 3.0版本中新加入的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能。1. 集群节点2. 槽指派3. 集群中执行命令4. 重新分片5. ASK错误6. 复制和故障转移7. 集群消息8. 槽数量163841. 集群节点1.1 启动节点 一个节点就是一个运行在集群下的Redis服务器,Redis服务器在启动时会根据cluster-enabled配置选项是否为yes来决定是否开启服务器的集群模式。运行在集群...
2021-06-27 14:35:06
909
2
原创 Redis(十三):Redis多线程
1. Redis 3.0前多线程2. Redis 4.0多线程3. Redis 6.0多线程 3.1 线程池初始化 3.2 读取请求 3.3 写回响应 3.4 I/O线程主逻辑 3.5 性能提升 如果从Redis的核心网络模型来看,从 Redis 的 v1.0 到 v6.0 版本之前,Redis 的核心网络模型一直是一个典型的单 Reactor 模型:利用 epoll/select/kqueue 等多路复用技术,在单线程的事件循环中不断去处...
2021-06-24 00:07:11
6417
2
原创 Redis(十二):Redis的消息队列Stream
8. 消息队列(stream)8.1 Stream简介 Stream是redis最复杂的一个数据结构, 也是redis 5.0的一个重要更新。Redis Stream 主要用于消息队列(MQ,Message Queue),这样的数据结构其实很常见, 比如腾讯云的CMQ、RabbitMQ、kafka等。 Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。简单来...
2021-06-19 00:01:52
2400
原创 Redis(十一):Redis各版本特性
redis系列博客基本都是基于redis 3.0来写的,Redis3.0在2015年4月1日正式发布,相比于Redis2.8主要特性如下:Redis最大的改动就是添加Redis的分布式实现Redis Cluster。
2021-06-18 21:58:04
7369
原创 LevelDb(四):LevelDb的Compaction操作
1. compaction介绍2. minor compaction3. major compaction1. compaction介绍 对于LevelDb来说,写入记录操作很简单,删除记录仅仅写入一个删除标记就算完事,但是读取记录比较复杂,需要在内存以及各个层级文件中依照新鲜程度依次查找,代价很高。为了加快读取速度,levelDb采取了compaction的方式来对已有的记录进行整理压缩,通过这种方式,来删除掉一些不再有效的KV数据,减小数据规模,减少文件数量等。levelDb的co..
2021-05-23 16:26:08
1461
原创 LevelDb(三):LevelDb各操作的实现
1. 打开数据库2. 写入一条数据3. 删除一条数据4. 读取一条数据 在LevelDb简介这篇博客中我们知道使用levelDB时,主要涉及到打开数据库、写入一条数据、删除一条数据、读取一条数据等操作,下面我们分别介绍各个操作的流程。1. 打开数据库 leveldb::DB* db; leveldb::Options opts; opts.create_if_missing = true; leveldb::Status status = lev..
2021-05-22 16:26:23
2345
原创 LevelDb(二):LevelDb整体架构
1. LevelDb组成2. Log文件3.MemTable和Immutable Memtable4.SSTable文件5.Manifest文件6.Current文件7. Others 7.1 Version 7.2VersionEdit 7.3VersionSet 7.4 Builder 7.5TableCache1. LevelDb组成 LevelDb作为存储系统,数据记录的存储介质包括内存以及磁盘文...
2021-05-22 12:30:18
6056
原创 LevelDb(一):LevelDb简介
1. leveldb简介2. hello world 2.1 leveldb源码下载和编译 2.2 hello world程序1. leveldb简介 LevelDb是google的工程师Jeff Dean和Sanjay Ghemawat这两位大神级别的工程师发起的开源项目,这两位是Google重量级的工程师,为数甚少的Google Fellow之二。Jeff Dean其人是Google大规模分布式平台Bigtable和MapReduce主要设计和实现者,Sanjay ...
2021-05-16 12:04:18
5751
2
原创 Redis(十):引入缓存后带来的问题
1. 引入缓存后给业务带来的问题 1.1 缓存读取 1.2 缓存更新 1.3 缓存淘汰2. 缓存的三座大山 2.1 一致性 2.2缓存击穿 2.3缓存雪崩1. 引入缓存后给业务带来的问题 业务系统引入缓存之后,架构由原来的两层架构变成了三层架构: 由此,带来了三个问题需要解决,分别是缓存读取、缓存更新和缓存淘汰。1.1 缓存读取 缓存读...
2021-05-05 18:18:28
560
2
原创 Redis(九):Redis的主从同步
1、全同步2、命令传播2.1 旧版复制功能的缺陷2.2 新版复制功能的实现 redis的复制功能分为同步和命令传播两个操作,同步操作用于将从服务器的数据库状态更新至主服务器所处的数据库状态。命令传播操作则用于主服务器的数据库状态被修改时,导致主从服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一致状态。redis的复制功能主要通过执行SLAVEEOF命令来实现。1、全同步 从服务器对主服务器的同步操作需要通过向主服务器发送SYNC命令来完成,以下是SY...
2021-05-04 20:27:38
963
原创 Redis(八):Redis的两种持久化方式
1、RDB持久化 1.1 RDB手动执行 1.2 RDB定期执行2、AOF持久化 2.1 AOF持久化的实现 2.2 AOF数据的载入 2.3 AOF重写 redis有两种持久化方式,分别是RDB持久化和AOF持久化,RDB持久化通过保存数据库中的键值对来保存数据库的状态,而AOF持久化是通过保存服务器执行的写命令来保存数据库的状态。1、RDB持久化 RDB持久化既可以手动执行,也可以根据服务器的配置选项定期执行,该功能...
2021-05-04 17:19:52
371
原创 Redis(七):Redis内存淘汰
1. 主动淘汰 1.1 键的生存周期 1.2 过期键删除策略2. 被动淘汰 2.1 被动淘汰策略 2.2 被动淘汰策略的实现 由于redis是一个内存数据库,所有数组都保存在内存中,而内存的数量毕竟不是无限的,因此当redis中保存的键值对超过一定数量时,就需要淘汰掉一些键值对,减少redis所占的内存空间。redis有两种内存淘汰策略,一种称为主动淘汰,一种称为被动淘汰。主动淘汰即为redis的键值对设置过期时间,当时间到期之后,对应的键值对就会从内存...
2021-05-04 12:34:02
348
原创 Redis(六):Redis客户端初始化
1. 客户端状态:struct redisClient 1.1 标志flags 1.2 输入缓冲区querybuf 1.3 命令argv和命令参数个数argc 1.4 命令实现函数cmd 1.5输出缓冲区buf和reply 1.6身份验证authenticated2. 客户端的创建 2.1 相关数据结构 2.2 主函数 2.3 连接服务器的函数 Redis是一个典型的一对多的服务程序,一个服务器可以和多个客户端建立网...
2021-04-04 20:55:14
918
原创 Redis(五):Redis的事件循环
1. 事件循环简介2. 文件事件3. 时间事件4. 事件循环流程 4.1 获取到达事件离当前时间最接近的时间事件 4.2 计算最接近时间事件距离到达还有多少毫秒,保存在timeval中 4.3 阻塞等待文件事件产生,阻塞时间由timeval决定 4.4 处理已产生的文件事件 4.5 处理已到达的时间事件1. 事件循环简介 redis是一个事件驱动程序,服务器需要处理以下两类事件,分别是时间事件和文件事件。redis服务器在启动之后,开始...
2021-04-04 17:10:28
1224
原创 Redis(四):Redis服务器的初始化
1、相关数据结构1.1 服务器:struct redisServer1.2 数据库:struct redisDb 1.3 redis命令:struct redisCommand2、服务器初始化流程 2.1 初始化服务器状态结构(initServerConfig函数)2.2 载入配置选项(loadServerConfig函数) 2.3 初始化服务器数据结构(initServer函数) 2.4 还原数据库状态(loadDataFromDisk...
2021-04-04 16:53:12
2287
原创 Redis(三):Redis的配置文件介绍
Redis的配置文件为redis.conf,配置文件主要分为以下几个模块,分别是:1、GENERAL2、SNAPSHOTTING3、REPLICATION4、SECURITY5、LIMITS6、APPEND ONLY MODE7、LUA SCRIPTING8、REDISCLUSTER9、SLOW LOG10、ADVANCED CONFIG1、GENERAL参数名 默认值 含义 daemonize no redis是否作为守...
2021-04-04 15:18:54
343
原创 Redis(二):Redis的内存分配
Redis在编译时便会指定内存分配器;内存分配器可以是 libc 、jemalloc或者tcmalloc,默认是jemalloc。在Redis中内存分配主要靠zmalloc实现,在zmalloc.c文件实现,在这个文件内还存在其他相关的操作函数。void *zmalloc(size_t size); // 申请内存void *zcalloc(size_t size); // 申请内存,并初始化为0void *zrealloc(void *ptr, size_t size); // 重申...
2021-04-04 15:17:28
1197
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人