自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

不爱学习

-希望能带给你启发

  • 博客(66)
  • 资源 (10)
  • 收藏
  • 关注

原创 MySQL事务隔离性与隔离级别原理

前言不管我们学习哪一门面向对象语言,在多线程并发环境下,多个线程共同对同一共享资源操作,从而导致资源出现数据错误的问题称为线程安全问题。通常情况下加锁能够很好的处理线程安全问题。不知你有没有思考过,MySQL也是一个支持多线程访问的软件,但是我们再日常开发中好像并没有过多的关注过线程安全问题?其实并不是说MySQL不会发生线程安全问题,而是它太优秀了很多地方都帮我们解决了。事务的隔离性与隔离级别事务的隔离性是指在并发环境中,并发的事务是相互隔离的,一个事务的执行不能被其他事务干扰。也就是说,

2021-01-25 18:23:38 462 1

原创 Kafka学习总结

Kafka消费模式点对点消息传递模式在点对点系统中,消息持久化到一个队列中。此时将有一个或多个消费者,消费队列中的数据,但是一条消息最终只能被消费一次。当一个消费者消费了队列中的某条数据后,该条数据则从消息队列中删除。该模式即使有多个消费者同时消费数据,也能保证数据处理的顺序。发布订阅模式在发布订阅模式中,消息被持久化到一个topic中。与点对点消息系统不同的是,消费者可以订阅一个或者多个topic,消费者可以消费该topic中所有的数据,同时一条数据可以被多个订阅此tpic的消费者消费

2021-01-04 11:34:51 347

原创 RabbitMQ学习总结

消费模型模式worker模式消息队列的扩展也是很轻松的,简单队列模式下如果1个消费者处理不过来,需要新增消费者来处理的话,直接加入一个队列就好了。这里我们已经有2个消费者监听了同一个队列,但是rabbitmq是如何来推送消息呢?默认情况下,RabbitMQ采用轮询分发消息的策略,会将消息一开始就均匀的分给队列中的所有消费者,rabbitmq收到消息的那一刻就决定了这条消息属于哪个worker,每台worker收到的消息数量必定是相等的。rabbitmq不管你的消费能力而是一股脑的分给你。

2021-01-04 11:32:43 386

原创 ThreadLocal概念解释

前言在我们学Java的时候,知道变量通常有成员变量和局部变量。局部变量在一个方法内部使用,当方法结束后,局部变量也就被清除;成员变量属于一个对象,只要我们有一个对象的访问权限,我们就可以访问这个对象的成员变量。ThreadLocal又叫本地线程变量,是相对于以上两种变量的另一种模式。ThreadLocal和一个线程的生命周期绑定,一个线程从一个顶级方法入口进入,一层层的调用又一层一层的退出,最终从顶级方法入口结束。局部变量的作用域是线程域的某个方法内部;成员变量的作用域虽然很宽广,但是你必须拥有这个

2020-12-24 01:05:33 442 4

原创 【Spring】Spring后置处理器

Spring经过XML解析获取到了所有需要实例化Bean的信息并读取到BeanDefinition后,就保存在了BeanDefinitionMap容器中。在实例化bean的操作就是依据这些BeanDefinition定义来做,而在实例化之前,Spring允许我们通过自定义扩展来改变bean的定义。定义一旦变了,后面的实例也就变了。而beanFactory后置处理器,既BeanFactoryPostProcessor就是用来改变bean定义的。invokeBeanFactoryPostProcessors

2020-12-23 01:18:42 250

原创 【Spring】xml解析和BeanDefinition封装

Spring扫描一个Java Bean到内部容器,可以有两种方式。第一种在xml里面配置<bean/>标签,指定扫描路径下的类文件。 <bean class="com.wintig.bean.Student" id="student" scope="singleton" primary="true"/>第二种使用一个特殊的标签,指定要扫描路径下的所有文件<context:component-scan base-package="com.wintig"/>

2020-12-21 23:10:57 218 2

原创 【Spring】快速理解循环依赖

