自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(64)
  • 收藏
  • 关注

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

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

2018-09-10 22:56:10 7244 3

原创 Redis 的内存分配

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

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

原创 Redis GEO的使用

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

2018-09-07 11:12:37 2693

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

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

2018-09-06 09:57:53 895

原创 Redis Bitmaps的使用

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

2018-09-06 09:56:51 1041

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

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

2018-09-04 13:31:37 1829

原创 Redis的事务机制

昨天介绍了Redis Pipeline,Pipeline能帮我们组装命令一次发送给Redis,但是Pipeline中的命令不具有原子性,所以如果我们需要自己组装一个原子性的操作,使用Pipeline是无法实现的,庆幸的是Redis提供了事物和支持Lua脚本来实现原子性操作。今天我们来了解一下Redis事物。很多关系型数据库都支持事物操作,保证在一个事物内的操作是原子性的,要么都执行,要么都...

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

原创 Redis Pipeline 批处理任务

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

2018-09-02 01:22:26 1094

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

今天主要讲两个东西,一个是Redis的多个db机制,另一个是渐进式遍历。首先来讲一下Redis的多个db机制Redis中有个默认配置databases 16这个配置表示Redis启动后将有16个数据库,select 0 操作将切换到第一个数据库,select 15 将切换到最后一个数据库。每个数据库的数据之间没有任何关联,key都独立存在。多个数据库起到了一个隔离key...

2018-08-30 23:45:40 2452

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

一、Stringvalue是字符串类型。1.常用命令set key value:设置key、valuesetex key seconds value:设置key、value,有效期seconds秒setnx key value:设置key、value,如果key存在则setnx失败,返回 0 (set key value nx等价)set key value xx:设置ke...

2018-08-30 00:39:44 1489

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

Redis效率高的主要原因有下面几个:基于内存操作,速度非常快采用单线程,避免了上下文的切换导致消耗CPU采用单线程,不用去考虑各种加锁释放锁的问题使用IO多路复用模型,非阻塞IORedis采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由C语言编写,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。这个数据不比采用单进程多线程的同样基于内存的 K...

2018-08-29 10:46:27 4220

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

1、流、IO、文件描述符文件其实就是一串二进制流,而不论是文件、socket还是pipe等进行IO操作的我们都可以称之为“流”。通常在信息交互的过程中,我们会对流进行数据的收发操作,可以称之为IO(input/output),从流中读取数据使用输出流,往流中写入数据使用输入流。文件描述符(file descriptor)又叫fd,是一个非负整数,打开或新建文件的时候,内核会返回一个文件...

2018-08-28 22:40:43 465

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

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

2018-08-27 22:06:29 1286

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

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

2018-08-23 23:25:46 376

原创 HashTable源码分析

1、HashTable概述HashTable以key-value形式存储数据,key不允许为null,value也不允许为null。HashTable线程安全。HashTable对大量的方法都添加synchronized锁,所以性能不高。HashTable底层是数组,又被称为hash桶,每个桶中存放的是链表,链表中的节点存储着集合中的元素。当HashTable中的元素数量达到t...

2018-08-22 22:40:43 414

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

一、HashMap概述1、HashMap概述HashMap以key-value形式存储数据,key允许为null,value也允许为null。HashMap线程不安全,需要线程安全的HashMap可以使用ConcurrentHashMap。HashMap底层是数组,又被称为hash桶,每个桶中存放的是链表,链表中的节点存储着集合中的元素。JDK 1.8中当hash桶中链表长度达...

2018-08-22 17:29:19 1055

原创 GC和对象的内存分配

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

2018-08-21 17:22:54 925

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

我们都知道Java虚拟机会去回收”死亡”的对象,那么这个”回收 “是怎么回收的呢?下面介绍几种垃圾收集的基本算法常见的垃圾收集基本算法1、标记-清除算法(Mark-Sweep)标记-清除算法分为”标记”和”清除”两个部分。标记:在前面文章finalize()方法总结中已经总结过标记算法,这里就不再赘述了。简单理解一下就是虚拟机经过两次标记找出真正”死亡”的对象。清除...

2018-08-21 17:21:33 361

原创 HashMap扩容死循环问题

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

2018-08-21 17:18:47 8769 5

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

Java中的位运算有七种:<< 左移>> 右移>>> 无符号右移& 位与| 位或~ 位非^ 位异或其中位非(~)是一元运算符,其他六个都是二元运算符。这些位运算符都是作用在二进制的数上的,先列一个表描述一下这几种位运算符:下面来一一介绍一下这几种位运算符位运算符介绍1...

2018-08-21 17:17:18 19639 13

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

