非唯一索引加锁规则实操
主要是看了小林coding发现对于非唯一索引的情况下跟正常的思路不大一样,特此实验一下
前要知识#小林coding-非唯一索引加锁规则
select * from performance_schema.data_locks; 用来查询锁的情况
lock_data 表示锁住的数据,第一个是二级索引的数据,第二个是主键索引的数据
lock_mode 表示 IX = 意向锁 X = next-key lock ….
lock_type 表示 行级锁还是表锁
非唯一索引范围查询#环境配置#123456789101112131415CREATE TABLE test ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, age INT, email VARCHAR(100) UNIQUE);INSERT INTO test (id , name , age, email)VALUES(1, 'Alice', 25, 'alice@example.com'),(3 ,& ...
操作系统概论
操作系统的概念#操作系统 是指控制和管理整个计算机系统的硬件和软件资源,并合理地到调度计算机工作和资源,以提供用户和其他软件方便的接口和环境;他是计算机系统中最基本的系统软件
简单说就是 操作系统是管理系统资源的软件
操作系统提供的功能#
处理机管理
存储器管理
文件管理
设备管理
操作系统向上提供的服务#
GUI 点点点
命令接口
联机命令接口: cmd 交互式命令
脱机命令接口: 一个可以运行的文件
程序接口: 系统调用
操作系统的特征#并发,共享,虚拟,异步
并发
单核CPU同一时刻只能执行一个程序,但是由于有并发在,可以在微小的时间内交互进行,从而实现人类视角意义上的”并行“
共享(宏观的同时,微观上还是并发访问)
互斥共享方式
一个时间段内只允许一个进程访问该资源(微信摄像头)
同时共享方式
允许一个时间段内由多个进程同时访问(比如说同时向微信和QQ上传同一个文件)
虚拟
虚拟是将物理上的实体变为逻辑意义上的对应物(也就是人们感受到的)
空分复用技术(虚拟存储器技术)
时分复用技术(虚拟处理器)
异步
由于资源有限,进程的执行不是一贯到底,会 ...
版本回退
如何进行版本回退
回滚ci#直接回滚ci,但是main分支的代码不会修改
reset#git reset 会把版本回退到某一个 Head~
然后我们要了解三个区
工作目录
暂存区(Index)
HEAD
本地的代码区域
add加入的地方
commit后的地方
然后 reset 有三个模式
--soft
Files won’t change, differences will be staged for commit.
--mixed
Files won’t change, differences won’t be staged,
--hard
Files will be reverted to the state of the selected commit.
其实从英语的意思上就可以看出,越严格撤回的越多
1234git reset --mixed <commit-id>git reset --mixed <branch-name>git reset --mixed <tag-name>git reset --mix ...
Lua
学习一下Lua脚本x
数据类型#
据类型
描述
nil
无效值,比较时应该加上引号,同时会把nil看作false
boolean
true - false
number
双精度浮点数
string
字符串,’hello’ | ‘hello’ ; 使用 [[ ]] 表示多行字符串
function
函数
userdata
自定义类型
thread
线程
table
关联数组,索引可以是数组或字符串,索引默认从1开始;可以表示数组、列表、字典、集合、哈希表; table 是可扩展的,可以随时添加或删除元素。
变量#
变量默认值为nil
Lua 中的变量全是全局变量,哪怕是语句块或是函数里,除非用 local 显式声明为局部变量
赋值参考golang的赋值
连接字符串: a = "hello" .. "world"
没有赋到值的默认使用nil
#len 表示数组,表的长度
循环#
while
1234while(condition)do statementsend
for
这里默认就是起始值+最终值,然 ...
二刷Redis命令
#Set#12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758-- set o(1)SET key value-- mset mget 多条set一起执行,可以减少网络开销 o(n)set number "10086"set book "today is a nice day"-- key不存在时创建, key存在时覆盖set book "today is a nice2 day"-- key不存在时操作失败,key存在时覆盖set book "today is a nice day" nx-- key存在时覆盖, 不存在时操作失败set book "today is a nice day" xx-- key存在时返回值, 不存在时返回nilget book-- 获取旧值并设置新值(如果key存在覆盖;不存在创建)getset ...
图论
图论##给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
1234567输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"], ["0","0","0","0","0"]]输出:1
示例 2:
1234567输入:grid = [ ["1",& ...
分布式锁
场景#现在有一个场景:
我们需要在pinnacle中跑定时任务来关闭未关闭的房间以及进行plan状态的轮转
如果只有一个机器下,我使用下面这个代码来执行操作,看起来是没什么问题的
12345678wg.Add(1)for _ , plan range plans { go func(){ closePlan() wg.Done() }()}wg.Wait()
但是如果我们有多个 replicas 那么,假设有 replicas:5,那么有可能每个副本机器会同时来执行关闭closePlan的操作,这样子带来的结果就是数据库中表数据的不一致性以及其他方面的不一致性,严重灾难!
因此我们需要使用分布式锁来保证一个定时任务在一段时间内只能由一个机器来执行这个定时任务
也就是在多实例情况下实现单实例操作
说人话:上厕所,一个坑位只能上一个人,这个人上的时候其他人都得等着
思考过程#ok ,那么我们来一步步推导分布式锁的书写逻辑
我们如何保证在一段时间内只能由一个机器来执行?#
我们可以上锁,这里使用了最简单的 ...
重新学习regex
测试网站
. 表示除了换行符之外的任意一个字符
[] 表示匹配集合中的任意一个字符
[1-2] 表示表示匹配集合中一到二的数,左闭右闭
[0-1a-zA-Z] 表示匹配 0-1 ,a-z , A-Z 集合中的数
[^]表示取反,^只有在[]内部才表示取反
[^a-z] 表示匹配除了小写字母的数据
[^a-z1-9A-Z] 表示出了小写字母,大写字母,1-9之外的数据
预定义字符类:
\d 表示数字
\D 表示非数字
\w 表示字母,数字,下划线
\W 表示非(字母数字下划线)
\s 表示空白字符和Tab
\S 表示非(空白字符和Tab)
位置和边界匹配
^ 表示匹配每一行的开头(在<>外面)
/^a/ 表示匹配单行a开头的string
$ 表示匹配每一行的结尾
/a$/ 表示匹配单行a结尾的string
\ 转义 \. 就表示一个点
\bin 只匹配在单词开头的字符in
in\b只匹配在单词结尾的字符in
\Bin\B 匹配非边界的字符in
量词
at+ 表示t重复了一次或多次
at* 表示t重复了零次或多次
at? ...