05 2017 档案

摘要:三叉链表示的二叉树定义所畏的三叉链表示是指二叉树由指向左孩子结点、右孩子结点、父亲结点【三叉】的引用(指针)数据和数据组成。 package datastructure.tree.btree; /** * 三叉链表示的二叉树定义 * @author Administrator * */ public 阅读全文
posted @ 2017-05-27 14:33 牛头人 阅读(1463) 评论(0) 推荐(1)
摘要:算法概述递归算法简洁明了、可读性好,但与非递归算法相比要消耗更多的时间和存储空间。为提高效率,我们可采用一种非递归的二叉树遍历算法。非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似。对于中序遍历来说,非递归的算法比递归算法的效率要高的多。其中序遍历算法的实现的过程如下:(1).初始化 阅读全文
posted @ 2017-05-27 14:30 牛头人 阅读(1315) 评论(0) 推荐(0)
摘要:定义最多有两棵子树的有序树,称为二叉树。二叉树是一种特殊的树。递归定义:二叉树是n(n>=0)个有限结点构成的集合。N=0称为空二叉树;n>0的二叉树由一个根结点和两互不相交的,分别称为左子树和右子树的二叉树构成。二叉树中任何结点的第1个子树称为其左子树,左子树的根称为该结点的左孩子;二叉树中任何结 阅读全文
posted @ 2017-05-27 14:26 牛头人 阅读(7771) 评论(0) 推荐(1)
摘要:树定义和基本术语定义树(Tree)是n(n≥0)个结点的有限集T,并且当n>0时满足下列条件: (1)有且仅有一个特定的称为根(Root)的结点; (2)当n>1时,其余结点可以划分为m(m>0)个互不相交的有限集T1、T2 、…、Tm,每个集Ti(1≤i≤m)均为树,且称为树T的子树(SubTre 阅读全文
posted @ 2017-05-27 10:51 牛头人 阅读(45311) 评论(2) 推荐(0)
摘要:概述程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。递归有直接递归和间接递归•直接递归:函数在执行过程中调用本身。•间接递归:函数在执行过程中调用其它函数再经过这些函数调用本身。•表达方式: •递归算法有四个特性:(1)必须有可最终达到的终止条件,否 阅读全文
posted @ 2017-05-27 10:33 牛头人 阅读(774) 评论(0) 推荐(0)
摘要:(堆)栈概述栈是一种特殊的线性表,是操作受限的线性表栈的定义和特点•定义:限定仅在表尾进行插入或删除操作的线性表,表尾—栈顶,表头—栈底,不含元素的空表称空栈•特点:先进后出(FILO)或后进先出(LIFO)栈的结构,如下图所示: 线性表的操作主要包括:(1)清空(堆)栈(2)判断是否为空(3)元素 阅读全文
posted @ 2017-05-27 10:28 牛头人 阅读(807) 评论(0) 推荐(0)
摘要:redis主从复制配置原理 通过过持久化功能,Redis保证了即使在服务器重启情况下也不会损失数据,但由于数据存储在一台服务器上,服务器的硬盘出现故障也会导致数据丢失。为了避免单点故障,希望将数据库复制多个副本以部署在不同的服务器上,即使有一台服务器出现故障其他服务器依然可以继续提高服务。要求当一台 阅读全文
posted @ 2017-05-26 17:05 牛头人 阅读(1665) 评论(0) 推荐(1)
摘要:Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 客户端可以订阅任意数量的频道。 下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系: 阅读全文
posted @ 2017-05-25 16:35 牛头人 阅读(312) 评论(0) 推荐(0)
摘要:作为缓存系统都要定期清理无效数据,就需要一个主键失效和淘汰策略.在Redis当中,有生存期的key被称为volatile。在创建缓存时,要为给定的key设置生存期,当key过期的时候(生存期为0),它可能会被删除。1、影响生存时间的一些操作生存时间可以通过使用 DEL 命令来删除整个 key 来移除 阅读全文
posted @ 2017-05-25 16:06 牛头人 阅读(433) 评论(0) 推荐(0)
摘要:概述在实际开发过程中经常会遇到一些有时效性数据,比如限时优惠活动,缓存或者验证码之类的。过了一段时间就需要删除这些数据。在关系型数据库中一般都要增加一个字段记录数据的到期时间,然后周期性地检查过期数据然后删除。Redis本身就对键过期提供了很好的支持。Redis过期机制在Redis中可以使用EXPI 阅读全文
posted @ 2017-05-25 15:57 牛头人 阅读(22000) 评论(0) 推荐(0)
摘要:一、相关命令1. MULTI用于标记事务块的开始。Redis会将后续的命令逐个放入队列中,然后才能使用EXEC命令原子化地执行这个命令序列。这个命令的运行格式如下所示:MULTI这个命令的返回值是一个简单的字符串,总是OK。2. EXEC在一个事务中执行所有先前放入队列的命令,然后恢复正常的连接状态 阅读全文
posted @ 2017-05-25 15:34 牛头人 阅读(195) 评论(0) 推荐(0)
摘要:1、前言最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据。由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。redis提供两种方式进行持久化,一种是 阅读全文
posted @ 2017-05-25 11:29 牛头人 阅读(248) 评论(0) 推荐(0)
摘要:Redis目前支持5种数据类型 分别是:1.String(字符串)2.List(列表)3.Hash(字典)4.Set(集合)5.Sorted Set(有序集合)下面就分别介绍这五种数据类型及其相应的操作命令。1. String(字符串)String是简单的 key-value 键值对,value 不 阅读全文
posted @ 2017-05-25 10:43 牛头人 阅读(312) 评论(0) 推荐(0)
摘要:连接操作相关的命令 默认直接连接 远程连接-h 192.168.1.20 -p 6379 ping:测试连接是否存活如果正常会返回pong echo:打印 select:切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值 quit:关闭连接(connection) a 阅读全文
posted @ 2017-05-17 09:45 牛头人 阅读(221) 评论(0) 推荐(0)
摘要:线程池的作用:线程池作用就是限制系统中执行线程的数量。 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排 队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一 阅读全文
posted @ 2017-05-16 16:12 牛头人 阅读(365) 评论(0) 推荐(0)
摘要:一 .Amazon S3介绍 Amazon Simple Storage Service (Amazon S3) 是一种对象存储,它具有简单的 Web 服务接口,可用于在 Web 上的任何位置存储和检索任意数量的数据。它能够提供 99.999999999% 的持久性,并且可以在全球大规模传递数万亿对 阅读全文
posted @ 2017-05-11 11:47 牛头人 阅读(25162) 评论(0) 推荐(2)
摘要:队列概述队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。–队尾(rear)——允许插入的一端–队头(front)——允许删除的一端队列特点:先进先出(FIFO 阅读全文
posted @ 2017-05-08 16:01 牛头人 阅读(467) 评论(0) 推荐(0)
摘要:线性表概述线性表是最基本、最简单、也是最常用的一种数据结构。在线性表中数据元素之间的关系是线性,数据元素可以看成是排列在一条线上或一个环上。线性表分为静态线性表和动态线性表,常见的有顺序表(静态的)、单向链表(动态的)和双向链表(动态的)。线性表的操作主要包括:(1)计算表的长度n。(2)线性表是否 阅读全文
posted @ 2017-05-08 15:30 牛头人 阅读(1048) 评论(0) 推荐(0)
摘要:Java中有几种常用的数据结构,主要分为Collection和map两个主要接口(接口只提供方法,并不提供实现),而程序中最终使用的数据结构是继承自这些接口的数据结构类。 一、几个常用类的区别 1.ArrayList: 元素单个,效率高,多用于查询 2.Vector: 元素单个,线程安全,多用于查询 阅读全文
posted @ 2017-05-08 11:36 牛头人 阅读(19383) 评论(0) 推荐(0)
摘要:Java 多线程编程 Java 给多线程编程提供了内置的支持。一个多线程程序包含两个或多个能并发运行的部分。程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径。多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。这里定义和线程相关的另一个术语: 进程:一个进程包括由操作系统 阅读全文
posted @ 2017-05-08 10:58 牛头人 阅读(395) 评论(0) 推荐(0)
摘要:一、归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。 归并排序示例: 合并方法: 设r[i…n]由两个有序子表r[i…m]和r[m+1…n]组成,两个子表长度 阅读全文
posted @ 2017-05-05 07:21 牛头人 阅读(450) 评论(0) 推荐(0)
摘要:一、选择排序 1、基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。 2、实例 3、算法实现 二、插入排序 1、基本思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的 阅读全文
posted @ 2017-05-05 07:19 牛头人 阅读(281) 评论(0) 推荐(0)
摘要:冒泡排序 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地 进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 冒泡排序的算法实现如下:【排序后 阅读全文
posted @ 2017-05-05 07:14 牛头人 阅读(334) 评论(0) 推荐(0)
摘要:spring的MVC执行原理 1.使用Spring的IOC容器,将对象之间的依赖关系交给Spring,降低组件之间的耦合性,让我们更专注于应用逻辑 3.AOP的很好支持,方便面向切面编程。 5.Spring DI机制降低了业务对象替换的复杂性。 7.Spring的高度可开放性,并不强制依赖于Spri 阅读全文
posted @ 2017-05-04 17:43 牛头人 阅读(571) 评论(0) 推荐(0)
摘要:1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 2反射机制能做什么 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的 阅读全文
posted @ 2017-05-04 17:21 牛头人 阅读(219) 评论(0) 推荐(0)
摘要:在操作系统中,信号量是个很重要的概念,它在控制进程间的协作方面有着非常重要的作用,通过对信号量的不同操作,可以分别实现进程间的互斥与同步。当然它也可以用于多线程的控制,我们完全可以通过使用信号量来自定义实现类似Java中的synchronized、wait、notify机制。 Java并发包中的信号 阅读全文
posted @ 2017-05-04 16:51 牛头人 阅读(535) 评论(0) 推荐(0)
摘要:CyclicBarrier(又叫障碍器)同样是Java 5中加入的新特性,使用时需要导入Java.util.concurrent.CylicBarrier。它适用于这样一种情况:你希望创建一组任务,它们并发地执行工作,另外的一个任务在这一组任务并发执行结束前一直阻塞等待,直到该组任务全部执行结束,这 阅读全文
posted @ 2017-05-04 16:48 牛头人 阅读(153) 评论(0) 推荐(0)
摘要:简单使用Lock锁 Java 5中引入了新的锁机制——Java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作。Lock接口有3个实现它的类:ReentrantLock、ReetrantReadWriteLock.Rea 阅读全文
posted @ 2017-05-04 16:43 牛头人 阅读(534) 评论(0) 推荐(0)
摘要:阻塞队列 阻塞队列是Java 5并发新特性中的内容,阻塞队列的接口是Java.util.concurrent.BlockingQueue,它有多个实现类:ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、S 阅读全文
posted @ 2017-05-04 16:40 牛头人 阅读(291) 评论(0) 推荐(0)
摘要:Executor框架简介 在Java 5之后,并发编程引入了一堆新的启动、调度和管理线程的API。Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java 阅读全文
posted @ 2017-05-04 16:35 牛头人 阅读(294) 评论(0) 推荐(0)
摘要:主内存与工作内存 java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量主要是指共享变量,存在竞争问题的变量。Java内存模型规定所有的变量都存储在主内存中,而每条线程还有自己的工作内存,线程的工作内存中保存了该线程使用到的 阅读全文
posted @ 2017-05-04 16:26 牛头人 阅读(298) 评论(0) 推荐(0)
摘要:happen—before规则介绍 Java语言中有一个“先行发生”(happen—before)的规则,它是Java内存模型中定义的两项操作之间的偏序关系,如果操作A先行发生于操作B,其意思就是说,在发生操作B之前,操作A产生的影响都能被操作B观察到,“影响”包括修改了内存中共享变量的值、发送了消 阅读全文
posted @ 2017-05-04 16:20 牛头人 阅读(253) 评论(0) 推荐(0)
摘要:加锁和volatile变量两者之间的区别: 1、volatile变量是一种稍弱的同步机制在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比synchronized关键字更轻量级的同步机制。 2、从内存可见性的角度看,写入volatile变量相当 阅读全文
posted @ 2017-05-04 16:15 牛头人 阅读(4939) 评论(0) 推荐(0)
摘要:加锁(synchronized同步)的功能不仅仅局限于互斥行为,同时还存在另外一个重要的方面:内存可见性。我们不仅希望防止某个线程正在使用对象状态而另一个线程在同时修改该状态,而且还希望确保当一个线程修改了对象状态后,其他线程能够看到该变化。而线程的同步恰恰也能够实现这一点。 内置锁可以用于确保某个 阅读全文
posted @ 2017-05-04 16:10 牛头人 阅读(317) 评论(0) 推荐(0)
摘要:生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据。 这里实现如下情况的生产--消费模型: 生产者不断交替地生产两组数据“姓名--1 --> 内容--1”,“姓名--2--> 内容--2”,消费者不断交替地取得这两组数据,这 阅读全文
posted @ 2017-05-04 16:08 牛头人 阅读(351) 评论(0) 推荐(0)
摘要:在java中,可以通过配合调用Object对象的wait()方法和notify()方法或notifyAll()方法来实现线程间的通信。在线程中调用wait()方法,将阻塞等待其他线程的通知(其他线程调用notify()方法或notifyAll()方法),在线程中调用notify()方法或notify 阅读全文
posted @ 2017-05-04 16:03 牛头人 阅读(288) 评论(0) 推荐(0)
摘要:当线程需要同时持有多个锁时,有可能产生死锁。考虑如下情形: 线程A当前持有互斥所锁lock1,线程B当前持有互斥锁lock2。接下来,当线程A仍然持有lock1时,它试图获取lock2,因为线程B正持有lock2,因此线程A会阻塞等待线程B对lock2的释放。如果此时线程B在持有lock2的时候,也 阅读全文
posted @ 2017-05-04 16:01 牛头人 阅读(202) 评论(0) 推荐(0)
摘要:在集合API中,最初设计的Vector和Hashtable是多线程安全的。例如:对于Vector来说,用来添加和删除元素的方法是同步的。如果只有一个线程与Vector的实例交互,那么,要求获取和释放对象锁便是一种浪费,另外在不必要的时候如果滥用同步化,也有可能会带来死锁。因此,对于更改集合内容的方法 阅读全文
posted @ 2017-05-04 16:00 牛头人 阅读(203) 评论(0) 推荐(0)
摘要:在并发编程中,多线程同时并发访问的资源叫做临界资源,当多个线程同时访问对象并要求操作相同资源时,分割了原子操作就有可能出现数据的不一致或数据不完整的情况,为避免这种情况的发生,我们会采取同步机制,以确保在某一时刻,方法内只允许有一个线程。 采用synchronized修饰符实现的同步机制叫做互斥锁机 阅读全文
posted @ 2017-05-04 15:55 牛头人 阅读(387) 评论(0) 推荐(0)
摘要:Java中实现多线程有两种方法:继承Thread类、实现Runnable接口,在程序开发中只要是多线程,肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下优势: 1、可以避免由于Java的单继承特性而带来的局限; 2、增强程序的健壮性,代码能够被多个线程 阅读全文
posted @ 2017-05-04 15:53 牛头人 阅读(1149) 评论(0) 推荐(1)
摘要:volatile用处说明 在JDK1.2之前,java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变得非常重要。 在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不 阅读全文
posted @ 2017-05-04 15:50 牛头人 阅读(484) 评论(0) 推荐(0)
摘要:守护线程 JAVA中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 用户线程即运行在前台的线程,而守护线程是运行在后台的线程。 守护线程作用是为其他前台线程的运行提供便利服务,而且仅在普通、非守护线程仍然运行时才需要,比如垃圾回收线程就是一个守护线程。当VM检 阅读全文
posted @ 2017-05-04 15:24 牛头人 阅读(361) 评论(0) 推荐(0)
摘要:挂起和恢复线程 Thread 的API中包含两个被淘汰的方法,它们用于临时挂起和重启某个线程,这些方法已经被淘汰,因为它们是不安全的,不稳定的。如果在不合适的时候挂起线程(比如,锁定共享资源时),此时便可能会发生死锁条件——其他线程在等待该线程释放锁,但该线程却被挂起了,便会发生死锁。另外,在长时间 阅读全文
posted @ 2017-05-04 15:20 牛头人 阅读(494) 评论(0) 推荐(0)
摘要:使用interrupt()中断线程 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回。这里需要注意的是,如果只是单纯的调用interrupt()方法,线程并没有实际被中断,会继续往下执行。 阅读全文
posted @ 2017-05-04 15:13 牛头人 阅读(197) 评论(0) 推荐(0)
摘要:# redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位, # 通常的格式就是 1k 5gb 4m 等: # # 1k => 1000 bytes # 1kb => 1024 bytes # 1m => 1000000 bytes # 1mb => 1024*1024 阅读全文
posted @ 2017-05-04 11:34 牛头人 阅读(462) 评论(0) 推荐(0)
摘要:全局操作:#查看所有keykeys * 或 keys "*"#查看匹配前缀的keyskeys "miao*"#清空redisflushdb#随机取出一个keyrandomkey#查看key的类型type key#查看数据库中key的数量dbsize#查看服务器信息info#查看redis正在做什么m 阅读全文
posted @ 2017-05-03 16:35 牛头人 阅读(10015) 评论(0) 推荐(1)
摘要:关闭防火墙:systemctl stop firewalld.service #停止firewallsystemctl disable firewalld.service #禁止firewall开机启动firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开 阅读全文
posted @ 2017-05-02 17:00 牛头人 阅读(30968) 评论(0) 推荐(1)
摘要:Redis官方网网站是:http://www.redis.io/ 。Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的Web应用程序。Redis有三个主要特点,使它优越于其它键值数据存储系统 :a.Redis将其数据库完全保存在内存中,仅使用磁盘进行持久化。b.与其它 阅读全文
posted @ 2017-05-02 11:59 牛头人 阅读(253) 评论(0) 推荐(0)