首页
精选文章反射【Golang】查看全文反射是一种机制,可以在运行时获取操作对象的具体类型,而且通过类型可以获取类的构造,包括成员变量以及成员方法,并且可以动态的调用这些方法或者改变这些变量的值。反射是一种元编程的实现方案。 Golang一般认为是一门静态语言。静态语言是指编译时就可以确定变量的数据类型的语言,大多数静态语言要求在使用变量之前必须声明数据的类型。常见的静态语言有C、C++、Golang等。 PHP、JavaScript、Python、Perl等语言的变量在使用前不需要声明数据类型,在运行时根据被赋值的值类型才确定数据的类型,此类语言称为动态语言。 而通过反射的能力,Golang语言可以动态的改变对象的值,甚至可以动态改变数据类型,所以反射使得Golang语言具备了动态语言的能力。 空接口 Golang 语言是静态类型语言,变量的类型在编译期间就已经确定了。 Golang 对象头部没有类型指针,通过自身无法获得类型信息,反射所需要的全部信息都来源于接口。 在传统的面向对象的语言例如Java中,所有的类都继承自一个基类(Java中称为Object),所以该类可以指向所有的对象。 Golang 弱化了传统编程语言中继承的概念,其多态通过组合方式实现,Golang 语言中不需要显式的绑定继承关系,而是通过该类是否实现了另一个接口中的方法判断该类是否实现了该接口。 所以如果有一个空接口没有任何方法,那么所有的类都可以认为继承了这个空接口。编译器在编译过程中,将全部变量的类型信息(runtime._type或reflect.rtype,两者底层数据结构一样布,可以做类型转换)保存在.rodata节中。 在运行期间,反射可以探知、修改、创建对象的类型信息和内存结构…事务隔离查看全文事务的隔离性是事务的四大特性之一,原子性,持久性,隔离性,一致性。隔离性定义了事务在并发过程中事务操作的结果以及过程是否对并发中的其他事务可见。 事务的隔离级别一般分为读未提交,读已提交,可重复度以及串行化等四个级别。 除了串行化因为定义了对同一条数据的读写只能串行完成,所以不存在对同一条数据的并发问题,显而易见也就不会出现数据可见性的问题。但是串行化因为对于热点数据的锁定严重影响了数据库的性能,随着数据库产品的完善,一般的数据库产品都会提供多种隔离级别让用户选择。 不同隔离级别下可能会出现的数据异常情景分为下列几类: 当前常见的隔离级别对上述异象情况的解决如下: 实现隔离级别一般使用到的技术有互斥锁,读写锁,乐观锁,MVCC。 互斥锁 互斥锁模型,在不同的数据库事务进行数据临界区的时候,需要首先执行加锁操作,只有成功获取锁的事务才能继续执行,否则会先进入等待直到获取锁的事务执行结束,重新请求加锁操作。 互斥锁在串行化隔离级别以及实现写操作的过程中被广泛应用。 读写锁 读写锁分为读锁和写锁,写锁是互斥锁,也就是在写操作执行的过程中,不允许其他操作包括读操作执行,但是读锁是共享的,在没有请求的场景,多个事务可以同时查询同样的数据。 读写锁可以实现读已提交。 乐观锁 相较悲观锁,乐观锁使用了更加乐观的并发机制,或者将事务按照依赖关系进行拓扑排序,或者在提交的时候再延迟校验事务是否可以提交。 基于乐观程度的不同,可以分为以下三个等级: 基于Lock:最悲观的实现,需要在操作开始前,甚至是事务开始前,对要访问的数据库对象加锁,对冲突操作Delay; 基于Timestamp:乐观的实现,每个事务在开始时获得全局递增的时间戳…NewSQL查看全文NewSQL是融合了NoSQL技术的关系型数据库,其主要目标是为了解决一致性和分区容忍性。Nosql数据库的目标是为了解决大规模数据的存储问题,所以分区容忍性是其主要的设计目标,但是对于关系型数据库而言,一致性是基本的要求。 NewSQL 尝试同时满足NoSQL数据库和关系型数据库的优点(ACID和水平扩展性),目前是大数据领域的解决方案之一。 NewSQL数据库的特性一般包括如下特性: 基于内存的数据存储和数据处理提供较快的处理速度。 通过分区将数据库切分成若干分片的单元,查询在多个单元同时执行并且合并为查询结果。 支持事务。 一般通过二级索引提供更快的信息检索速度。 通过复制技术实现高可用。 通过内置的容灾机制提供更快的容灾恢复时间。 NewSQL和SQL以及NoSQL的区别。 面向内存的设计 传统DBMS采用的面向磁盘的存储结构,数据主要存储在SSD或HDD等块存储设备。块存储设备的读写速度较内存至少慢一个数量级,所以DBMS一般会采用缓冲池的技术将读入的数据块缓在内存中进行缓存,写操作也会利用缓冲池进行缓冲之后批量存储到磁盘来提高效率。相较于内存,磁盘的容量更大,价格更低,面向磁盘的设计成本更低。随着内存成本的大幅度下降,大内存的机器架构可以将数据库中的数据全量或者接近全量的存储在内存中。所以NewSQL采用面向内存的设计可以提升数据库的性能。 H-Store,HyPer,MemSQL、SAP HANA 和VoltDB等NewSQL数据库都采用了面相内存的设计模式。 面向内存的设计一般将热点数据存储在内存中,将不活跃的数据转移到磁盘存储,该架构的实现方案有如下几种: 建立跟踪机制发现内存中不活跃的记录,将其转移到外存进行存储… |
热门分类开源Golang消息队列JavaJavascriptLinuxMysqlNLPPHP事务内存管理分布式理论分类存储常用存储开源软件操作系统画图网络编程数据库算法虚拟化前端存储理论常用算法微服务数据结构算法应用计算机原理中间件共识算法分布式分治动态规划容器并发排序架构组件绘图工具网络协议编程语言理论算法思想树缓存架构C++字符串算法工程思想搜索
算法题库精选内容 |