什么是循环依赖?循环依赖简单来说就是A对象中依赖了B对象,B对象中依赖了A对象。Java中解决循环依赖也很简单,直接set就好了。spring当中的循环依赖和Java当中的循环依赖又有什么区别呢?主要区别在于,spring当中的一个对象并不是简单的new出来的,而是经过了一系列复杂的Bean的生命周期而产生的,就是因为Bean的生命周期所以才会产生循环依赖问题。所以要明白Spring中的循环依赖,需要先明白Spring中Bean的生命周期。Bean的生命周期被Spring所管理.

2020-12-16 10:45:49 284 1

原创 JVM调优原理

前言当平常谈论到JVM调优的时候,很多人都喜欢看玩笑的说:“JVM需要调优,那肯定是你钱没冲够,加大内存就好了”。玩笑归玩笑,但是真的如玩笑一样,加大内存就可以了吗?加大内存真的会带来性能提升吗?高并发场景下的内存调优我们什么地方需要内存调优,肯定是高并发的情况下;以互联网的秒杀场景来说,用户每次的请求到来,系统首先需要检查库存是否充足,然后校验用户余额是否足够支付该商品,如果足够那么就扣除用户余额和商品库存。我们假设每个订单处理过程会产生0.2MB大小空间的内存,每秒产生100M的内存对象,每

2020-09-13 02:06:32 281

原创 ConcurrentHashMap1.7和1.8设计思想

1.7中的ConcurrentHashMap的介绍HashMap是一个线程不安全的集合,如果想要在并发下让他线程安全那么可以使用Hashtable,但是Hashtable是对整个集合进行加锁,这明显也不是我们想要的。按照历史经验来讲,要提升性能比较好想到的手段就是减小锁的粒度。在ConcurrentHashMap1.7中使用了一组Segment集合作为作为锁,它的底层继承自ReentrantLock,Segment里面包含了一个HashEntry数组,HashEntry是一个链表结构的元素.

2020-09-12 09:30:17 233

原创 Java中的线程池设计思想

为什么要使用线程池首先线程的创建和销毁需要调用操作系统内核的API,然后操作系统为其分配一系列资源,整个成本很高,也就导致线程是一个重量级对象。其次如果并发线程数量很多,并且每个线程执行一个很短的任务就结束了,这样频繁创建线程不仅会消耗系统资源,还会降低系统的稳定性。为了避免资源的过度消耗,最好的办法就是用池化技术对线程进行复用,线程执行完一个任务并不需要销毁,而是让他继续执行其他任务。这样当任务到达时,任务可以不需要等到线程创建就能立即执行。使用线程池对资源进行统一的分配、调度和监控,不仅可以

2020-09-09 02:26:33 334

原创 JVM垃圾收集器概述

前言通过细说Java垃圾回收我们已经理解了常见的垃圾回收算法,有了垃圾回收算法后我们就需要垃圾收集器去执行。有点抽象,但是我们可以把垃圾回收算法类比为打扫垃圾时候所使用工具,可以是扫帚也可以是吸尘器。有了工具还需要具体的人去操作它,可以是你爸妈、爷爷奶奶或者你自己。这就是垃圾回收算法和垃圾收集器之间的关系。分代假设时期在我细说Java垃圾回收里面讲到的算法都是依据分代收集的理论进行设计的,分代收集建立在两个分代假说上:绝大多数对象都是朝生夕灭的。熬过越多次垃圾收集过程的对象就越难以消亡。因此将J

2020-08-18 23:48:45 204 2

原创 Redis的字符串的底层实现SDS

前言Redis是使用C语言开发的,C语言又自己字符类型,但是Redis却没有直接使用C语言传统的字符串表示(以空字符串结尾的字符数组),而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,并将SDS用作Redis 的默认字符串表示。举个例子就是,如果客户端执行如下命令:实际上在Redis内部创建了两个SDS,一个是名为“msg”的key的SDS,另一个是名为“hello world”的SDS。SDS的定义如果去查看源码,一..

2020-07-05 11:46:28 1232

原创 Redis哨兵模式与高可用集群

Redis高可用概述高可用是如今Web服务的一个基本诉求,它是指服务器可以正常访问的时间,衡量标准是多少时间内可以提供正常服务。在Redis层面内,不仅仅需要能正常提供服务,还需要考虑数据扩容、数据安全等。Redis主从复制问题主从复制是为了解决分布式系统中的单点问题,通常会把数据复制到多个副本部署到其他机器上,满足了故障恢复和负载均衡等需求。Redis也提供了这样的功能,它可以将主节点数据的改变同步给其他从节点,这样当主节点因为故障不可达,那么从节点就可以作为后备“顶”上来,并保证数据尽量不丢

