自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

路漫漫,水迢迢

八十一难拦路七十二变制敌

  • 博客(281)
  • 收藏
  • 关注

原创 数据库连接池原理详解与自定义连接池实现

实现原理数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数制约。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存

2017-05-17 18:18:54 27018 7

原创 ThreadLocal详解

ThreadLocal,即线程变量,是一个以ThreadLocal对象为键、任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的一个值。ThreadLocal源码分析我们看下ThreadLocal几个关键方法get()/** * Returns the value in the current thread's c

2017-05-16 18:30:23 859

原创 Java多线程并发中的双重检查锁定与延迟初始化

双重检查锁定与延迟初始化在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销。双重检查锁定是常见的延迟初始化技术。 下面我们看一个非线程安全的延迟初始化对象的例子:public class Singleton { private static Singleton instance; public static Singleton getInstance()

2017-05-15 18:18:44 1150 2

原创 Java多线程中的内存模型

内存模型在Java中,所有实例域、静态域和数组元素都存储在堆内存中,堆内存在线程之间共享。局部变量(Local Variables),方法定义参数(Java语言规范称之为Formal Method Parameters)和异常处理器参数(ExceptionHandler Parameters)不会在线程之间共享,它们不会有内存可见性问题,也不受内存模型的影响。 Java线程之间的通信由Jav

2017-05-14 19:35:19 2539

原创 Java多线程volatile详解

volatile定义Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。volatile的作用先让我们说说volatile关键字的作用。它在多处理器开发中保证了共享变量的“可见性

2017-05-14 11:06:31 6002 1

原创 Java多线程死锁与资源限制详解

锁是个非常有用的工具,运用场景非常多,因为它使用起来非常简单,而且易于理解。但同时它也会带来一些困扰,那就是可能会引起死锁,一旦产生死锁,就会造成系统功能不可用。死锁的概念那什么是死锁呢?所谓死锁: 是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程

2017-05-13 21:46:54 1707

原创 Java多线程的上下文切换

对于上下文切换不同的操作系统模式也不尽相同,这里我们只讨论Unix系统,在我之前的文章中提到过windows的抢占式,这里就不在赘述。 无论是单核还是多核CPU都是支持多线程代码的,CPU通过给每个线程分配CPU时间片来实这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms) CPU通过

2017-05-13 18:26:18 7234 3

原创 深入剖析Sleep、wait、notify、notifyAll、yield、join、Interrupt

sleep原理sleep是Thread类中的静态方法,首先看下sleep的源码/** * Causes the currently executing thread to sleep (temporarily cease * execution) for the specified number of milliseconds, subject to * the pre

2017-05-13 11:14:46 1849

原创 深入synchronized原理详解

synchronized作用在方法上时,锁住的便是对象实例(this);当作用在静态方法时锁住的便是对象对应的Class实例,因为Class数据存在于永久代,因此静态方法锁相当于该类的一个全局锁;当synchronized作用于某一个对象实例时,锁住的便是对应的代码块。在HotSpot JVM实现中,锁有个专门的名字:对象监视器(monitor)。 synchronized就是针对内存区块

2017-05-12 12:34:28 728 1

原创 史上最全synchronized用法详解

Java中synchronized关键字用于代码的同步执行,他可以修饰代码块、方法、this、Object.class,能够保证在多线程环境中只有线程执行。synchronized作用范围越小并发能力越强,下面我们就各种场景来详解举例说明。多个synchronized(this)代码块并发执行当一个线程访问类中的synchronized(this)的代码块时,该类中的其他synchronized(t

2017-05-11 18:00:43 3360

原创 HTTPS通信过程详解

我们知道普通的Http协议通信是没有对传输数据进行加密,数据在传输过程中很容易被窃取,特别是敏感信息,为了造成不必要的损失我们可以采用HTTPS协议。首先介绍我们的网站怎么启用HTTPSNginx配置HTTPS默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译时指定–with-http_ssl_module参数,安装模块依赖于OpenSSL库和一些引用文件,通常这些文件并不在同一个软件包中

2017-05-10 18:24:13 5082

原创 SpringMVC常用注解详解

先说扫描注解浅析component-scan 默认扫描的注解类型是 @Component,不过,在 @Component 语义基础上细化后的 @Repository, @Service 和 @Controller 也同样可以获得 component-scan 的青睐 有了<context:component-scan>,另一个<context:annotation-config/>标签根本可以移除

2017-05-09 18:27:45 2301

原创 基于Codis的Redis分布式缓存实现

Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有显著区别 , 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务。Codis不

2017-05-03 18:05:16 8708

原创 redis实现HA(High Available)的两种实现方式-Sentinel与Keepalived

Sentinel先来说说Sentinel,Sentinel是redis自带的一种实现HA的方式,如果在实际应用中这种方式用的比较少,比较流行的还是KeepAlived。 Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: ● 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。

2017-05-03 09:31:37 4122

原创 redis集群实现

集群简介Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation)。 Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需要在多个 Redis 节点之间移动数据, 并且在高负载的情况下, 这些命令将降低 Redis 集群的性能, 并导致不可预测的行为。 Redis 集群通过分区(partition)来提供一定程度的可用性

2017-05-02 18:27:17 1022

原创 redis的持久化、备份、容灾

Redis持久化Redis 提供了多种不同级别的持久化方式: ● RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。 ● AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后

2017-04-28 17:51:01 2189

原创 redis主从同步(replication)详解

ReplicationRedis 支持简单且易用的主从复制(master-slave replication)功能, 该功能可以让从服务器(slave server)成为主服务器(master server)的精确复制品。 以下是关于 Redis 复制功能的几个重要方面: ● Redis 使用异步复制。 从 Redis 2.8 开始, 从服务器会以每秒一次的频率向主服务器报告复制流(repl

2017-04-28 17:43:27 7615

原创 redis的事务(transaction)详解

事务(Transaction)MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事务的基础。 事务可以一次执行多个命令, 并且带有以下两个重要的保证: ● 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 ● 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

2017-04-27 18:19:18 3358

原创 redis命令详解与使用场景举例——Server(服务器)

BGREWRITEAOF执行一个 AOF文件 重写操作。重写会创建一个当前 AOF 文件的体积优化版本。 即使 BGREWRITEAOF 执行失败,也不会有任何数据丢失,因为旧的 AOF 文件在 BGREWRITEAOF 成功之前不会被修改。 重写操作只会在没有其他持久化工作在后台执行时被触发,也就是说: ● 如果 Redis 的子进程正在执行快照的保存工作,那么 AOF 重写的操作会被预

2017-04-27 13:46:58 1319

原创 redis命令详解与使用场景举例——Connection(连接)

redis-cli -h url [-p]客户端连接redis -h 指定redis地址 -p 端口号,默认3306AUTH password通过设置配置文件中 requirepass 项的值(使用命令 CONFIG SET requirepass password ),可以使用密码来保护 Redis 服务器。 如果开启了密码保护的话,在每次连接 Redis 服务器之后,就要使用 AUTH 命

2017-04-26 18:40:39 3645

原创 redis命令详解与使用场景举例——Script(脚本)

EVAL script numkeys key [key …] arg [arg …]从 Redis 2.6.0 版本开始,通过内置的 Lua 解释器,可以使用 EVAL 命令对 Lua 脚本进行求值。 script 参数是一段 Lua 5.1 脚本程序,它会被运行在 Redis 服务器上下文中,这段脚本不必(也不应该)定义为一个 Lua 函数。 numkeys 参数用于指定键名参数的个数。

2017-04-26 18:19:02 2439

原创 redis命令详解与使用场景举例——Transaction(事务)

DISCARD取消事务,放弃执行事务块内的所有命令。 如果正在使用 WATCH 命令监视某个(或某些) key,那么取消所有监视,等同于执行命令 UNWATCH 。 可用版本: 2.0.0+ 时间复杂度: O(1)。 返回值: 总是返回 OK 。redis> MULTIOKredis> PINGQUEUEDredis> SET greeting "hello"QUEUEDr

2017-04-25 18:13:55 1310

原创 redis命令详解与使用场景举例——Pub与Sub(发布订阅)

PSUBSCRIBE pattern [pattern …]订阅一个或多个符合给定模式的频道。 每个模式以 * 作为匹配符,比如 it* 匹配所有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类。 可用版本: 2.0.0+

2017-04-25 18:06:16 2858

原创 redis命令详解与使用场景举例——SortedSet(有序集合)

ZADD key score member [[score member] [score member] …]将一个或多个 member 元素及其 score 值加入到有序集 key 当中。 如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。 score 值可以是整数值或双精

2017-04-24 22:13:27 4684 1

原创 redis命令详解与使用场景举例——Set(集合)

SADD key member [member …]将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。 假如 key 不存在,则创建一个只包含 member 元素作成员的集合。 当 key存在且 不是集合类型时,返回一个错误。 在Redis2.4版本以前, SADD 只接受单个 member 值。 可用版本: 1.0.0+ 时间复杂度

2017-04-24 18:59:28 3446 1

原创 redis命令详解与使用场景举例——List

BLPOP key [key …] timeoutBLPOP 是列表的阻塞式(blocking)弹出原语。 它是 LPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。 当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。 非阻塞行为 当 BLPOP 被调用时,如果给

2017-04-23 15:30:35 2601

原创 redis命令详解与使用场景举例——Hash

HDEL key field [field …]删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。 在Redis2.4以下的版本里, HDEL 每次只能删除单个域,如果你需要在一个原子时间内删除多个域,请将命令包含在 MULTI / EXEC块内。 可用版本: 2.0.0+ 时间复杂度: O(N), N 为要删除的域的数量。 返回值: 被成功移除的域的数量,不包括被忽略的域

2017-04-21 18:51:18 4479

原创 redis命令详解与使用场景举例——String

APPEND key value如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。 如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。 可用版本: 2.0.0+ 时间复杂度: 平摊O(1) 返回值: 追加 value 之后, key 中字符串的长度。

2017-04-21 17:08:26 5379 4

原创 redis命令详解与使用场景举例——key

DEL key [key …]删除给定的一个或多个 key 。 不存在的 key 会被忽略。 时间复杂度: O(N), N 为被删除的 key 的数量。 删除单个字符串类型的 key ,时间复杂度为O(1)。 删除单个列表、集合、有序集合或哈希表类型的 key ,时间复杂度为O(M), M 为以上数据结构内的元素数量。 返回值: 被删除 key 的数量 删除单个 key 删除一

2017-04-20 17:09:11 3964 1

原创 Lua学习笔记(四)

5、函数 语法: function func_name (arguments-list) statements-list; end; Lua 也提供了面向对象方式调用函数的语法,比如 o:foo(x)与 o.foo(o, x)是等价的 Lua 函数实参和形参的匹配与赋值语句类似,多余部分被忽略,缺少部分用 nil 补足 5.1 多返回值 Lua 函数可以返回多个结果值,比如 stri

2017-04-17 19:42:40 496

原创 Lua学习笔记(三)

4、基本语法 4.1 赋值语句 Lua 可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语 句右边的值会依次赋给左边的变量。 当变量个数和值的个数不一致时,Lua 会 默认赋值nil 还有一种特殊情况 a,b =fun() fun()的第一个返回值赋值给a,第二个返回值赋值给b 4.2 局部变量与代码块(block) 使用 local 创建一个局部变量

2017-04-13 16:54:20 474

原创 Lua学习笔记(二)

3.表达式 3.1 算数表达式 二元运算符:+-*/^ 一元运算符:-(负值) 3.2 关系运算符 < > <= >= == ~= ==和~=比较两个值,如果两个值类型不同,Lua认为两者不同,nil只和自己相等。 3.3 逻辑运算符 and or not 逻辑运算符认为false和nil是假,其他为真 and和or的运算结果不是true和false,而是和他两个操

