1. 概述

跳跃表是一种数据结构。它允许快速查询一个有序连续元素的数据链表。跳跃表的平均查找和插入时间复杂度都是O(logn),优于普通队列的O(n)。快速查询是通过维护一个多层次的链表,且每一层链表中的元素是前一层链表元素的子集。一开始时,算法在最稀疏的层次进行搜索,直至需要查找的元素在该层两个相邻的元素中间。这时,算法将跳转到下一个层次,重复刚才的搜索,直到找到需要查找的元素为止,跳跃表示意图如下所示。 skip-list 从图中可以看到, 跳跃表主要由以下部分构成:

  • 表头(head):负责维护跳跃表的节点指针;
  • 跳跃表节点:保存着元素值,以及多个层。
  • 层:保存着指向其他元素的指针,高层的指针越过的元素数量大于等于低层的指针,为了提高查找的效率,程序总是从高层先开始访问,然后随着元素值范围的缩小,慢慢降低层次。
  • 表尾:全部由 NULL 组成,表示跳跃表的末尾。

本篇文章将以redis中的跳跃表为例进行介绍,代码用java进行了重写,为方便看懂,简化了部分流程。

阅读全文 »

1. 概述

红黑树(Red–black tree)是一种平衡二叉查找树,它可以在 O(logn)时间内完成查找,插入和删除,这里的n是树中元素的数目,我们首先介绍下二叉查找树。

二叉查找树(Binary Search Tree),也称为二叉搜索树、有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:

  • 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
  • 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
  • 任意节点的左、右子树也分别为二叉查找树;
  • 没有键值相等的节点。
阅读全文 »

在Java中,ScheduledThreadPoolExecutor主要作用是执行延时及周期性任务,这篇文章主要分析以下几个问题:1)任务是如何存储的?2)延时及周期性任务什么时候执行及如何执行?3)任务怎么进行取消?带着这些问题我们继续往下看。

阅读全文 »

之前在讲ReentrantLock时,在Java中实现线程的同步与互斥,除了JUC中提供的各种锁,还可以使用snchronized关键字,它被用于方法及方法块中,在JDK1.6之前,synchronized是基于monitor锁对象来实现的,而moniter对象是基于操作系统的futex来实现的,相对比较重量级,这种锁也被称为“重量级锁”。所以,在JDK1.6之后,JDK对synchronized进行了种种优化,为了减少获得锁和释放锁所带来的性能消耗,提高性能,引入了“轻量级锁”和“偏向锁”。

阅读全文 »

在Java中要实现资源的互斥访问及线程间的同步,一般有两种方式,一种是通过synchronized(同步块或同步方法)结合Oject.wait()及Object.signal()来实现,另外一种是通过ReentrantLock和Condition来实现。为了解决不同条件下的并发问题,Java还引入了一些高级锁和同步机制,如Semaphore,ReentrantReadWriteLock,CountDownLatch和CyclicBarrier等等。

在项目开发中,用ReentrantLock相对较多,但对其的理解程序仅限于Java语言层面,对于JVM及操作系统的底层实现并没有了解,没有一个全局的概念,相关知识点存在断层,如ReentrantLock在JVM和操作系统中到底对应什么实体?等待队列存储在什么地方?线程的等待及唤醒对应什么样的操作?JVM及操作系统在ReentrantLock中提供了什么样的功能?正好在学习操作系统的知识,把这些知识重新梳理下,打通认知上的盲点。

阅读全文 »

Memcached是一个基于内存的缓存系统,存储的是key/value的键值对,与Redis类似。不过相对于Redis,值是无类型的字节数组(类比于Reidis中的String类型)。在Reidis中构建了一个对象系统来存储键值对,Memcached内部是如何处理的?抱着这份好奇心来分析下Memcached的内存模型。

阅读全文 »

Redis是一个key-value类型的数据库,key可以是整数或者字符串,value可以支持丰富的数据结构,如字符串、列表、哈希、集合及有序集合。在Redis中,对这些数据结构统一进行了封装,都是以redis对象(redisObject)来呈现,这篇文章主要是对redisObect内部原理及实现做一些梳理,内容主要基于《Redis设计与实现》。

阅读全文 »

Redis中有丰富的数据结构,如简单动态字符串、链表、字典、跳跃表、整数集合及压缩列表,基于这些数据结构,封装了一套对象系统,供用户使用,这篇文章主要是对这些数据结构进行了一个总结及加深理解。

阅读全文 »

环境说明: JDK:1.8.0_111 Tomcat:8.5.40 Cas-Server:5.3.9 Template:thymeleaf

搭建一个基本的CAS服务器过程如下:

  • 下载CAS Overlay template,以5.3.9版本为例: 地址为:https://github.com/apereo/cas-overlay-template/tree/5.3

  • 配置SSL环境;

  • 自定义登录页面;

  • 自定义用户鉴权;

  • 加入验证码;

  • 自定义登录错误信息;

阅读全文 »
0%