Golang并发度控制在Golang中可以通过channel去控制goroutine的并发度
举个例子:
12345678910111213141516171819202122232425262728293031package mainimport ( "fmt" "sync" "time")func main() { var wg sync.WaitGroup concurrence := 2 semaphore := make(chan struct{}, concurrence) startTime := time.Now() for i := 0; i < 10; i++ { wg.Add(1) go func(i int) { defer wg.Done() // 抢占一个并发槽位 semaphore <- struct{}{} // 模拟任务执行 fmt.Printf("Task ...
InnoDB引擎逻辑存储结构
TableSpace:表空间(idb文件),一个mysql实例对应多个表空间,用于存储记录、索引等数据。
Segment:段,分为数据段、索引段、回滚段、InnoDB是索引组织表,数据段就是B+树的叶子结点,索引段位B+树的非叶子结点。
Extent:区,表空间内的单元结构,每个区的大小为1MB。默认情况下InnoDB存储引擎页大小为16K,即一个区中有64个页。
Page:页,InnoDB存储引擎磁盘管理的最小单元,默认为16KB。为保证页的连续,InnoDB存储引擎每次从磁盘申请4-5个区。
Row:行,InnoDB存储引擎数据是按行存放的。
Trx_id:每次对某条记录进行修改时,都会把对应的事务id赋值给Trx_id隐藏列。
Roll_point:每次对某条记录进行修改时,都会把旧的版本写入到Udo日志中,然后这个隐藏列相当于一个指针,可以通过它来找到修改前的信息。
架构内存架构Buffer Poll:缓冲池是主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据(如果缓冲池中没有数据,则从磁盘中加 ...
MySQL事务简介事务是一组操作的集合,它是一个不可分割的工作单位,事务会把索引的操作作为一个整体一起向系统提交或者撤销,即这些操作要么同时成功,要么同时失败。从而保证了数据的完整性和一致性。
事务操作
查看/设置事务提交方式
12select @@autocommit;set @@autocommit=0; -- 设置为手动提交
提交事务
1commit;
回滚事务
1rollback;
事务操作
1234start transaction; -- 开启事务begin; -- 开启事务commit;rollback;
事务的四大特性
原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性(Consitency):事务完成时,必须使所有的数据都保持一致状态。
隔离性(Isolation):数据库系统提交的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性(Durability):事务一旦提交或回滚,它对数据库中数据的改变是永久的。
通过原子性、隔离性、持久性(AID)保证了一致性(C)
并发事务问题
问 ...
SQL优化插入数据优化insert优化
批量插入(500-1000条)
手动提交事务
主键顺序插入
大批量插入数据,使用load命令插入
123456# 客户端连接时加上对应参数mysql --local-infile -utroot -p# 设置启用local_infile全局参数set global local_infile=1# 执行load命令加载数据到表结构中load data local infile '/root/test.csv' into table `tests` fields terminayed by ',' lines terminated by '\n';
主键优化数据组织方式
在InnoDB存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表成为==索引组织表==。
页分裂
页可以为空,页可以一半,也可以填充满,每个页包含了2-N行数据(如果一行数据过大,会行溢出),更具主键排列。
如果主键乱序插入的话,就会产生页分裂现象。当一个数据页满时,插一个新的数据,新数据会分配到新的页。
页 ...
索引使用注意事项最左前缀法则
如果索引了多列数据(联合索引),要遵循最左前缀法则。
从索引的最左列开始,并且不跳过索引的列。如果跳过某一列,索引将部分失效(后面的字段也失效)。
索引列运算操作
不能再索引列上进行计算操作,不然会导致索引失效。
字符串不加引号
也会导致索引失效
模糊查询
如果只是尾部模糊匹配,索引不会失效。只要有头部模糊匹配,索引失效。
or连接的条件
用or分割开的条件,如果or前的条件有索引,or后的条件没有索引,那么涉及到的索引都不会被用到。
数据分布影响
如果MySQL评估使用索引比全表更慢,则不使用索引。
SQL提示
SQL提示是优化数据库的一个重要手段,简单来说就是在SQL语句中加入一些人为的提示来达到优化操作的目的。
1select ... from table_name use index(index_name) where ...;
use index(…):建议MySQL使用的索引
force index(…):强制MySQL使用的索引
覆盖索引
查询使用了索引,并且需要返回的列在索引中能全部找到。
using index condition:使用了 ...
SQL性能分析SQL执行频率通过show status可以查看服务器状态信息
12345678910111213141516mysql> show global status like 'COM_______';+---------------+-------+| Variable_name | Value |+---------------+-------+| Com_binlog | 0 || Com_commit | 0 || Com_delete | 0 || Com_import | 0 || Com_insert | 0 || Com_repair | 0 || Com_revoke | 0 || Com_select | 1 || Com_signal | 0 || Com_update | 0 || Com_xa_end | 0 |+---------------+-------+
慢查询日志 ...
后端开发
未读Redis缓存相关解决方案缓存穿透什么是缓存穿透?缓存穿透是指用户请求的数据在缓存中没有命中,同时在数据库也不存在,导致用户的每一次请求都要去数据库中查一遍,然后返回为空。
如果有恶意攻击者不断请求不存在的数据,会导致大量的请求落在数据库上,造成数据库压力过大,甚至击垮数据库。
解决方案
布隆过滤器
布隆过滤器专门用来检测集合中是否存在特定的元素。
布隆过滤器由一个长度为m比特的位数组(bit array)与k个哈希函数(hash function)组成的数据结构。位数组初始化均为0,所有的哈希函数都可以分别把输入数据尽量均匀地散列。
当要向布隆过滤器中插入一个元素时,该元素经过k个哈希函数计算产生k个哈希值,以哈希值作为位数组中的下标,将所有k个对应的比特值由0置为1。
当要查询一个元素时,同样将其经过哈希函数计算产生哈希值,然后检查对应的k个比特值:如果有任意一个比特为0,表明该元素一定不在集合中;如果所有比特均为1,表明该集合有可能性在集合中。为什么不是一定在集合中呢?因为不同的元素计算的哈希值有可能一样,会出现哈希碰撞,导致一个不存在的元素有可能对应的比特位为1,这就是所谓“ ...
MySQL索引一、概述索引(Index)是帮助MySQL高效获取数据的数据结构。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这种数据结构以某种方式指向数据,从而实现开始的查找数据。
优点:提高数据检索效率,降低数据库IO成本,降低CPU消耗。
缺点:索引需要占用空间,降低插入、更新、修改表的效率。
二、索引结构
索引结构
描述
B+Tree
最常见的索引
Hash
基于Hash表实现,用于精确匹配,不支持范围查询
R-Tree
空间索引是MyISAM的特殊索引类型,用于地理空间数据类型
Full-Tree
通过建立倒排索引,快速匹配文档
B+Tree 二叉树的缺点:顺序插入时,会形成一个链表,查询性能降低,在大数据量的情况下,子树节点层级会较深,检索速度慢。
红黑树:有效解决了顺序插入问题,但是在大数据量的情况下,子树节点层级还是会较深,检索速度慢。
B-Tree:多路平衡查找树
B+Tree:所有数据都会出现在叶子结点,同时形成一个单向链表。
在MySQL中,对B+Tree做了优化,增加了一个指向相邻叶子节点的链表指针,形成了带有顺序指 ...
MySQL存储引擎一、存储引擎简介存储引擎是存储数据、建立索引、更新、查询数据的实现方式,在MySQL中存储引擎是基于表的,也可以称为表类型。
123create table 表名( 字段 ...)engine=INNODB;
二、常见存储引擎1. InnoDBInnoDb是一种兼顾高性能和高可靠性的存储引擎,在MySQL5.5版本后为默认的存储引擎。
DML操作遵循ACID模型,支持事务。
支持行级锁,提升并发访问性能。
支持外键约束,保证数据的完整性和正确性。
tablename.ibd:表空间文件,存储表结构、数据和索引。
逻辑存储结构
TableSpace:表空间
Segment:段
Extent:区
Page:页
Row:行
2. MyISAMMyISAM是MySQL早期的默认存储引擎。
不支持事务,不支持外键。
支持表锁,不支持行锁。
访问速度快。
tablename.sdi:存储表结构信息
tablename.MYD:存储数据
tablename.MYI:存储索引
3. MemoryMemory引擎的表数据是存储在内存中,只能用于临时表活缓存使用。
内 ...
固定窗口限流算法
Fixed Window Rate Limiting Algorithm固定窗口限流算法是在固定时间窗口(单位时间)内限制请求的数量。
将时间分成固定的窗口,并在每个窗口内限制请求的数量。
将请求按照时间顺序放入时间窗口,并计算该时间窗口内的请求数量,如果请求数量超出了限制,则拒绝该请求。
假设单位时间(固定时间窗口)是1秒,限流阀值为3。在单位时间1秒内,每来一个请求,计数器就加1,如果计数器累加的次数超过限流阀值3,后续的请求全部拒绝。等到1s结束后,计数器清0,重新开始计数。如下图:
优点: 固定窗口算法非常简单,易于实现和理解。
缺点: 存在明显的临界问题,比如: 假设限流阀值为3个请求,单位时间窗口是1s,如果我们在单位时间内的前0.9-1s和1-1.1s,分别并发3个请求。虽然都没有超过阀值,但是如果算0.9-1.1s,则并发数高达6,已经超过单位时间1s不超过3阀值的定义。
滑动窗口限流算法
滑动窗口限流算法是一种常用的限流算法,用于控制系统对外提供服务的速率,防止系统被过多的请求压垮。
它将单位时间周期分为n个小周期,分别记录每个小周期内接口的 ...