2017-04-12 17:55:53 1518 1

原创 关于CSDN登录提示手机号验证的问题

编辑CSDNDL365641发送到10690107888,发送完成之后输入图形验证码,点击我已发送按钮即可

2017-04-12 09:43:39 7143 3

原创 Lua学习笔记(一)

lua运行环境的搭建比较简单,可以去官网查看http://www.lua.org/download.html 1.1、Chunks 一个文件或者交互模式下每一行都是一个chunks,一个chunks可以是一个语句,也可以是一系列语句,还可以函数,在Lua中MByte的Chunk很常见。 lua -i要求lua运行指定Chunk后进入交互模式 另外一个连接外部Chunk的方式是使用dofile

2017-04-11 16:20:23 1570

原创 一致性哈希算法详解

一致性Hash算法通过一个叫一致性Hash环的数据结构实现Key到缓存服务器的Hash映射,如下图所示: 图1 先构造一个长度为0-2^32的整数环,根据节点名称的Hash值将缓存服务器节点放置在这个Hash环上。然后根据需要缓存的数据的Key的值 计算其Hash值,然后在Hash环上顺时针查找距离这个Key的Hash值最近的缓存服务器节点,完成Key到服务器的Hash映射。 假设Node

2017-04-09 14:13:30 1328

原创 shell命令使用笔记

1、统计某个字符串出现的次数并排序取前100个zcat XXX.log.2017-04-08.tar.gz | grep -a "XXXX" | awk -F "|" '{print $2}'| sort |uniq -c |sort -k1nr |` head -1002、实时统计Tomcat的连接数netstat -na | grep ESTAB | grep 8080 | wc -l 3、实时

2017-04-08 20:14:38 606

原创 如何进行网站优化构建高性能网站

说到网站优化其实是一个很大的概念,网站优化的手段太多,一个小小代码合并也算是网站的优化,下面我从网站前端到后端逐步说下各个部分优化方法。 浏览器访问的优化 1、减少HTTP请求 HTTP协议是工作在应用层的无状态协议,意味着每次HTTP请求都要建立通信链路,进行数据传输,而在服务器端每个HTTP请求都要启动独立的线程去处理。这些通信和服务的开销都很昂贵,减少HTTP请求数目可以有效提高访问性能

2017-04-07 18:06:39 698

原创 大型网站的架构模式

说到模式到处可见,生活中穷人模式、富人模式,工作中的996模式,Java中设计模式,武打模式,恋爱模式等等。当然网站的架构也不例外,也有他自己的模式。当然模式不是一成不变的,模式仅供我们借鉴和参考,到底哪种模式适合自己适合自己的网站需要因地制宜。 网站的模式是以高效、易扩展、易维护、安全性高为目标。 1、分层 说到分层我们很容易想到网络七层物理层、数据链路层、网络层、传输层、会话层、表示层、应

2017-04-06 11:43:12 1116

原创 大型网站架构的演化过程

所有的网站都是从一个小网站主键的扩展演化而壮大,凡是那种一口气就想做成一个庞大的网站的企业往往以失败告终。当年的淘宝也只不过是一个简单黄页加商品展示功能,并且代码还是从国外购买的。十年之后淘宝的发展惊天动地。 一般网站的演化往往会经历一个几个过程,当然并不是所有的网站都会经历,有些网站在上线之后可能没有流量而止步不前,并且也没有扩展的必要了,归根结底是用户需求推动网站变更和发展。 1、初级网站架

2017-03-21 16:03:27 661

转载 JAVA利用HttpClient进行POST请求(HTTPS)

目前,要为另一个项目提供接口,接口是用HTTP URL实现的,最初的想法是另一个项目用JQuery post进行请求。但是,很可能另一个项目是部署在别的机器上,那么就存在跨域问题,而JQuery的post请求是不允许跨域的。这时,就只能够用HttpClient包进行请求了,同时由于请求的URL是HTTPS的,为了避免需要证书,所以用一个类继承DefaultHttpClient类,忽略校验过程。1.写

2016-03-29 19:39:40 1562 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除