2020-06-27 17:27:39 244

原创 Java类加载器

类加载器的作用类加载器的作用就是把类的字节码加载到JVM。同时JVM规定,程序员可以用Java代码来自定义类加载器,把类的字节码信息加载到JVM中。类加载器的类型从java虚拟机角度来看,类加载器分成C++语言实现的启动类加载器属于虚拟机的而一部分,和java语言实现所有其他类的加载器,独立于虚拟机外部并且全部集成自抽象类java.lang.ClassLoader。从开发者角度来看,类加载器分为以下3种:启动类加载器(Bootstrap Class Loader)负责加载系统的核心类

2020-06-15 23:50:43 216

原创 Java内存模型

Java内存模型Java内存模型简称JMM(Java Memory Model),Java线程之间的通信由JMM控制,JMM决定了一个线程对一个共享变量的写入何时对另一个线程可见。但是它不是一个真实存在的,而是一个抽象的概念,主要是为了屏蔽各种硬件和操作系统的访问差异,保证Java程序再各种平台下面对内存的访问都能够达到一致效果的规范及机制。什么是硬件和操作系统的访问差异JMM是为了屏蔽各种硬件和操作系统的访问差异,那到底什么是访问差异?这就要扯到计算机的内存模型。我们所有的程序最终都会转化成机

2020-06-07 23:10:13 199

原创 细说Java垃圾回收

通过之前的篇章我们已经了解了Java运行时数据区的结构和一个类如何被加载进虚拟机的虚拟机类加载机制。那虚拟机又是如何回收资源的呢?

2020-05-27 23:02:35 308

原创 虚拟机类加载机制

在上一章Java运行时数据区我们了解Java虚拟机在执行Java程序过程中如果对它所管理的内存进行划分的。有了这个基础今天我们来了解Java虚拟机是如何将一个Java代码加载进内存的。

2020-05-17 17:13:59 254

原创 Java运行时数据区

Java堆(Heap)对于大多数应用而言,Java堆(Heap)是Java虚拟机所管理的内存中最大的一块,它被所有线程共享。几乎所有的对象实例都在这里分配内存,且每次分配的空间是不定长的。再Heap中分配一定的内存来保存对象实例,实际上只是保存对象实例的属性值、属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在Stack中)。对象实例在Heap中分配好之后,需要再Stack中保存一个4字节的Heap内存地址,用来定位该对象实例再Heap中的位置,以便找到该对象实例。根据垃圾回收

2020-05-10 23:33:51 480

原创 如果你不了解InnoDB的存储逻辑,可能你并不是真正搞懂MySQL

InnoDB存储逻辑InnoDB存储引擎的逻辑存储是将所有的数据都逻辑的存放在一个空间中,我们称之为表空间(tablespace)。表空间又是由段(segment)、区(extent)、页(page)组成。如下图表空间(Tablespace)表空间是InnoDB存储引擎逻辑结构的最高层,所有数据都放在表空间ibdata1里。在MySQL5.6之后默认每张表单独一个表空间,通过...

2020-05-04 02:36:53 294 1

原创 要去面试阿里,你至少要掌握如下的索引知识。

什么是索引?索引其实就是一种数据结构,目的就是为了帮助我们快速的检索数据库中的数据。就好比我们查字典的时候,会先翻一番目录,这个目录就是索引。索引具体采用的是哪种数据结构呢?常见的MySQL中主要有两种索引:Hash索引和B+树索引。现在常用的存储引擎是InnoDB,它默认就是B+树。你先说一说什么是Hash索引吧哈希索引底层是哈希表,哈希表是一以key-value结构存储的,...

2020-05-02 02:32:13 394 1

原创 MySQL的“order by”是如何对200G文件进行排序的?

前言学习编程语言的时候,我们第一个行代码往往是“Hello World”。我们学会的第一个真正意义上的算法,我想就是冒泡排序吧。我们创建一个数组,通过N次比较,每次找出最大或最小的元素,把它放到队列最末尾就完成将无序数组转化成为了有序数组,这些排序都是再内存中进行的。我们开发系统的时候,经常会有按照某种条件就行排序的需求。你有没有这样的疑问:我们的数据都是存放硬盘上的,如果数据有200G,...

