- 博客(41)
- 收藏
- 关注
原创 mongodb学习笔记[课程来自图灵课堂]
MongoDB是一个开源、高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种。是最像关系型数据库(MySQL)的非关系型数据库。它支持的数据结构非常松散,是一种类似于 JSON 的 格式叫BSON,所以它既可以存储比较复杂的数据类型,又相当的灵活。MongoDB中的记录是一个文档,它是一个由字段和值对(field:value)组成的数据结构。MongoDB文档类似于JSON对象,即一个文档认为就是一个对象。
2023-12-28 16:51:57
869
转载 RDB 快照是怎么实现的?
大家好,我是小林哥。虽说 Redis 是内存数据库,但是它为数据的持久化提供了两个技术。分别是「 AOF 日志和 RDB 快照」。这两种技术都会用各用一个日志文件来记录信息,但是记录的内容是不同的。关于 AOF 持久化的原理我在上一篇已经介绍了,今天主要讲下 RDB 快照。所谓的快照,就是记录某一个瞬间东西,比如当我们给风景拍照时,那一个瞬间的画面和信息就记录到了一张照片。所以,RDB 快照就是记录某一个瞬间的内存数据,记录的是实际数据,而 AOF 文件记录的是命令操作的日志,而不是实际的数据。
2023-12-27 17:03:38
48
转载 AOF 持久化是怎么实现的?
这次小林给大家介绍了 Redis 持久化技术中的 AOF 方法,这个方法是每执行一条写操作命令,就将该命令以追加的方式写入到 AOF 文件,然后在恢复时,以逐一执行命令的方式来进行数据恢复。Redis 提供了三种将 AOF 日志写回硬盘的策略,分别是 Always、Everysec 和 No,这三种策略在可靠性上是从高到低,而在性能上则是从低到高。
2023-12-27 16:19:37
73
转载 揭开 Buffer Pool 的面纱
Innodb 存储引擎设计了一个缓冲池(Buffer Pool),来提高数据库的读写性能。Buffer Pool 以页为单位缓冲数据,可以通过 innodb_buffer_pool_size 参数调整缓冲池的大小,默认是 128 M。Free List (空闲页链表),管理空闲页;Flush List (脏页链表),管理脏页;LRU List,管理脏页+干净页,将最近且经常查询的数据缓存在其中,而不常查询的数据就淘汰出去。;
2023-12-27 13:41:09
33
转载 MySQL 日志:undo log、redo log、binlog 有什么用?
具体更新一条记录执行器负责具体执行,会调用存储引擎的接口,通过主键索引树搜索获取 id = 1 这一行记录:如果 id=1 这一行所在的数据页本来就在 buffer pool 中,就直接返回给执行器更新;如果记录不在 buffer pool,将数据页从磁盘读入到 buffer pool,返回记录给执行器。执行器得到聚簇索引记录后,会看一下更新前的记录和更新后的记录是否一样:如果一样的话就不进行后续更新流程;
2023-12-26 12:53:15
41
转载 字节面试:加了什么锁,导致死锁的?
两个事务即使生成的间隙锁的范围是一样的,也不会发生冲突,因为间隙锁目的是为了防止其他事务插入数据,因此间隙锁与间隙锁之间是相互兼容的。在执行插入语句时,如果插入的记录在其他事务持有间隙锁范围内,插入语句就会被阻塞,因为插入语句在碰到间隙锁时,会生成一个插入意向锁,然后插入意向锁和间隙锁之间是互斥的关系。
2023-12-26 11:13:16
29
转载 MySQL 死锁了,怎么办?
大家好,我是小林。说个很早之前自己遇到过数据库死锁问题。有个业务主要逻辑就是新增订单、修改订单、查询订单等操作。然后因为订单是不能重复的,所以当时在新增订单的时候做了幂等性校验,做法就是在新增订单记录之前,先通过 select … for update 语句查询订单是否存在,如果不存在才插入订单记录。而正是因为这样的操作,当业务量很大的时候,就可能会出现死锁。接下来跟大家聊下为什么会发生死锁,以及怎么避免死锁。
2023-12-25 23:05:08
204
转载 MySQL 记录锁+间隙锁可以防止删除操作而导致的幻读吗?
首先来看看 MySQL 文档是怎么定义幻读(Phantom Read)的:翻译:当同一个查询在不同的时间产生不同的结果集时,事务中就会出现所谓的幻象问题。例如,如果 SELECT 执行了两次,但第二次返回了第一次没有返回的行,则该行是“幻像”行。T1 时间执行的结果是有 5 条行记录,而 T2 时间执行的结果是有 6 条行记录,那就发生了幻读的问题。T1 时间执行的结果是有 5 条行记录,而 T2 时间执行的结果是有 4 条行记录,也是发生了幻读的问题。MySQL 是怎么解决幻读的?
2023-12-25 21:28:21
68
转载 update 没加索引会锁全表?
不要小看一条 update 语句,在生产机上使用不当可能会导致业务停滞,甚至崩溃。当我们要执行 update 语句的时候,确保 where 条件中带上了索引列,并且在测试机确认该语句是否走的是索引扫描,防止因为扫描全表,而对表中的所有记录加上锁。我们可以打开 MySQL sql_safe_updates 参数,这样可以预防 update 操作时 where 条件没有带上索引列。
2023-12-25 18:48:32
268
转载 MySQL 是怎么加锁的?
大家好,我是小林。是不是很多人都对 MySQL 加行级锁的规则搞的迷迷糊糊,对记录一会加的是 next-key 锁,一会加是间隙锁,一会又是记录锁。坦白说,确实还挺复杂的,但是好在我找点了点规律,也知道如何如何用命令分析加了什么类型的行级锁。之前我写过一篇关于「MySQL 是怎么加行级锁的?」的文章,随着我写 MySQL 锁相关的文章越来越多时,后来发现当时的文章写的不够详细。
2023-12-24 16:32:07
68
转载 MySQL 有哪些锁?
大家好,我是小林。这次,来说说 MySQL 的锁,主要是 Q&A 的形式,看起来会比较轻松。不多 BB 了,发车!在 MySQL 里,根据加锁的范围,可以分为全局锁、表级锁和行锁三类。
2023-12-24 12:22:28
32
转载 MySQL 可重复读隔离级别,完全解决幻读了吗?
首先来看看 MySQL 文档是怎么定义幻读(Phantom Read)的:翻译:当同一个查询在不同的时间产生不同的结果集时,事务中就会出现所谓的幻象问题。例如,如果 SELECT 执行了两次,但第二次返回了第一次没有返回的行,则该行是“幻像”行。T1 时间执行的结果是有 5 条行记录,而 T2 时间执行的结果是有 6 条行记录,那就发生了幻读的问题。T1 时间执行的结果是有 5 条行记录,而 T2 时间执行的结果是有 4 条行记录,也是发生了幻读的问题。
2023-12-24 10:35:44
115
转载 事务隔离级别是怎么实现的?
事务是在 MySQL 引擎层实现的,我们常见的 InnoDB 引擎是支持事务的,事务的四大特性是原子性、一致性、隔离性、持久性,我们这次主要讲的是隔离性。当多个事务并发执行的时候,会引发脏读、不可重复读、幻读这些问题,那为了避免这些问题,SQL 提出了四种隔离级别,分别是读未提交、读已提交、可重复读、串行化,从左往右隔离级别顺序递增,隔离级别越高,意味着性能越差,InnoDB 引擎的默认隔离级别是可重复读。
2023-12-23 23:59:53
26
转载 count(*) 和 count(1) 有什么区别?哪个性能最好?count(*) 和 count(1) 有什么区别?哪个性能最好?
大家好,我是小林。当我们对一张数据表中的记录进行统计的时候,习惯都会使用 count 函数来统计,但是 count 函数传入的参数有很多种,比如 count(1)、count(*)、count(字段) 等。到底哪种效率是最好的呢?是不是 count(*) 效率最差?我曾经以为 count(*) 是效率最差的,因为认知上 selete * from t 会读取所有表中的字段,所以凡事带有 * 字符的就觉得会读取表中所有的字段,当时网上有很多博客也这么说。
2023-12-23 23:08:42
167
原创 多线程详解
线程是CPU调度的最小单位,Python由于GIL锁的存在,CPython解释器并不能真正实现多线程,他不适合CPU密集型,但是适合IO密集型,本文主要讲述 python 多线程的使用。
2023-12-23 13:22:39
878
原创 python多进程
一般说来,fork 启动方式是最快的,因为他所需的所有数据都是内存拷贝,但是很明显,某些情况下,他是最消耗内存的,比如有个项目已经运行了很久了,有很多对象,但是他们不是 子进程计算中的必须对象,会造成一定的内存占用。主进程启动进程服务器的时候不能传递主进程的变量,也就保证了进程安全。forkserver 模式是 fork 模式和 spawn 模式的结合体,主进程会先新启一个服务器进程,这个服务器进程再去以 fork 的方式启动一个新的进程,主进程负责与服务器进程打交道,服务器进程完成进程管理。
2023-12-23 10:01:52
971
原创 asyncio -- 异步IO
协程,又称之为微线程,本质上还是 python 运行的单进程单线程程序。和线程不同,协程不涉及到系统级的上下文切换,而是在单个线程内进行锁执行代码块的切换。因此协程并没有提高计算速度,而是在代码执行的等待时间,去做别的任务,典型的运用场景就是网络通讯。在 python3.7 以后,由 asyncio 包实现协程,虽然有更古老的实现办法,但是我们没必要去做深入的了解。asyncio 包的运行核心就是event loop(事件循环)。
2023-12-22 17:53:23
949
转载 Redis 数据结构
大家好,我是小林。Redis 为什么那么快?除了它是内存数据库,使得所有的操作都在内存上进行之外,还有一个重要因素,它实现的数据结构,使得我们对数据进行增删查改操作时,Redis 能高效的处理。因此,这次我们就来好好聊一下 Redis 数据结构,这个在面试中太常问了。
2023-12-22 15:50:38
59
转载 MySQL 使用 like “%x“,索引一定会失效吗?
要查询的数据就不能只在二级索引树里找了,得需要回表操作才能完成查询的工作,再加上是左模糊匹配,无法利用索引树的有序性来快速定位数据,所以得在二级索引树逐一遍历,获取主键值后,再到聚簇索引树检索到对应的数据行,这样实在太累了。首先,这张表的字段没有「非索引」字段,所以 select * 相当于 select id,name,然后这个查询的数据都在二级索引的 B+ 树,因为二级索引的 B+ 树的叶子节点包含「索引值+主键值」,所以查二级索引的 B+ 树就能查到全部结果了,这个就是覆盖索引。
2023-12-22 12:40:48
68
转载 索引失效有哪些?
当我们使用左或者左右模糊匹配的时候,也就是like %xx或者like %xx%这两种方式都会造成索引失效;当我们在查询条件中对索引列使用函数,就会导致索引失效。当我们在查询条件中对索引列进行表达式计算,也是无法走索引的。MySQL 在遇到字符串和数字比较的时候,会自动把字符串转为数字,然后再进行比较。如果字符串是索引列,而条件语句中的输入参数是数字的话,那么索引列会发生隐式类型转换,由于隐式类型转换是通过 CAST 函数实现的,等同于对索引列使用了函数,所以就会导致索引失效。
2023-12-22 11:45:07
23
转载 MySQL 单表不要超过 2000W 行,靠谱吗?
MySQL 的表数据是以页的形式存放的,页在磁盘中不一定是连续的。页的空间是 16K, 并不是所有的空间都是用来存放数据的,会有一些固定的信息,如,页头,页尾,页码,校验码等等。在 B+ 树中,叶子节点和非叶子节点的数据结构是一样的,区别在于,叶子节点存放的是实际的行数据,而非叶子节点存放的是主键和页号。索引结构不会影响单表最大行数,2000W 也只是推荐值,超过了这个值可能会导致 B + 树层级更高,影响查询性能。
2023-12-22 10:46:34
52
转载 Redis 常见数据类型和应用场景
String 是最基本的 key-value 结构,key 是唯一标识,value 是具体的值,value其实不仅是字符串, 也可以是数字(整数或浮点数),value 最多可以容纳的数据长度是 512M。List 列表是简单的字符串列表,按照插入顺序排序,可以从头部或尾部向 List 列表添加元素。列表的最大长度为 2^32 - 1,也即每个列表支持超过 40 亿个元素。
2023-12-22 00:20:00
102
转载 Redis 常见面试题
我们直接看 Redis 官方是怎么介绍自己的。Redis 官方的介绍原版是英文的,我翻译成了中文后截图的,所以有些文字读起来会比较拗口,没关系,我会把里面比较重要的特性抽出来讲一下。Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。
2023-12-21 22:59:21
31
原创 redis目录
面试篇 👇Redis 常见面试题数据类型篇 👇Redis 数据类型和应用场景图解 Redis 数据结构持久化篇 👇AOF 持久化是怎么实现的?RDB 快照是怎么实现的?Redis 大 Key 对持久化有什么影响?功能篇👇Redis 过期删除策略和内存淘汰策略有什么区别?高可用篇 👇主从复制是怎么实现的?为什么要有哨兵?缓存篇 👇什么是缓存雪崩、击穿、穿透?数据库和缓存如何保证一致性?
2023-12-20 22:23:22
364
1
原创 Celery的使用
Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,专注于实时处理的异步任务队列,同时也支持任务调度。Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成。消息中间件Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ, Redis等等任务执行单元Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。
2023-12-20 22:07:22
971
1
转载 为什么 MySQL 采用 B+ 树作为索引?
索引数据最好能按顺序排列,这样可以使用「二分查找法」高效定位数据。假设我们现在用数组来存储索引,比如下面有一个排序的数组,如果要从中找出数字 3,最简单办法就是从头依次遍历查询,这种方法的时间复杂度是 O(n),查询效率并不高。因为该数组是有序的,所以我们可以采用二分查找法,比如下面这张采用二分法的查询过程图:可以看到,二分查找法每次都把查询的范围减半,这样时间复杂度就降到了 O(logn),但是每次查找都需要不断计算中间位置。用数组来实现线性排序的数据虽然简单好用,但是插入新元素的时候性能太低。
2023-12-20 11:28:51
67
1
转载 从数据页的角度看 B+ 树
InnoDB 的数据是按「数据页」为单位来读写的,默认数据页大小为 16 KB。每个数据页之间通过双向链表的形式组织起来,物理上不连续,但是逻辑上连续。数据页内包含用户记录,每个记录之间用单向链表的方式组织起来,为了加快在数据页内高效查询记录,设计了一个页目录,页目录存储各个槽(分组),且主键值是有序的,于是可以通过二分查找法的方式进行检索从而提高效率。为了高效查询记录所在的数据页,InnoDB 采用 b+ 树作为索引,每个节点都是一个数据页。
2023-12-20 10:58:31
38
1
原创 windows+docker+ubuntu
绝大多数的程序员或者学生使用的还是 windows,但是日常开发使用的是 linux 环境,我们需要尽量使用 linux 环境编程和学习。比如 python 多进程共有三种模式, fork, forkserver, spem 常用的是 fork 或者 forkServer, 但是 windows 只有 spem 模式,对于开发学习非常不友好。这篇文章就记录 windows 通过 docker 安装 ubuntu 从而搭建简易的 linux 环境。
2023-12-19 17:41:48
989
转载 索引常见面试题
当你想查阅书中某个知识的内容,你会选择一页一页的找呢?还是在书的目录去找呢?傻瓜都知道时间是宝贵的,当然是选择在书的目录去找,找到后再翻到对应的页。书中的目录,就是充当索引的角色,方便我们快速查找书中的内容,所以索引是以空间换时间的设计思想。那换到数据库中,索引的定义就是帮助存储引擎快速获取数据的一种数据结构,形象的说就是索引是数据的目录。所谓的存储引擎,说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。
2023-12-19 12:06:13
240
转载 MySQL 一行记录是怎么存储的?
MySQL 的 NULL 值是怎么存放的?MySQL 的 Compact 行格式中会用「NULL值列表」来标记值为 NULL 的列,NULL 值并不会存储在行格式中的真实数据部分。NULL值列表会占用 1 字节空间,当表中所有字段都定义成 NOT NULL,行格式中就不会有 NULL值列表,这样可节省 1 字节的空间。MySQL 怎么知道 varchar(n) 实际占用数据的大小?MySQL 的 Compact 行格式中会用「变长字段长度列表」存储变长字段实际占用的数据大小。
2023-12-19 10:07:02
59
原创 吃透Python元类
首先,我们需要理解什么是元类。在 Python 中,一切皆对象,包括类本身。类定义了对象的行为,而元类则定义了类的行为。简而言之,元类就是创建类的“类”。在 Python 中,我们可以通过继承 type 类来定义元类。元类应该定义一个__new__方法。这个方法负责接收类定义的参数,并返回一个类对象。# 注意,这里的 self 其实就是使用该元类的类本身return objx = 12306a = 10a = A()可以清楚地看到,一般类在加载的时候,元类就生效了。
2023-12-18 23:50:11
370
原创 Python实现单例模式
单例模式(Singleton Pattern) 是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。
2023-12-18 22:49:30
334
转载 执行一条 select 语句,期间发生了什么?
执行一条 SQL 查询语句,期间发生了什么?连接器:建立连接,管理连接、校验用户身份;查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;执行 SQL:执行 SQL 共有三个阶段:预处理阶段:检查表或字段是否存在;将select *中的符号扩展为表上的所有列。优化阶段:基于查询成本的考虑, 选择查询成本最小的执行计划;
2023-12-18 20:25:24
39
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人