首页

来自智得网
跳转至: 导航、​ 搜索

精选文章

分布式锁查看全文
分布式锁的实现类型.png
在单机环境下,锁一般通过CAS方式实现,通过锁定的时机或者范围一般分为悲观锁和乐观锁,在操作开始之前执行锁定操作一定成为称之为悲观锁,在提交的时候才可以加锁进行校验成为乐观锁。

在集群环境下,本机锁无法和集群内其他节点实现互斥,会出现业务逻辑错误,分布式锁就是集群场景下可以实现互斥能力的结构体。 锁的实现例如CAS本质上还是通过修改共享数据来实现的,所以分布式锁的本质也是修改分布式场景下的共享数据。 根据共享数据的不同,分布式锁可以通过Redis,数据库,Zookeeper等实现。 Redis Redis锁的实现方式是通过Redis客户端向Redis写入数据的方式的方式,通过CAS实现写入的原子性来保证分布式锁实现的。 Redis加锁的命令一般是Redis解锁的命令一般是Redis分布式锁的问题如下,当Master节点不可用的时系统自动切换Slave(failover),但由于Redis的主从复制(replication)异步的原因,可能导致在failover过程中丧失锁的安全性。例如下面场景的客户端1和客户端2同时持有了同一个资源的锁。 客户端1从Master获取了锁。 Master宕机,存储锁的key还未同步到Slave。 Slave升级为Master。 客户端2从新Master获取到了对应同一个资源的锁。 RedLock RedLock的加锁流程如下: 客户端向N个Redis实例执行加锁操作,统计总耗时为TotalCost 超过半数节点实例成功获取锁,并且锁的有效期大于TotalCost才表明加锁成功 若加锁失败,则释放已成功获取的锁。

若加锁成功,锁的有效时间=锁的超时时间-TotalCost
切片【Golang】查看全文
切片结构图.png
一般编程语言的数组都是静态大小的,由列表等数据结构提供动态大小的线性数据结构。但是Golang语言提供了可以自动扩容的动态数组——切片(Slice),切片支持追加,遍历,截取、随机访问等能力。

Golang中的切片由切片数据结构以及底层数组构成。 Golang的数据结构是一个值类型的结构体,包含的信息如下: 指向底层数组的指针,切片结构体本身不存储数据,数据都存储在底层的数组上。 切片的长度指切片中元素的个数。 切片的容量是指底层数组可以容纳的元素个数。 切片中元素不一定是从数组的起始位置开始的,所以切片的容量不一定是底层数组的长度,而是底层数组长度减去第一个元素的位置。 多个切片可以复用底层的同一个数组,所以对数组中数值的修改会反应在每个应用它的切片上。 当append数据,切片底层的数组长度不足时,会启动扩容的机制,产生一个新的数组,将数据拷贝到新的数组上。 Golang也提供数组类型的数据结构,数组是长度是不可变化的,需要在声明数组的时候确定的长度的值,一般是传入明确的数组长度或者通过数组的值而确定数组的长度。 切片的声明和数组类似,但是不需要传入切片的长度,或者通过make方式构建,此时传入一个初始长度。

切片不能使用“==”进行比较,所以切片不能作为map结构的Key。
事务隔离查看全文
事务的隔离级别.png
事务的隔离性是事务的四大特性之一,原子性,持久性,隔离性,一致性。

隔离性定义了事务在并发过程中事务操作的结果以及过程是否对并发中的其他事务可见。 事务的隔离级别一般分为读未提交,读已提交,可重复度以及串行化等四个级别。 除了串行化因为定义了对同一条数据的读写只能串行完成,所以不存在对同一条数据的并发问题,显而易见也就不会出现数据可见性的问题。但是串行化因为对于热点数据的锁定严重影响了数据库的性能,随着数据库产品的完善,一般的数据库产品都会提供多种隔离级别让用户选择。 不同隔离级别下可能会出现的数据异常情景分为下列几类: 当前常见的隔离级别对上述异象情况的解决如下: 实现隔离级别一般使用到的技术有互斥锁,读写锁,乐观锁,MVCC。 互斥锁 互斥锁模型,在不同的数据库事务进行数据临界区的时候,需要首先执行加锁操作,只有成功获取锁的事务才能继续执行,否则会先进入等待直到获取锁的事务执行结束,重新请求加锁操作。 互斥锁在串行化隔离级别以及实现写操作的过程中被广泛应用。 读写锁 读写锁分为读锁和写锁,写锁是互斥锁,也就是在写操作执行的过程中,不允许其他操作包括读操作执行,但是读锁是共享的,在没有请求的场景,多个事务可以同时查询同样的数据。 读写锁可以实现读已提交。 乐观锁 相较悲观锁,乐观锁使用了更加乐观的并发机制,或者将事务按照依赖关系进行拓扑排序,或者在提交的时候再延迟校验事务是否可以提交。 基于乐观程度的不同,可以分为以下三个等级: 基于Lock:最悲观的实现,需要在操作开始前,甚至是事务开始前,对要访问的数据库对象加锁,对冲突操作Delay;

基于Timestamp:乐观的实现,每个事务在开始时获得全局递增的时间戳…

热门分类

算法题库

精选内容