2020-04-27 01:37:14 381

原创 MySQL复制原理

前言学过事务的同学都知道,只要事务commit之后,无论发生什么异常最终都会被持久化到数据库中。但是这样并不能完全保证数据安全,万一数据库机房着火了,硬盘坏了,那么我们数据还是丢了。所以说,将所有的数据都放在一台机器是很危险的,几乎所有的互联网公司都会为数据库设置至少一个备库。这也是今天我们要谈的MySQL复制原理。复制概述复制基本解决的问题是让一台主数据库服务器的数据同步到多台备库上...

2020-04-21 21:07:46 429

原创 我就执行一个count(*)为什么这么慢?

前言今天想看一下我的活动有多少用户参与了,随手执行了一条语句select count(*) from table;我等待几秒钟才出现结果,我不禁陷入了对社会和人生的大思考。是我太菜吗?不这条语句简单到无法优化,以至于少一个符号就可能报错;是MySQL太笨了吗?用一个变量保存一个总数,每次要查的时候直接返回,不就好了吗?上面的是真实的故事背景,我们今天就来聊一聊count(*)底层到到底...

2020-04-20 23:43:29 1303 2

原创 MySQL究竟是如何做到持久性的?

前言我们学习事务中,对于持久性(durability)是这样定义的:事务一旦提交,则其所有的修改将会保存到数据库当做。即使此时系统崩溃,修改的数据也不会丢失。同时数据库连接中,默认有一个参数autocommit=1表示每次执行一条sql如果没有显示启动事务语句(begin或start transaction)就会隐试的开启一个事务。所以通常情况下,我们对数据库做的任何修改,只要事务提交都可...

2020-04-07 23:03:58 6921 4

原创 用了这么久的MySQL,你了解MySQL的架构吗?

前言数据库大家都清楚吧,目前市面上主流的数据库分为Oracle、MySQL、SQLServer。SQLServer微软家开发的,我想.Net开发用的多,我们大学数据库课程所使用的数据库,安装很头疼当时还重装了系统,考完试第一件事就是把它卸载了,所以不是那么熟。Oracle作为排名第一的数据库,很遗憾我也只是学过,并没有再实际开发中用过这玩意,所在的公司都是清一色的MySQL。所以我对MySQL...

2020-04-05 22:05:05 211

原创 TCP为什么可以做到可靠传输?

TCP又称为可靠传输协议,这个可靠是指数据一定可以毫无遗漏的交给对方。但是是不是说我们开发了一个应用程序给另一个应用程序发送消息,他就一定能够收到呢?我们开发的时候用了TCP,而且TCP又是可靠的传输协议,那为什么我们的应用程序依然要处理要处理消息丢失,消息完整性校验等问题?

2020-03-14 23:52:10 9520

原创 Redis面试连环炮,你能撑到第几关?(持续更新中)

Redis是什么?Redis是一种非关系型数据库,数据都在内存中,读写速度非常快。Redis是单线程架构,所以它是线程安全的,内部采用IO多路复用。包含了我们常用的数据结构,同时支持持久化和集群模式。也可以作为分布式锁,消息中间件来使用。Redis的数据类型Redis支持常用的数据结构有String、Hash、List、Set、Sorted Set。redis内部使用了一个redisO...

2020-03-12 22:10:34 382 1

原创 Java类加载器与双亲委派模型

类加载器的作用类加载器的作用就是把类的字节码加载到jvm。同时jvm规定,程序员可以用java代码来自定义类加载器,把类的字节码信息加载到jvm中。jvm再使用类加载器的时候,并不是一次性把所有的类都加载进来,而是在用到某个类的时候,发现jvm中没有才去加载它。类加载器的类型从java虚拟机角度来看,类加载器分成C++语言实现的启动类加载器属于虚拟机的而一部分,和java语言实现所有其他类的...

2020-03-09 22:25:34 187 1

原创 细说数据库隔离级别

