MySQL_icp
如果没有明确的说明,本文的存储引擎均是 InnoDB,版本:8.0
假设一个表如下:
1 | CREATE TABLE `dy_video_list` ( |
目前数据有 2700 +
如果没有明确的说明,本文的存储引擎均是 InnoDB,版本:8.0
假设一个表如下:
1 | CREATE TABLE `dy_video_list` ( |
目前数据有 2700 +
SHOW PROCESSLIST 只能查看到当前用户正在运行的线程,如果你是ROOT用户,那么是可以看到所有用户正在运行的线程
如果想看到其他用户的线程,则必须为此用户赋予 PROCESS 权限。
ziplist 的添加过程大致如下:
如果是一个新建的 ziplist,其中新增元素的时候,直接将 prevlen 设置为 0 即可
如果是在中间位置新增,那么首先需要获取前一个 entry 的长度,因为后面的元素已经计算过了,因此直接拿来用即可
如果是在尾部进行新增元素,那么需要计算其前一个元素的长度,因为 zlend 不会保存前一个最后一个尾节点的长度,因此需要在新增的时候计算
由于 ziplist 的设计,当前一个元素长度小于 254 的时候, prevlen 会以一个字节进行存储,但是当前一个元素大于 254 的时候,那么 prevlen 就会变成 5 个字节
ziplist 是一个双向链表,但是不同于熟知的利用头指针和尾指针所形成的双向链表,ziplist 而是采用了一个特殊的实现
普通的双向链表因为在每一个节点上都含有一个头节点和尾节点,所以在遍历的时候可以依次沿着每一个节点进行递归,而且在新增或者删除的时候,直接移动指针即可,并且每一个节点在内存中并不要求是连续的,只需要指针指向对应节点的内存地址即可。
但是 redis 使用的是内存,在内存满了的情况下就会造成 redis 的不可用,需要依据淘汰策略清理内存。
试想下如果 ziplist 像普通的双向链表一样,每一次新增一个 entry 都去申请一块新的内存,实现起来确实比较简单。
String 是 Redis 中的基本数据结构之一,也是日常开发中使用最多的场景,例如秒杀扣库存,token缓存,详情缓存等,使用的频率还是比较高的,但是 Redis 中的 String 实现还是比较复杂的。
String 最底层的数据结构还是 char[],但是 Redis 在对数组进行封装的时候,做了一些细节上的优化
在 Redis 中,每一个 Key 都可以称之为一个对象,Redis 包含了这个 Key 的类型,value 的内存地址,LRU 淘汰时间,引用计数等
1 | struct RedisObject { |
setnx
是 Redis
官方提供的一个分布式原子性锁,它的实现利用了 Redis
在执行命令的时候是一个原子性操作,所以可以实现同一时间只有任务才能获取到锁。
当在同一个 redis
实例中进行加锁的操作的时候,如果加锁成功则会返回1
,如果加锁失败的话,则是直接返回 0
1 | 127.0.0.1:6379> setnx 'redislock' 1 |
如果此时另一个任务想进行加锁的话,则会返回0
:
在进行旧的项目 review 的时候,我发现绝大多数的统计SQL都是基于 count(1)
来进行的,只有一少部分是基于 count(*)
,那么这两种写法到底有什么区别。
mysql中,常用的存储引擎有myisam
和innodb
,但是由于myisam
只支持表级别锁,而且还不支持事物,所以在mysql的5.5版本之后就将默认的存储引擎调整为innodb
。
以下实验基于 Mysql8.0.1
来进行
首先这里准备了一个表.
首先问两个问题:
本次的源代码以及测试的 Mysql 版本均为 8.0.17
在InnoDB里面,是通过快照读来实现RC
和PR
隔离级别的区分,因为在RC
隔离级别下,每一次的select都是一个快照读,所以是可以读取到已经提交的数据,从而导致幻读。所以在RC
隔离级别下,快照读和当前读都是可以出现幻读。
但是在PR
的隔离级别下,由于快照读仅仅只生成一次,所以在PR
级别下的快照读是无法出现幻读的,但是当前读确实可以出现幻读。
查看Mysql官方对于幻读
的定义。
The so-called phantom problem occurs within a transaction when the same query produces different sets of rows at different times.
幻读表示的是在一个事物里面 同一个select
语句,前后两次查询出来的结果是不相同的,需要注意的一点是,在InnoDB里面,幻读跟事物的隔离级别有关,更加准确的说是跟一个事物的快照和当前读有关
下面是在Mysql8.0.11版本下进行幻读的复现: