自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 数据结构与算法之美——哈希算法

一、前言 如何防止数据库中的用户信息被脱库?如何存储用户密码这么重要的数据呢?仅仅MD5加密一下存储就够了吗?要想搞清楚这个问题,就要先弄明白哈希算法。 哈希算法历史悠久,业界著名的哈希算法也有很多,比如MD5、SHA等。那么在实际的开发中,我们该如何用哈希算法解决问题。二、什么是哈希算法 将任意长度的二进制值映射为固定长度的二进制值串,这个映...

2019-03-19 22:36:41 337 2

原创 数据结构与算法之美——跳表

一、概述 二分查找算法:底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,就真的没法用二分查找算法了吗? 实际上,我们只需要对链表稍加改造,就可以支持类似“二分”的查找算法。改造之后的数据结构叫做跳表(Skip list)。它是一种各方面性能都比较优秀的动态数据结构,可以支持快速的插入、删除、查找操作,写起来也不复杂,甚至可以替代红黑树(R...

2019-03-19 22:21:10 334 2

原创 数据结构与算法之美——散列表——实战篇(上)

一、前言 通过理论篇,我们知道,散列表的查询效率跟散列函数、装载因子、散列冲突等都有关系。如果散列函数设计得不好,或者装载因此过高,都可能导致散列冲突发生的概率升高,查询效率下降。 在极端情况下,有些恶意的攻击者,还有可能通过精心构造的数据,使得所有的数据经过散列函数之后,都散列到同一个槽里。如果我们使用的是基于链表的冲突解决方法,那这个时候,散列表就会退化为链表,...

2019-03-19 22:20:51 159 2

原创 数据结构与算法之美——散列表——实战篇(下)

一、前言 在之前的学习中,有两种数据结构,散列表和链表,经常会被放在一起使用。 在链表那一节,提及了用链表来实现LUR缓存淘汰算法,但是链表实现LRU缓存淘汰算法的时间复杂度为O(n),通过散列表可以将时间复杂度降低到O(1)。 在跳表那一节,提到Redis的有序集合是使用跳表来实现的,跳表可以看作一种改进版的链表。Redis有序集合不仅使用了跳表,...

2019-03-19 09:06:12 194 1

原创 数据结构与算法之美——队列——学习笔记

一、前言 众所周知,CPU资源是有限的,任务的处理速度与线程个数并不是正相关的。相反,过多的线程反而会导致CPU频繁切换,处理性能下降。所以,线程池的大小一般都是综合考虑要处理任务的特点和硬件环境,来实现设置的。 当我们向固定大小的线程池中请求一个线程时,如果线程池中没有空闲资源了,这个时候线程池如何处理这个请求?是拒绝请求还是排队请求?各种处理策略又是怎么实现的呢...

2019-03-17 23:18:08 141 1

原创 数据结构与算法之美——栈——学习笔记

一、栈 栈就像一摞叠在一起的盘子,我们平时放盘子的时候,都是从下往上一个个放;取的时候,我们是从上往下一个一个依次取。先进后出,这就是典型的栈结构。栈是一种“操作受限”的线性表,只允许在一段插入和删除数据。 事实上,从功能上来说,数组或链表确实可以替代栈,特定的数据结构是对特定场景的抽象。数组或链表暴露了太多的操作接口,操作上的确灵活自由,但使用时就比较不可控,...

2019-03-17 20:26:41 107 1

原创 数据结构与算法之美——链表

一、前言 相比数组,链表是一种稍微复杂的数据结构。对于初学者而言,掌握链表要比数组稍难一些。这两个非常基础、非常常用的数据结构,常常放到一起来比较。二、数组VS链表 数组与链表是非常基础、常用的数据结构,我们常常会放到一块来比较。 1、底层的存储结构 为了直观对比,我画了一张图,从图中我们看到,数组需要一块连续的内存空间来存储,...

2019-03-17 19:35:37 93 2

原创 【MySQL】基础架构

一、MySQL逻辑架构 总体上来说,MySQL可以分为Server层和存储引擎层两部分。 Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(比如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。 存储引擎层负责数据的存储和提取,其架构...

2019-03-17 10:46:04 227 1

原创 如何设计一个秒杀系统——秒杀系统架构设计都有哪些关键点

一、如何理解秒杀系统 秒杀系统其实主要解决两个问题,一个是并发读,一个是并发写。并发读的核心优化理念是尽量减少用户到服务端来“读”数据,或者让他们读更少的数据;并发写的处理原则也一样,它要求我们在数据库层面独立出来一个库,做特殊的处理。另外,我们还要针对秒杀系统做一些保护,针对意料之外的情况设计兜底方案,以防止最坏的情况发生。 总之,要遵循几个原则,就是要保证用户请...

2019-03-11 09:52:34 640

原创 JWT实现鉴权

一、前言 JWT全称JSON Web Token,是一种基于JSON的,用于在网络上声明某种主张的令牌(Token)。JWT通常由三部分组成:头信息(header)、消息体(payload)、签名(signature)。 头信息(Header)指定了该JWT使用的签名算法:header = '{"alg":"HS256","typ":"...

2019-03-10 23:36:57 1836

原创 Zookeeper实现分布式锁

一、分布式锁 首先谈一谈什么是分布式锁。 在多线程并发情况下,如何保证一个代码块在同一时间只能由一个线程访问?可以用锁来实现,比如Java的Synchronized语言,以及ReentrantLock类等。这样可以保证在同一个JVM内,同一时间只有一个线程访问。 如何在分布式集群环境,保证不同节点的线程同步执行?二、节点 然后介...

2019-03-10 21:16:43 186

原创 访问频率控制——防止恶意用户频繁访问

一、需求 现在有需求如下:限制1秒中,每个用户最多访问10次后台接口二、方案 1、方案一: 采用Redis String数据结构,以用户id为key,访问次数为value。过期时间为1s。 每次访问都使用INCR命令递增该键的键值,如果递增后的值为1(第一次访问),设置过期时间。这样每次访问先获取该键值,当键值超过100时,说...

2019-03-06 11:01:39 4002 2

原创 数据结构与算法之美——散列表——理论篇

一、散列思想 散列表的英文叫Hash Table,也叫哈希表或者Hash表。散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。 散列表时间复杂度是O(1)的特性。我们通过散列函数把元素的键值映射为下标,然后将数据存储在数组中对应下标的位置。当我们按照键值查询元素时,我们用同样的散列函...

2019-03-05 14:10:49 79

原创 排序算法——冒泡排序VS插入排序

一、概述 最经典、最常用的排序算法有:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、按照时间复杂度分为三类。如下图所示 二、如何分析一个排序算法 (1)排序算法的执行效率 1、最好情况、最坏情况、平均情况时间复杂度...

2019-03-04 20:27:50 193

原创 数据结构与算法之美——递归——学习笔记

一、前言 先说一下递归的几个常见应用:一是裴波那契数列,二是注册返佣金,找最终推荐人,三是青蛙跳台阶。二、如何理解“递归” 作者从它学习数据结构与算法的经历来看,作者认为有两个最难理解的知识点,一个是动态规划另一个就是递归。 递归是一种应用非常广泛的算法(或者编程技巧)。之后我们要将的很多数据结构和算法的编程实现都要用到递归。比如DFS深度...

2019-03-02 21:27:47 222

原创 数据结构与算法之美——数组

二、是什么 1、线性表 线性表,顾名思义,就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。 数组、链表、栈、队列等也是线性表结构。 与之对应的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,数据之间并不是简单的前后关系。 2、连续的内存空间和相同类型的数据三、数据访问 ...

2019-02-26 15:38:38 98 3

原创 数据结构与算法之美——复杂度分析——学习笔记

一、前言       只要讲到数据结构与算法,就一定离不开时间、空间复杂度分析。可以说,复杂度分析是整个算法学习的精髓,只要掌握了它,只要掌握了复杂度分析,数据结构与算法的内容基本上就掌握了一半。二、为什么需要复杂度分析       俗话说,实践是检验真理的唯一标准,那么把代码跑一遍,通过统计、监控、就能得到算法执行的时间和占用的内存大小。这个方法叫做事后统计法。为什么还要做时间、空间...

2019-02-25 19:41:44 165 2

原创 数据结构与算法之美——学习笔记

一、前言 近期在准备面试,而数据结构与算法是面试不可回避的重中之重,可以说只有有笔试题,至少有一道算法题。而算法一直是自己软肋,这次不得不正视这个问题。过去对数据结构与算法一直不太重视,总觉得这些太基础,离实际编程太远,然而事实是,要写出高质量的代码,算法必不可少。最近在极客时间入手了《数据结构与算法之美》,希望能久旱逢甘霖~~~二、为什么要学习数据结构与算法 ...

2019-02-25 16:33:03 973 3

原创 JVM面试点记录

一、jvm规范运行时数据区 程序计数器、虚拟机栈、本地方法栈、堆、方法区(非堆/静态存储区)。 线程私有:程序计数器、虚拟机栈、本地方法栈 线程共享:堆、方法区 程序计数器:保证线程切换后能恢复到正确位置。 虚拟机栈:经常有人把Java内存划分为堆内存(Heap)和栈内存(Stack)。其中所值的“栈”,就是现在讲的虚...

2019-02-20 21:32:19 89

原创 redis 集群

一、前提      首先我们来回顾一下redis有哪些数据结构。List、Set、Sorted Set、Hash。      (1)List:列表,可以当作一个队列或者栈来使用。      (2)Set:集合,包含不重复的字符串,没有次序      (3)Sorted Set:有序集合,有次序的不重复字符串      (4)Hash:包含键值对的无序散列表,和Java中的Has...

2019-02-20 20:41:44 78

原创 分布式事务

一、什么是事务       首先谈一谈什么是事务?举个栗子,张三要给李四转账100元,张三的数据库账户要扣掉100元,李四的数据库账户要增加100元。这就涉及两个操作,这两个操作要么全部成功,要么全部失败。这就是一个事务。事务共包含四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),简称ACID。     ...

2019-02-15 22:42:19 75 1

原创 【HTTP】HttpClient实现HTTP请求

一、前言       最近在做接口对接,涉及到了加密解密,签名验签等操作。关于这块的技术,在之后的博客中在详谈。大概说一下事情的经过。客户端先把传输的数据进行签名,然后再进行加密,总之就是变成个大字符串传给服务端,服务端进行解密,然后再进行验签。通过之后进行业务处理。把处理结果经过签名和加密操作再传送给客户端。       问题表现为在服务端把串返给客户端,客户端解密居然失败啦!!!我勒个擦,什么...

2018-06-29 22:36:48 294 8

原创 【FTP】java实现FTP服务上传下载

1、首先在pom文件中添加ftp相关依赖。 <!--和FTP有关--> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.3</version&a

2018-06-29 21:23:54 3835 15

原创 【RabbitMQ】RabbitMQ队列

上一篇博客中提及的消息抽象模型,就是简单队列,简单队列的不足时:耦合性高。生产者和消费者一 一对应,如果我想有多个消费者消息队列中消息,这时简单队列就不能满足啦,如果队列名更改,这时候得同时变更。本篇博客将谈一谈其他队列。首先谈一谈工作队列:                    为什么会出现工作队列?Simple队列是一 一对应的,而在我们实际开发中,生产者发送消息是毫不费力的,而消费者一般是要...

2018-06-03 21:39:49 351 5

原创 【SpringBoot】SpringBoot整合Redis(Spring Data Redis)

一、前言:       现在做J2EE开发基本上都用spring全家桶了,由于项目中需要减轻数据库的访问压力,所以考虑添加缓存,之前采用SSM框架的时候对redis进行操作都是用的jedis。其实呢redis的客户端有两种实现方式,一种是调用jedis来实现,二是可以使用spring data redis,通过spring的封装来调用。二、整合      1、添加redis依赖<!--与sp...

2018-06-03 20:56:59 6561 8

原创 【WebService】springboot整合cxf实现webService远程调用

一、前言        在做接口对接的时候需要接口以HTTPS和WebService的形式暴露,虽然最近这几年restful非常火爆,但在一些特定的领域或者一些老旧系统中仍然采用WebService的形式来实现远程通信。       上一篇博客讲了WebService实现远程调用,在博文的最后,自己阐述了关于那种客户端调用存在的问题,如大家有疑问,欢迎留言区指正。二、实现       废话上一篇博...

2018-06-03 20:27:36 5703 8

原创 【WebService】WebService实现远程调用

一、WebService是什么       WebService是一种跨语言跨平台的远程调用技术。所谓跨语言跨平台就是说服务端采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然。跨平台则是指windows客户端可以调用Linux服务端,反之亦然。二、相关技术       1、XML:可扩展编译语言,可以用来传递数据时soap的基础       2、soap:简单对象访问协议,WebS...

2018-06-02 22:12:13 11695 8

原创 【FTP】FTP服务搭建

基本介绍:         FTP是文件传输协议的缩写,基于网络来传输文件的应用层协议。         FTP支持两种模式:Standard(PORT方式,主动方式),Passive(PASV,被动方式)。Port模式:FTP客户端首先和服务器的TCP21端口建立连接,用来发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令,PORT命令包含了客户端用什么端口接收数据。在传送数据的时候...

2018-05-27 21:57:49 3247 20

原创 【Spring Cloud Stream】异步任务

一、前言       前两篇博客提高了用线程池和消息队列才实现异步任务。本篇博客谈一谈用SpringCloud Stream来实现异步任务。       Spring Cloud Stream是一个用来为微服务应用构建消息驱动能力的框架。它可以基于Spring Boot来创建独立的、可用于生产的Spring应用程序。它通过使用Spring Integration来连接消息代理中间件以实现消息事件驱...

2018-05-20 15:39:20 2067 13

原创 【RabbitMQ】异步任务

一、前言     上一篇博客介绍了用线程池实现异步任务。这一篇博客谈一谈用MQ实现异步任务。MQ的产品有灰常多,像什么MSMQ、activeMQ、RocketMQ、RabbitMQ、kafak等。在此之前先谈一谈对消息队列的理解。二、MQ       MQ是一种应用程序对应用程序的通讯方法,应用程序通过读写出入队列的消息来进行通信,两者无需建立连接,发布者和消费者无需知道对方的存在。      M...

2018-05-19 22:46:04 2712 17

原创 【线程池】异步任务

一、业务场景      最近在做项目时,遇到一个业务场景:由于手机浏览器直接加载大PDF文件可能会导致加载失败,因此当用户上传PDF文件到FastDFS的时候,需要将pdf原文件上传,并且按照pdf文件页数转化成对应的图片在上传到FastDFS上。因为PDF转图片是一个比较耗时的操作,因此需要用到异步任务。二、分析      首先想到的就是主线程去执行上传pdf原文件的操作,然后再开启一个线程来进...

2018-05-19 19:05:52 1176 14

原创 【FastDFS】FastDFS java客户端实现文件上传下载删除

首先引入相关jar包。pom文件的相关依赖如下所示。<dependencies> <!--与fastdfsclient有关--> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactI...

2018-05-13 09:47:57 2436 6

原创 【FastDFS】FastDFS防盗链

一、前言       我们通过HTTP的方式完成文件的下载。形如http://172.31.20.220/group1/M00/00/00/rB8UEVrjR1mAV_XWAUWlTgbnZcg938.pdf,但是这样是不安全的,因为只要知道ip和文件路径,就能下载所需文件。因此采用Token方式防盗链。       FastDFS内置防盗链采用Token的方式。Token是带时效的,也就是说在设...

2018-05-03 21:00:51 7052 27

原创 【redis】redis安装教程

一、redis的安装       redis是c语言开发的,安装redis需要C语言的编译环境。如果没有gcc。安装gcc命令 yum install gcc-c++1、下载redis到/usr/local/src目录下wget http://download.redis.io/releases/redis-3.0.0.tar.gz2、解压缩redistar zxvf redis-3.0.0.ta...

2018-04-29 11:37:42 792 16

原创 【FastDFS】FastDFS+FastDHT完成文件上传去重

一、前言      最近公司让我搞FastDFS分布式文件系统。整个集群环境已经搭建成功啦。但是有一个问题一直困扰着我,那就是重复文件的上传。即使是同一个文件,多次上传,返回的id也是不一样的。这样就造成了磁盘资源的极大浪费。但是呢FastDFS本身是不支持重复文件去重的。好在FastDFS的作者余庆提供了一种解决思路。那就是FastDHT。      FastDHT是分布式哈希系统(DHT),使...

2018-04-24 22:47:38 5236 48

原创 【FastDFS】FastDFS安装手册(单机版)

一、前言       FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用,高性能等指标。使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。具体有关FastDFS的知识点,欢迎猛戳我的博客。二、基本环境说明       跟踪服务器(Tracker Server): 192.1...

2018-04-24 11:42:15 1034 53

原创 【Keepalived】Keepalived安装教程

一、基本安装1、基本环境: CentOS7 keepalived-1.3.4.tar.gz2、安装前需要的环境:wget、gcc、pcre、openssl、zlib在之前的Nginx安装教程中已指明怎么安装这些环境。在此不在赘述。3、正式安装进入下载目录:cd /usr/local/src①下载keepalived:wget http://www.keepalived.org/software/k...

2018-04-21 17:09:12 1170 14

原创 【keepalived】keepalived简介及配置文件详解

一、是什么     keepalived是集群管理中保证集群高可用的一个服务软件,它的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后,自动将web服务器加入到服务器集群中。解决了静态路由的单点故障问题。二、工作原理     keepalived是以VRRP协议为实现基础的,VRR...

2018-04-18 10:02:14 6116 14

原创 【Nginx】Nginx安装教程

一、应用场景1、http服务器。Nginx是一个http服务可以独立提供http服务,可以做网页静态服务器。2、虚拟主机。可以实现在一个服务器虚拟出多个网站。例如个人网站使用的虚拟主机。3、反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的...

2018-04-11 15:32:18 499 9

原创 【FastDFS】分布式文件系统

一、简介       FastDFS是一个C语言编写的轻量级的开源分布式文件系统。它的主要功能包括文件存储、文件同步和文件访问以及高容量和负载均衡设计。二、组成              1、client:就是客户端。      2、Tracker Server:跟踪服务器,主要做调度工作,在访问上起负载均衡的作用。记录Storage Server的状态,是连接Clinet和Storage Ser...

2018-04-10 22:05:38 194 20

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