如果事务都是以串行的方式进行的,数据库系统处理完一个事务包,然后再处理下一个事务包,并按照事务开启的时间依次进行。这种方式并不存在事务并行化的竞争,只要保证每个事务的原子性,那么一致性自然就获得了保证。这种方式看起来特别美好,但是结果我们肯定也知道的。这种方式处理会大大降低数据库系统处理事务的能力。当出现一个非常耗时的事务,那么后续事务将会发生挤压,从而导致数据库并发性能很低。可串行...

2020-02-16 14:11:53 1146 2

原创 ThreadLocal原理解读

前言多线程环境中经常会发生因为资源竞争而出现的线程安全问题,通常情况下我们使用加锁的方式解决这类问题。但是除了控制资源的访问外,我们还可以增加资源来保证所有对象的线程安全。例如线程安全案例时间类在我们日常开发中是经常会用到的,虽然JDK为我们封装了很强大的SimpleDateFormat类,但是如果稍不留心的话就有可能导致很大的问题,我们先来看一个简单的例子:public class 没有...

2019-07-22 21:22:09 294

原创 对面向对象的一些思考

到底什么是面向对象,再讨论这个问题之前我们先来假设一下如果不用面向对象用过程试编程来想象一下是什么样子的。过程试的编程很好理解,我们再一个main方法中从头到尾一行一行的写代码,同时定义多个变量来完成我们的逻辑。后来高级一点的程序员会抽取一些共有功能,定义一个函数。再代码任何地方,我们都可以使用这个函数。一个函数其实单纯的就是一个代码片段,它没有状态,只管你输入一个数据然后经过一系列的计算后给...

2019-07-09 14:17:23 174

原创 数据库三范式理解

一范式就是属性不可分割。属性是什么?就是表中的字段,不可分割的意思就按字面理解就是最小单位,不能再分成更小单位了。这个字段只能是一个值,不能被拆分成多个字段,否则的话,它就是可分割的,就不符合一范式。不过能不能分割并没有绝对的答案,看需求,也就是看你的设计目标而定。举例:学生信息组成学生信息表,有姓名、年龄、性别、学号等信息组成。姓名不可拆分吧?所以可以作为该表的一个字段。但我要说这个...

2019-03-11 18:56:49 704

原创 谈谈乐观锁和悲观锁

什么是乐观什么是悲观有一类人开车小心翼翼,从不超速、违章、酒驾,他总是很悲观,总担心会发生车祸,所以偶尔会发生车祸。另一类人麻痹大意,超速、酒驾各种胡来,他总是很悲观,总感觉我反正就这一次,我不可能运气这么差吧? 然而结果是什么呢?悲观的司机小心使得万年船,虽然我开的慢,可能上班会迟到,但是我小心驶得万年船,我总能平安无事。乐观的司机总感觉坏事不会发生到自己头上,飙车的时候虽然很爽,但是...

2019-02-21 21:44:33 1003

原创 到底什么是缓存穿透,缓存雪崩,缓存击穿

什么是缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存没有命中,这时候我们会数据库查询。出于容错考虑,当我们从数据库查询不到数据的时候,则不会写入缓存,这个可能导致每次请求都去数据库查询,失去了缓存的意义。在流量大的时候DB可能就会挂掉,如果有人利用这个不存在key频繁操作攻击我们的应用,这就是漏洞。以查询用户信息为例,id=-1的用户是肯定不存在的,但是现在有10000个请求,其中90...

2019-01-20 21:50:54 594

原创 TCP三次握手与四次挥手

关键字说明关键字说明SYN在建立链接的时候用来同步的序号。当SYN=1,ACK=0时,表示这是一段链接请求报文段。如果对方同意建立链接,则响应报文为SYN=1,ACK=1ACK用于确认字段,当ACK=1时确认字段有效,否则无效seq序列号,当发送一个数据的时候,数据会被拆分成多个数据包来发送,初始序列号随机生成,之后序列号对每个数据包进行递增编号,这样数据拆...

2019-01-14 18:36:32 147

原创 最通俗易懂的一致性哈希算法原理

再讨论一致性哈希之前,我们先来回顾一下缓存的演化历史:当我们的系统还是一个非常小的时候,对于用户的请求我们直接访问数据库就好了。当访问量到了一定数量的时候,我们使用缓存服务器,缓存一部分热数据来减轻数据库的压力,这便是最原始的阶段。

