2017-11-30
对象关系映射(ORM)可以建立类和数据库表直接的映射,一个类实例可以映射到这张表中的一个行。通过这样的模型,直接在编程语言层面对对象的操作就可以映射到对数据库管理系统(RDBMS)的操作。从开发的角度看,ORM免去了编写各种tables和CRUD SQL语句的麻烦。
阅读全文
2017-11-29
链表似乎是数据结构中最简单,使用过程式语言实现链表的思路一般是:定义结点,通过指针把结点连接起来。然后在这链表上通过大量的指针操作实现插入、删除、定位等功能,甚至,在链表上添加一层抽象,把添加head、tail、len变量分别快速确定头结点、尾结点和链表长度。实践表面,这是一种高效的方法。但如果换个思路,实现链表就马上变得困难了—使用函数式,难点在于结点和结...
阅读全文
2017-11-28
协程是用户空间线程又叫绿色线程,使用协程的好处是可以实现自己的协程调度器,另外是协程非常轻量。但由于协程对操作系统是透明的,所以协程无法实现真正的并行运行。因此协程通常用于I/O密集性的处理。那么如何实现一个协程调度器呢?这就是本文的话题。
阅读全文
2017-11-24
上篇写到C语言中的迭代器,今天写写Go语言中实现迭代器模式的方法。Go语言称为next C,在实现迭代器上,完全可以使用C语言中的思路,语法上更简练。但这里不使用这种经典的方式,而是使用Go语言本身带有的特性。我们会使用它的channel特性、goroutine特性和闭包特性。为了简单表达,这里的实现依旧使用双链表,如果要迭代更复杂的数据结构,比如树型结构...
阅读全文
2017-11-10
说到关系型数据库的事务我们一定会想到ACID特性,在实际开发发现ACID特性的约束太大了。例如在分布式情景下,C 一致性(Consistent)往往要牺牲性能为代价,同时又有CAP的约束(CAP可参看谈谈CAP定理 )。实际的业务可能对性能要求很高或者业务对数据不需要强一致性。这样,我们可以考虑系统的BASE特性。今天就细聊ACID、BASE及其对比。
阅读全文
2017-11-10
常见的LRU算法的实现方式是:一条双链表+HashMap。旧文LRU算法的实现(Python版)和Go实现LRU算法、LRU算法的实现(Java版)讨论和实现过LRU算法。采用的思路都是一条双链表以时间戳大小排序组织排序数据,HashMap快速定位根据键指定的数据。
忽略实现的具体编程语言,这样的实现思路在特性场景下是有问题的。今天就来讨论如何优化LRU算法...
阅读全文
2017-11-01
遇到一道有趣的问题:把二叉搜索树转换成排序的双向链表。分享下思路,感受转换过程的优雅。先前写过二叉树的遍历和二叉树迭代器和二叉搜索树的原理、实现和应用。通过这两篇文章马上可以得到思路。
思路:建立二叉搜索树,为其添加中序遍历迭代器,迭代二叉树,树结点以键有序输出,把结点的left指针看做是链表结点prev指针,类似地,结点right指针看做是链表结点next...
阅读全文
2017-10-26
之前写到基于CAS实现的锁,也写过各类语言实现单例模式,其中包括线程安全的实现和线程不安全的实现。线程安全的实现大致思路都是加锁,其中性能较好的是double-check的加锁方法。另外对于Java可以使用synchronized实现封锁,它本质上也是使用了锁;还有一类方式是使用静态内部类,由于类的加载机制,这样实现的单例模式也是线程安全的。类的加载机制也是...
阅读全文
2017-10-25
好久没有更新博客了,这两个月发生的几件事情耽误了很多计划,现在总算慢慢步入正轨…今天写写平时在并发编程中使用锁的实现原理。本文以Java和Go语言为例。
Java和Go语言中的锁都是基于CAS实现,CAS就是比较和交换(Compare And Set)这是一个原子过程,需要硬件层面提供支持,在汇编上涉及核锁。
Java中java.util.concurren...
阅读全文
2017-09-27
前文写到Go和Python实现LRU算法及LRU算法的相关讨论,本文讲述使用Java实现LRU算法。Java自带的集合框架非常强大,实现LRU算法可以直接使用LinkedHashMap集合框架。关于LRU算法的原理见Go实现LRU算法 ,Python实现的LRU算法见LRU算法的实现(Python版)。
实现首先我们谈谈LinkedHashMap。它的一个...
阅读全文
2017-09-22
Python的一个重要语法特性是装饰器,它本身还提供了’@’这样优雅的语法糖使用装饰器。装饰器本质上是闭包的一个应用。Go支持闭包,也就可以说Go也支持装饰器,只是Go编译器提供的“糖”太小了,不能像Python一样优雅地使用装饰器。但,这并不阻碍我们使用装饰器这个方便的特性。
阅读全文
2017-09-17
LRU算法是一种页面置换算法。常见的页面置换算法包括:random、FIFO、LRU、LFU。
采用随机random的置换算法效率并不好,没有利用好页面置换调度序列的信息,更加没有考虑程序的局部性原理。
FIFO实现简单,但没有利用好程序的局部性原理,会出现Belady现象。Belady现象指系统分配的页面数增加了,可是缺页率依然在增加。可以配合程序的局部性...
阅读全文
上一页 1 … 7 8 9 10 11 … 13 下一页