引用计数器算法引用计数器算法是通过一个计数器来实现的: - 给每个对象添加一个引用计数器 - 如果新增一个引用,那么引用计数器加一 - 如果失去一个引用,那么引用计数器减一 - 如果引用计数器等于零,那么理解为这个对象死亡这就是引用计数器算法,实现简单并且判定效率高,但是这个算法存在一个致命的问题,会导致内存泄漏。先看下面的例子:1 public class Refe...

2018-08-21 17:10:40 552

原创 finalize()方法总结

class Object { ... protected void finalize() throws Throwable { }}finalize()方法是Object类的一个protected方法,所以所有的类都可以调用Object类的finalize()方法,也可以自己去重写finalize()方法。GC对不可达对象的两次扫描首先需要知道的是大多数虚拟机会使...

2018-08-13 23:31:05 1882 1

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

我们经常会说某个引用指向某个实例对象,这里的”引用”通常指的是强引用,在Java中还有软引用、如哦引用和虚引用。下面我们来了解一下这四种引用。强引用(Strong Reference)通常我们Object obj = new Object();像obj这样的引用被称为强引用,也是我们Java开发中最多使用到的引用方式。这种引用只要还存在,垃圾收集器就不会回收该引用指...

2018-08-13 21:27:51 179

原创 事物的四种隔离级别

说到事物,一般的文章会从ACID开始讲,一直讲到事物的传播特性。今天这篇文章就讲事物的隔离级别,不讲ACID,也不讲事物的传播特性。在讲事物的隔离级别之前先来了解一下事物并发情况下可能会出现的三个问题,了解了这三个问题后,那么事物的隔离级别就很好理解了。事物并发可能会引起的问题脏读脏读指的是一个事物可以读取到另一个未提交事物的数据。举个例子:A向B转账1000元...

2018-08-10 23:42:09 1539

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

缓存服务器有一个很重要的指标就是能否持久化,如果缓存服务器不支持持久化的话,一些相对重要的数据都不能存在缓存服务器中了,毕竟谁也不能保证服务百分百可用,一旦缓存服务器宕机,所有数据就都丢失了。今天来分享一下Redis的持久化两种持久化方式RDB和AOF。1、RDBRDB(redis database),可以理解为快照/内存快照,RDB持久化过程是将当前进程中的数据生成快照存储到硬盘...

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

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

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

2018-08-08 23:56:31 642

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

说到Java的序列化,大多数人都知道使用ObjectOutputStream将对象写成二进制流,再使用ObjectInputStream将二进制流写成文件实现序列化和反序列化。今天这篇文章将深入分析一下序列化。1.Serializable通常我们序列化一个对象的目的是为了可以再序列化回来,使用场景有很多,比如说: - 把对象保存到文件中,然后可以再恢复 - 使用网络IO传递一个对象 ...

2018-08-08 23:48:00 9607 1

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

什么是微服务微服务一种系统架构的设计风格,主旨是将原本复杂的系统拆分成多个独立的小型服务,每个服务维护着自身的业务逻辑、数据处理以及部署,服务和服务之间通过简单的通信协议进行通信(比如说Restful API),不要求每个微服务使用同一种变成语言编写。单体服务和微服务的优缺点微服务的概念上面已经介绍了,至于单体服务,就是我们企业系统架构中目前常用的一个单体项目,分为前端-后端-数据...

2018-08-07 20:01:50 2866

原创 Spring Boot自动配置的原理

简单介绍Spring Boot首先先给大家简单介绍一下Spring Boot直接上Spring Boot官方文档的介绍 - Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”. - We take an o...

2018-08-07 20:00:33 477

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

归并排序算法原理归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。算法分析排序的思想就是将元素无限拆分,直到无可拆分为止,再将拆分的元素两两按序合并。归并排序的原理可以通过下面这张图看清楚:代码实现/** * @Title: mergeSort ...

2018-08-07 19:58:15 5063

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

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

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

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

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

2018-08-07 19:57:13 10228 1

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

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

2018-08-07 19:56:37 14835 8

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

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

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

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

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

2018-08-06 20:56:45 330

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

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

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

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

缓存穿透、缓存并发和缓存雪崩是常见的由高并发引起的缓存问题,而缓存预热是缓存雪崩的一种解决方案。这篇文章将来带大家讲解一下这四个概念。1.缓存穿透缓存穿透指的是并发使用大量缓存中不存在的key进行查询,由于缓存无法命中,大量的查询会穿过缓存直接查询数据库,使得数据库压力太大,导致数据库可能被拖垮。一般是受到了恶意的攻击才会导致这种问题,所以一旦遇到了缓存穿透的问题就会非常棘手,...

2018-08-05 14:18:21 513

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

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

2018-08-02 22:42:17 419

原创 Java集合基本介绍

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

2018-08-02 22:41:17 298

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

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

2018-08-02 22:40:48 884 5

空空如也

空空如也

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

TA关注的人

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