2019-01-08 01:05:52 2756 2

原创 LRU算法概述

前言互联网项目为了提升系统吞吐量,同时为了减少数据库的负载压力,通常会引入缓存,比如缓存用户的姓名、头像、等级等等之类的信息。在绝大部分的情况下(百万级用户),这么做都是没问题的,实现简单,同时也高效。但是当我们的系统用户量达到千万级以后,这么做就会遇到如下问题:占用内存过大,容易挤爆内存,同时内存又是非常稀缺有昂贵的资源针对用户信息进行全量缓存,并不一定所有的缓存都被利用,如果你们app...

2019-01-05 15:14:30 567

原创 为什么要有docker

在开发中我们经常会遇到这样的问题:我的代码在本地是好好的,为什么放到另一个环境上就跑不起来了呢?这时候就牵扯到了另一个因素**环境**。我们的开发环境受制很多因素,比如我用win或者mac os开发的,但是部署到了centos上面了,造成的环境影响。还有配置,数据库版本,等等一系列的问题。因为环境的不同,当运维拿到我们的代码的时候就会很头疼。所以急切的希望出现一种技术来统一这些环境。你开发就不要只提交代码给我了,把你的代码连着你的开发环境直接打包丢给我吧。或者说我来弄一套环境,你在我这上面开发。

2018-12-25 10:57:36 724 1

原创 java多线程——synchronize关键字详解

synchronize的基本使用在并发编程中synchronized一直承担的非常重要的作用,它有以下三种使用方式作用于普通方法,锁的是当前实例对象作用于静态方法,锁的是当前类的Class对象作用于同步方法块,锁的是synchronized括号里面的对象当一个线程访问一个同步代码块的时候,首先获得锁,只有当退出或抛出异常的时候,才会释放锁。那么它究竟是如何实现的呢?我们通过反编译如...

2018-12-24 23:28:45 733

原创 ZooKeeper ZAB原子广播协议

 在zookeeper中,主要依赖ZAB( ZooKeeper Atomic Broadcast , ZooKeeper 原子广播协议)协议来实现分布式数据一致性,基于该协议,zookeeper实现了一种主备模式的系统架构来保持集群中各个副本之间的数据一致性。 在zookeeper的集群中,采用一个单一的主进程来接收并处理客户端的事务请求,采用ZAB协议将服务器数据的状态变更以事务Pr...

2018-12-06 16:21:28 1800

Spring源码深度解析(第2版)带目录

Spring是一个源码开放的轻量级Java开发框架,旨在解决业务逻辑层和其他各层的松耦合问题。自从2003年推出以来,逐渐发展成为事实上的Java EE开发标准。多年来,Spring不但得到了广泛的应用,还直接或间接地影响了众多JSR规范的制定。

2019-02-26

Http权威指南(文字版)带目录

Http权威指南(文字版)带目录,本书是 HTTP 及其相关核心 Web 技术方面的权威著作,主要介绍了 Web 应用程序是如何 工作的,核心的因特网协议如何与架构构建块交互,如何正确实现因特网客户端和服务器等。 本书适合所有想了解 HTTP 和 Web 底层结构的人阅读。

2018-09-04

模拟测试框架Mockito简明教程

Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取比较复杂的对象(如 JDBC 中的ResultSet 对象),用一个虚拟的对象(Mock 对象)来创建以便测试的测试方法。

2017-10-28

《PAXOS到ZOOKEEPER分布式一致性原理与实践》高清完整PDF版

PAXOS到ZOOKEEPER分布式一致性原理与实践,学习zookeeper必备书

2017-10-18

Redis-3.0.0

redis

2017-04-19

阿里巴巴Java开发手册(正式版)

阿里巴巴Java开发手册(正式版)

2017-02-12

java发送电子邮件代码

javaMail实现java发送电子邮件代码

2016-10-31

urlrewriter页面伪静态化jar包

urlrewriter技术。让jsp页面伪静态化所需的jar包,增加项目的安全性。

2016-05-10

多项式计算器C语言版本

多项式计算器代码 里面有 中缀转后缀的代码 注释应该可以

2015-05-31

空空如也

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

TA关注的人

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