自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 Redis的内存上限和内存回收策略

上一篇文章讲到了Redis的内存分配和简单的Redis内存查看,今天这篇文章带来Redis的内存上限管理和Redis的内存回收策略。 内存上限 Redis可以通过 maxmemory 参数来限制最大可用内存,主要为了避免Redis内存超过操作系统内存,从而导致服务器响应变慢甚至死机的情况。...

2018-09-10 22:56:10 4614 2

原创 Redis 的内存分配

我们都知道Redis是基于内存的一个数据库,那么Redis是怎么管理内存的呢?今天这篇文章主要分享一下Redis的内存分配和简单的查看Redis内存使用情况。 内存分配 Redis进程的内存消耗主要包括:自身内存 + 对象内存 + 缓冲内存 + 内存碎片。 1 自身内存 Redis...

2018-09-10 22:55:23 3583 1

原创 Redis GEO的使用

Redis 3.2提供了GEO功能,支持存储地理位置信息用来实现类似微信中附近的人的功能,使用起来十分方便。 下面简单介绍一下Redis中几个和GEO相关的命令 1.添加地理位置 geoadd key long lat member [longitude latitude membe...

2018-09-07 11:12:37 1446 0

原创 Redis HyperLogLog 用于记录独立总数

HyperLogLog是Redis支持的一种数据结构,使用基数算法来完成独立总数的统计。这里先来介绍一下基数算法。 基数是指一个集合中,不同的数的个数。基数算法是估计一个集合中不同的数的个数,不是数据总量的估计,也不是基数的精确计算。而是用概率算法的思想,来用低空间和时间成本,以一个很低的误差度...

2018-09-06 09:57:53 410 0

原创 Redis Bitmaps的使用

Bitmaps是Redis支持的一种数据结构,value是一个长字符串,字符串上每一个字符的值只能是 0 或 1。看起来像是一个二进制的数据结构,其实只是一个字符串,所以严格来说Bitmaps并不是一个新的数据结构,而是一个符合特殊约定的字符串。 下面先来看一下Redis中和Bitmaps相关的...

2018-09-06 09:56:51 485 0

原创 Redis Lua脚本的使用,自定义命令解决分布式锁的抢占

一、Lua 的介绍 Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入到应用程序中,从而为应用程序提供灵活的扩展和定制功能。 Lua 的特性 - 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。 - ...

2018-09-04 13:31:37 720 0

原创 Redis的事务机制

昨天介绍了Redis Pipeline,Pipeline能帮我们组装命令一次发送给Redis,但是Pipeline中的命令不具有原子性,所以如果我们需要自己组装一个原子性的操作,使用Pipeline是无法实现的,庆幸的是Redis提供了事物和支持Lua脚本来实现原子性操作。 今天我们来了解一下R...

2018-09-03 10:25:32 4326 2

原创 Redis Pipeline 批处理任务

今天分享一个Redis的小功能,Pipeline(流水线)。Pipeline能够将一组Redis命令组装起来,通过一次请求发给Redis服务端,Redis服务端执行完这些命令之后再将这些命令的结果一次性返回给客户端。 Redis执行一条命令分为四个步骤: 发送命令 命令排队 命令执行 返回结...

2018-09-02 01:22:26 559 0

原创 Redis的多个db机制和渐进式遍历scan命令

今天主要讲两个东西,一个是Redis的多个db机制,另一个是渐进式遍历。 首先来讲一下Redis的多个db机制 Redis中有个默认配置 databases 16 这个配置表示Redis启动后将有16个数据库,select 0 操作将切换到第一个数据库,select 15 将切换到...

2018-08-30 23:45:40 1224 0

原创 Redis六种基本数据结构的操作

一、String value是字符串类型。 1.常用命令 set key value:设置key、value setex key seconds value:设置key、value,有效期seconds秒 setnx key value:设置key、value,如果key存在则setn...

2018-08-30 00:39:44 680 0

原创 为什么说Redis单线程效率高

Redis效率高的主要原因有下面几个: 基于内存操作,速度非常快 采用单线程,避免了上下文的切换导致消耗CPU 采用单线程,不用去考虑各种加锁释放锁的问题 使用IO多路复用模型,非阻塞IO Redis采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由C语言编写,官方提供的数据是...

2018-08-29 10:46:27 3013 0

原创 阻塞IO、非阻塞IO、同步IO、异步IO、IO多路复用模型

1、流、IO、文件描述符 文件其实就是一串二进制流,而不论是文件、socket还是pipe等进行IO操作的我们都可以称之为“流”。 通常在信息交互的过程中,我们会对流进行数据的收发操作,可以称之为IO(input/output),从流中读取数据使用输出流,往流中写入数据使用输入流。 文件描述...

2018-08-28 22:40:43 182 0

原创 缓存和数据库数据一致性

1、产生缓存和数据库数据一致性问题的问题 当我们数据库压力大的时候可以对数据库做读写分离,主库负责写操作,从库负责读操作,主从数据库之间采用二进制日志文件来同步数据。 还有另一种解决方案是使用缓存,通常我们使用缓存的姿势是查询直接从缓存中取,缓存中没有则去数据库取,数据库取到结果之后再塞到缓存...

2018-08-27 22:06:29 801 0

原创 类加载和双亲委派模型

1、类加载器 类加载器的作用是加载类到虚拟机内存。 在JVM中表示两个class对象是否为同一个类对象存在两个必要条件 - 类的完整类名必须一致,包括包名。 - 加载这个类的类加载器(ClassLoader)必须相同。 也就是说,在JVM中,即使这个两个类对象(class对象)来源同一个...

2018-08-23 23:25:46 181 0

原创 HashTable源码分析

1、HashTable概述 HashTable以key-value形式存储数据,key不允许为null,value也不允许为null。 HashTable线程安全。 HashTable对大量的方法都添加synchronized锁,所以性能不高。 HashTable底层是数组,又被称为has...

2018-08-22 22:40:43 123 0

原创 HashMap源码分析,基于1.8,对比1.7

一、HashMap概述 1、HashMap概述 HashMap以key-value形式存储数据,key允许为null,value也允许为null。 HashMap线程不安全,需要线程安全的HashMap可以使用ConcurrentHashMap。 HashMap底层是数组,又被称为hash...

2018-08-22 17:29:19 545 0

原创 GC和对象的内存分配

昨天我们聊到了新生代、老年代,也聊到了Monitor GC,那么今天就再详细讲一下Monitor GC和Full GC、内存的分配、新生代往老年代的转移以及触发一次Monitor GC的执行流程。 1、Monitor GC和Full GC 我们先来了解一下什么是Monitor GC和Ful...

2018-08-21 17:22:54 221 0

原创 垃圾收集使用的基本算法

我们都知道Java虚拟机会去回收”死亡”的对象,那么这个”回收 “是怎么回收的呢? 下面介绍几种垃圾收集的基本算法 常见的垃圾收集基本算法 1、标记-清除算法(Mark-Sweep) 标记-清除算法分为”标记”和”清除”两个部分。 标记:在前面文章finalize()方法总结中已...

2018-08-21 17:21:33 109 0

原创 HashMap扩容死循环问题

JDK 1.7 HashMap 扩容核心算法 下面这是JDK 1.7中HashMap扩容时调用的核心代码,作用是将原hash桶中的节点转移到新的hash桶中: void transfer(Entry[] newTable) { Entry[] src = table; in...

2018-08-21 17:18:47 5928 2

原创 位运算符以及常见的使用场景

Java中的位运算有七种: << 左移 >> 右移 >>> 无符号右移 & 位与 | 位或 ~ 位非 ^ 位异或 其中位非(~)是一元运算符,...

2018-08-21 17:17:18 7073 4

原创 GC怎么判断对象死亡的

引用计数器算法 引用计数器算法是通过一个计数器来实现的: - 给每个对象添加一个引用计数器 - 如果新增一个引用,那么引用计数器加一 - 如果失去一个引用,那么引用计数器减一 - 如果引用计数器等于零,那么理解为这个对象死亡 这就是引用计数器算法,实现简单并且判定效率高,但是这个算法存...

2018-08-21 17:10:40 292 0

原创 finalize()方法总结

class Object { ... protected void finalize() throws Throwable { } } finalize()方法是Object类的一个protected方法,所以所有的类都可以调用Object类的finalize()方法,也可以自己...

2018-08-13 23:31:05 675 0

原创 强引用、软引用、弱引用、虚引用

我们经常会说某个引用指向某个实例对象,这里的”引用”通常指的是强引用,在Java中还有软引用、如哦引用和虚引用。 下面我们来了解一下这四种引用。 强引用(Strong Reference) 通常我们 Object obj = new Object(); 像obj这样的引用被称为强...

2018-08-13 21:27:51 74 0

原创 事物的四种隔离级别

说到事物,一般的文章会从ACID开始讲,一直讲到事物的传播特性。 今天这篇文章就讲事物的隔离级别,不讲ACID,也不讲事物的传播特性。 在讲事物的隔离级别之前先来了解一下事物并发情况下可能会出现的三个问题,了解了这三个问题后,那么事物的隔离级别就很好理解了。 事物并发可能会引起的问题 ...

2018-08-10 23:42:09 669 0

原创 深入Redis的RDB和AOF两种持久化方式以及AOF重写机制的分析

缓存服务器有一个很重要的指标就是能否持久化,如果缓存服务器不支持持久化的话,一些相对重要的数据都不能存在缓存服务器中了,毕竟谁也不能保证服务百分百可用,一旦缓存服务器宕机,所有数据就都丢失了。 今天来分享一下Redis的持久化两种持久化方式RDB和AOF。 1、RDB RDB(redis...

2018-08-09 22:14:05 3900 1

原创 详解String类和intern()方法

一直很喜欢一句话,如果你不能向一个六岁的孩子解释清楚,那么其实你自己根本没弄懂。这句话很适合我们这些技术人,程序员的世界里不应该出现模糊的概念,遇到一些拿捏不准的东西需要及时理解透彻。 String类是我们每天需要使用到无数次的对象,工作中直接拿来用就好了,很少会再去细细的琢磨琢磨String,这...

2018-08-08 23:56:31 330 0

原创 深入了解序列化writeObject、readObject、readResolve

说到Java的序列化,大多数人都知道使用ObjectOutputStream将对象写成二进制流,再使用ObjectInputStream将二进制流写成文件实现序列化和反序列化。今天这篇文章将深入分析一下序列化。 1.Serializable 通常我们序列化一个对象的目的是为了可以再序列化回来,...

2018-08-08 23:48:00 2697 0

原创 什么是微服务,微服务相对于单体服务的利弊

什么是微服务 微服务一种系统架构的设计风格,主旨是将原本复杂的系统拆分成多个独立的小型服务,每个服务维护着自身的业务逻辑、数据处理以及部署,服务和服务之间通过简单的通信协议进行通信(比如说Restful API),不要求每个微服务使用同一种变成语言编写。 单体服务和微服务的优缺点 微服务...

2018-08-07 20:01:50 1821 0

原创 Spring Boot自动配置的原理

简单介绍Spring Boot 首先先给大家简单介绍一下Spring Boot 直接上Spring Boot官方文档的介绍 - Spring Boot makes it easy to create stand-alone, production-grade Spring based App...

2018-08-07 20:00:33 206 0

原创 归并排序算法、时间复杂度和稳定性

归并排序 算法原理 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 算法分析 排序的思想就是将元素无限拆分,直到无可拆分为止,再将拆分的元素两两按序合并。 归并排序的原理可以...

2018-08-07 19:58:15 2204 0

原创 快速排序算法、时间复杂度和稳定性

快速排序 算法原理 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 解法一 算法分析 排序的思想就是先选择一个基数,通过一...

2018-08-07 19:57:42 3373 2

原创 插入排序算法、时间复杂度和稳定性

插入排序 算法原理 将数据分为有序部分和无序部分。 在无序部分选择一个元素,按照顺序插入到有序部分,使之有序。 直到无序部分都插入到有序部分结束。 算法分析 排序的思想就是维护一个有序的部分,将无序部分的数据按照顺序插入到有序部分。 通俗的讲,插入排序的原理就是: 先将最后...

2018-08-07 19:57:13 5970 0

原创 选择排序算法、时间复杂度和稳定

选择排序 算法原理 将数据分为有序部分和无序部分。 在无序部分找出最大的元素,将最大的元素和无序部分最后一个元素交换,使得无序部分最后一个元素并入有序部分。 重复第二步,直到无序部分都插入到有序部分结束。 算法分析 排序的思想就是维护一个有序的部分,将无序部分中最大的元素和最后...

2018-08-07 19:56:37 7574 3

原创 冒泡排序算法、时间复杂度和稳定性

冒泡排序 冒泡排序一般是我们学习排序算法时第一个接触的算法,下面来介绍一下冒泡排序。 算法原理 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一步,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了...

2018-08-07 19:55:51 13395 1

原创 JDK动态代理和CGlib代理的区别

我们通常说的动态代理主要有JDK的动态代理和CGLIB代理,Spring的AOP也是基于这两种代理实现的。 下面我们先从代码上来了解一下这两种代理。 被代理类 public class Teacher implements Person { public void slee...

2018-08-06 20:56:45 76 0

原创 如何判断一个单链表是否有环以及环入口

这是一个在我们学习数据结构的时候经常会遇到的问题,今天给大家带来这个问题的几种解法。 方法一 最容易想到的办法就是遍历单链表,如果单链表有环的话那么会进入死循环,但是我们不知道单链表的长度,所以如果单链表长度很长,我们一直向下遍历,也无法分辨出是单链表还没遍历完还是进入了死循环。 所以这...

2018-08-05 14:18:55 5030 4

原创 缓存穿透、缓存并发、缓存雪崩、缓存预热

缓存穿透、缓存并发和缓存雪崩是常见的由高并发引起的缓存问题,而缓存预热是缓存雪崩的一种解决方案。 这篇文章将来带大家讲解一下这四个概念。 1.缓存穿透 缓存穿透指的是并发使用大量缓存中不存在的key进行查询,由于缓存无法命中,大量的查询会穿过缓存直接查询数据库,使得数据库压力太大,导致数...

2018-08-05 14:18:21 331 0

原创 了解一下一致性Hash算法

引子 我们在做分布式缓存的时候,通常会对需要存储key进行一定的算法,然后使该key均匀的落到每一个节点进行存储。 最简单的实现算法是普通余数Hash算法,按照节点数量,对key的hashCode进行取余,根据结果将key随机分配到不同节点上。 举个例子: 假设缓存服务器有三个节点,我们标...

2018-08-02 22:42:17 78 0

原创 Java集合基本介绍

在Java中我们经常使用到集合,集合是帮我们存储数据的,可以理解为一个容器。 在JDK中集合类都在java.util包中,下面按照容器特性区分一下我们常用的集合: - Collection: 集合中存储的是普通对象 - List: 有序,可重复 - Set:不可重复 ...

2018-08-02 22:41:17 107 0

原创 单例模式的几种实现方式

1.饿汉 如果应用程序总是创建并使用单例实例或在创建和运行时开销不大 class Single { private Single(){} private static Single single= new Single(); public static Si...

2018-08-02 22:40:48 263 0

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