
theory
霁空
这个作者很懒,什么都没留下…
展开
-
Redis内存模型
我们使用 Redis 时,会接触 Redis 的 5 种对象类型(字符串、哈希、列表、集合、有序集合),丰富的类型是 Redis 相对于 Memcached 等的一大优势。在了解 Redis 的 5 种对象类型的用法和特点的基础上,进一步了解 Redis 的内存模型,对 Redis 的使用有很大帮助,例如: 估算 Redis 内存使用量。目前为止,内存的使用成本仍然相对较高,使用内存不能...转载 2019-09-26 11:02:13 · 92 阅读 · 0 评论 -
Java 中 long 和 double 的原子性?
JVM中对long的操作是不是原子操作? 为什么对long的操作不是原子的? 在硬件,操作系统,JVM都是64位的情况下呢? java中基本类型中,long和double的长度都是8个字节,32位(4字节)处理器对其读写操作无法一次完成,那么,JVM,long和double是原子性的吗?JVM中对long的操作是不是原子操作?首先,通过一段程序...转载 2019-08-26 16:53:10 · 247 阅读 · 0 评论 -
Tomcat中的类是怎么被一步步加载的
说到本篇的Tomcat类加载机制,不得不说翻译学习Tomcat的初衷。之前实习的时候学习JavaMelody的源码,但是它是一个Maven的项目,与我们自己的Web项目整合后无法直接断点调试。后来同事指导,说是直接把Java类复制到src下就可以了。很纳闷....为什么会优先加载src下的Java文件(编译出的class),而不是jar包中的class呢?现在了解Tomcat的类加载机制,...转载 2019-08-26 15:58:42 · 106 阅读 · 0 评论 -
Redis 的各项功能解决了哪些问题?
先看一下Redis是一个什么东西官方简介解释到:Redis是一个基于BSD开源的项目,是一个把结构化的数据放在内存中的一个存储系统,你可以把它作为数据库,缓存和消息中间件来使用。同时支持strings,lists,hashes,sets,sorted sets,bitmaps,hyperloglogs和geospatial indexes等数据类型。它还内建了复制,lua脚本,LRU...转载 2019-08-26 10:36:50 · 86 阅读 · 0 评论 -
JVM - 垃圾回收器
图解HotSpot虚拟机所包含的收集器:图中展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,则说明它们可以搭配使用。虚拟机所处的区域则表示它是属于新生代还是老年代收集器。新生代收集器:Serial、ParNew、Parallel Scavenge老年代收集器:CMS、Serial Old、Parallel Old整堆收集器: G1几个相关概念:并行收...转载 2019-08-16 15:10:29 · 180 阅读 · 0 评论 -
并行和并发的区别
exp:你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。(不一定是同时的)你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。所以我...转载 2019-08-16 11:09:01 · 127 阅读 · 0 评论 -
关于Java对象作为参数传递是传值还是传引用的问题
前言 在Java中,当对象作为参数传递时,究竟传递的是对象的值,还是对象的引用,这是一个饱受争议的话题。若传的是值,那么函数接收的只是实参的一个副本,函数对形参的操作并不会对实参产生影响;若传的是引用,那么此时对形参的操作则会影响到实参。 首先我们来看一句代码:这句话的意思是:创建一个Object对象,再创建一个名为obj的引用,让这个引用指向这个对象,如下图所示:...转载 2019-08-19 17:25:45 · 140 阅读 · 0 评论 -
java 中 Final修饰符
一、使用Final修饰符修饰的类的特点:该类不能有子类;二、使用Final修饰符修饰的对象的特点:该对象的引用地址不能改变;三、使用Final修饰符修饰的方法的特点:该方法不能被重写;四、使用Final修饰符修饰的变量的特点:该变量会变成常亮,值不能被改变。...转载 2019-08-14 15:37:18 · 91 阅读 · 0 评论 -
JVM - TLAB
JVM内存结构,是很重要的知识,相信每一个静心准备过面试的程序员都可以清楚的把堆、栈、方法区等介绍的比较清楚。上图,是一张在作者根据《Java虚拟机规范(Java SE 8)》中描述的JVM运行时内存区域结构画的。很多人都知道Java对象是在堆内存中分配空间的(JIT优化除外),也知道内存分配过程中是线程安全的,那么虚拟机到底是如何保证线程安全的呢?本文就来简单介绍一下。...转载 2019-08-05 18:04:06 · 1808 阅读 · 0 评论 -
Java容器 - HashMap, ConcurrentHashMap 原理及源码详解
网上关于 HashMap 和 ConcurrentHashMap 的文章确实不少,不过缺斤少两的文章比较多,所以才想自己也写一篇,把细节说清楚说透,尤其像 Java8 中的 ConcurrentHashMap,大部分文章都说不清楚。终归是希望能降低大家学习的成本,不希望大家到处找各种不是很靠谱的文章,看完一篇又一篇,可是还是模模糊糊。阅读建议:四节基本上可以进行独立阅读,建议初学者可按照...转载 2019-08-27 21:14:07 · 154 阅读 · 0 评论 -
volatile关键字的作用、原理
volatile关键字的作用、原理在只有双重检查锁,没有volatile的懒加载单例模式中,由于指令重排序的问题,我确实不会拿到两个不同的单例了,但我会拿到“半个”单例。而发挥神奇作用的volatile,可以当之无愧的被称为Java并发编程中“出现频率最高的关键字”,常用于保持内存可见性和防止指令重排序。保持内存可见性内存可见性(Memory Visibility):所有线程都能...转载 2019-08-27 21:49:03 · 119 阅读 · 0 评论 -
MySQL中锁机制超详细解析
锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。防止更新丢失,并不能单靠数据库事务控制器来解决,需要应用程序对...转载 2019-08-29 10:50:53 · 798 阅读 · 1 评论 -
如何设计实现一个通用的分布式事务框架?
一个TCC事务框架需要解决的当然是分布式事务的管理。关于TCC事务机制的介绍,可以参考TCC事务机制简介。TCC事务模型虽然说起来简单,然而要基于TCC实现一个通用的分布式事务框架,却比它看上去要复杂的多,不只是简单的调用一下Confirm/Cancel业务就可以了的。本文将以Spring容器为例,试图分析一下,实现一个通用的TCC分布式事务框架需要注意的一些问题。一、TCC全局事...转载 2019-09-06 10:37:43 · 218 阅读 · 0 评论 -
如何设计一个完美的权限管理模块?
我们比较常见的就是基于角色的访问控制,用户通过角色与权限进行关联。简单地说,一个用户拥有多个角色,一个角色拥有多个权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间、角色与权限之间,通常都是多对多的关系。如下图:基于这个,得先了解角色到底是什么?我们可以理解它为一定数量的权限的集合,是一个权限的载体。例如:一个论坛的“管理员”、“版主”,它们都是...转载 2019-09-05 14:57:15 · 173 阅读 · 0 评论 -
高并发场景下的缓存有哪些常见的问题?
一、缓存一致性问题当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。这就比较依赖缓存的过期和更新策略。一般会在数据发生更改的时,主动更新缓存中的数据或者移除对应的缓存。二、缓存并发问题缓存过期后将尝试从后端数据库获取数据,这是一个看似合理的流程。但是,在高并发场景下,有可能多个请求并发的去从数据库...转载 2019-09-05 11:44:10 · 114 阅读 · 0 评论 -
TCP三次握手与四次挥手
在面试中,三次握手和四次挥手可以说是问的最频繁的一个知识点了,我相信大家也都看过很多关于三次握手与四次挥手的文章,今天的这篇文章,重点是围绕着面试,我们应该掌握哪些比较重要的点,哪些是比较被面试官给问到的,我觉得如果你能把我下面列举的一些点都记住、理解,我想就差不多了。三次握手当面试官问你为什么需要有三次握手、三次握手的作用、讲讲三次三次握手的时候,我想很多人会这样回答:首先很多人会先...转载 2019-09-03 10:53:32 · 92 阅读 · 0 评论 -
缓存与数据库的双写一致性
分布式缓存是现在很多分布式应用中必不可少的组件,但是用到了分布式缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题?Cache Aside Pattern最经典的缓存+数据库读写的模式,就是 Cache Aside Pattern。读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。更新的时候,...转载 2019-09-02 21:05:56 · 102 阅读 · 0 评论 -
图解“红黑树”原理
今天我们要说的红黑树就是就是一棵非严格均衡的二叉树,均衡二叉树又是在二叉搜索树的基础上增加了自动维持平衡的性质,插入、搜索、删除的效率都比较高。红黑树也是实现 TreeMap 存储结构的基石。二叉搜索树二叉搜索树又叫二叉查找树、二叉排序树,我们先看一下典型的二叉搜索树,这样的二叉树有何规则特点呢?二叉搜索树有如下几个特点: 节点的左子树小于节点本身 节...转载 2019-08-29 16:11:58 · 218 阅读 · 0 评论 -
API 网关从入门到放弃
前言假设你正在开发一个电商网站,那么这里会涉及到很多后端的微服务,比如会员、商品、推荐服务等等。那么这里就会遇到一个问题,APP/Browser怎么去访问这些后端的服务? 如果业务比较简单的话,可以给每个业务都分配一个独立的域名(https://service.api.company.com),但这种方式会有几个问题: 每个业务都会需要鉴权、限流、权限校验等逻辑,如果每...转载 2019-08-29 15:54:17 · 182 阅读 · 0 评论 -
软件交付的演进历程
开始阶段软件开发刚开始的时候,并没有很好的经验或思想来指导一个开发项目的运行。最开始,人们标识出软件开发的一些关键假设,映射到那时已有的可理解的流程上。最初的假设如下: 软件开发需要很长的时间 软件发布不会频繁 软件构建后很难进行更改,所以确保第一次把事情做对 软件开发需要很多不同的、成本高昂的技能集 建筑行业也有着类似的假设。建筑需要很长的时间...转载 2019-08-29 14:58:17 · 1554 阅读 · 0 评论 -
数据库索引底层原理
转载:https://mp.weixin.qq.com/s/QzJUWqa51uAQJcXPAqoC9g二叉树到平衡二叉树,再到 B- 树,最后到 B+ 树来一步一步了解数据库索引底层的原理!二叉树(Binary Search Trees)二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(Left Subtree)和“右子树”(Right Subtree)。二叉树常...转载 2019-07-23 15:37:19 · 1172 阅读 · 0 评论 -
设计模式-原则-接口隔离
转载:作者:皮皮的雅客 原文:https://blog.youkuaiyun.com/king123456man/article/details/81626059什么是接口隔离原则(Interface Segregation Principle, ISP) 接口对于Java开发者来说都不陌生,它几乎存在于每一个Java程序中,是抽象的代名词。在讲接口隔离原则之前,先说说接口,接口分为以下两种...转载 2019-07-27 16:24:49 · 148 阅读 · 0 评论 -
短 URL 服务的设计与实现
转载:https://mp.weixin.qq.com/s/DJM7KFFfgZ2AgfrrYHXSzQ短url的好处有: 短. 短信和许多平台(微博)有字数限制,太长的链接加进去都没有办法写正文了. 好看. 比起一大堆不知所以的参数,短链接更加简洁友好. 方便做一些统计.你点了链接会有人记录然后分析的. 安全. 不暴露访问参数. 这就是为什么我们现...转载 2019-07-25 14:56:16 · 886 阅读 · 0 评论 -
用Redis做实时订阅推送
转载:www.cnblogs.com/linlinismine/p/9214299.html有一个功能叫做领劵的订阅推送。什么是领劵的订阅推送?就是用户订阅了该劵的推送,在可领取前的一分钟就要把提醒信息推送到用户的app中。本来这个订阅功能应该是消息中心那边做的,但他们说这个短时间内做不了。所以让我这个负责优惠劵的做了-.-!。具体方案就是到具体的推送时间点了,coupon系统调用消...转载 2019-07-25 11:11:28 · 199 阅读 · 0 评论 -
JVM - 内存区域
转载:https://www.cnblogs.com/vinsen/p/7873495.html一. 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. Java虚拟机所管理的内存将会包括以下几个运行时数据区域: 1...转载 2019-07-29 17:47:16 · 118 阅读 · 0 评论 -
微服务架构之「 容器技术 」
转载:https://mp.weixin.qq.com/s/sm5t5razuN6D1OgTlfzJKg现在一聊到容器技术,大家就默认是指 Docker 了。但事实上,在 Docker 出现之前,PaaS社区早就有容器技术了,以 Cloud Foundry、OpenShift 为代表的就是当时的主流。那为啥最终还是 Docker 火起来了呢?因为传统的PaaS技术虽然也可以一...转载 2019-07-19 16:38:52 · 136 阅读 · 0 评论 -
JVM - 虚拟机
转载:https://www.cnblogs.com/guchunchao/p/10497177.html1. Sun Classic VM jdk1.0 第一款商用虚拟机。 只能使用纯解释器来运行Java代码。没有自己的判断,会把每一个方法每一行代码都编译,效率不好。导致大家普遍认为Java代码运行效率比较慢。 使用jit编译器的话需要外挂完全接管虚拟机的执...转载 2019-07-23 20:54:45 · 147 阅读 · 0 评论 -
为什么要前后端分离
转载:https://jianshu.com/p/c86cee16b418一、前戏前后端分离已成为互联网项目开发的业界标准使用方式,通过nginx+tomcat的方式(也可以中间加一个nodejs)有效的进行解耦,并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务(多种客户端,例如:浏览器,车载终端,安卓,IOS等等)打下坚实的基础。这个步骤是系统架构从...转载 2019-07-12 16:17:47 · 187 阅读 · 0 评论 -
提升Java性能的40个优化细节
转载:https://mp.weixin.qq.com/s/JYO_kiPCfsyHFm9pTF5gag在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身。养成良好的编码习惯非常重要,能够显著地提升程序性能。在合适的场合使用单例使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个...转载 2019-07-12 17:29:30 · 213 阅读 · 0 评论 -
深入详解JVM内存模型与JVM参数详细配置
转载:https://www.cnblogs.com/rinack/p/9888692.htmlJVM内存结构 由上图可以清楚的看到JVM的内存空间分为3大部分:堆内存 方法区 栈内存其中栈内存可以再细分为java虚拟机栈和本地方法栈,堆内存可以划分为新生代和老年代,新生代中还可以再次划分为Eden区、From Survivor区和To ...转载 2019-06-25 16:19:21 · 118 阅读 · 0 评论 -
JVM - 深入分析对象的内存布局
转载:https://www.cnblogs.com/zhengbin/p/6490953.html概述一个对象本身的内在结构需要一种描述方式,这个描述信息是以字节码的方法存储在方法区中的。Class 本身就是一个对象,都以 KB 为单位,如果 new Integer() 为了表示一个数据就占用KB级别的内存就有点不值了,下面讲解 JVM 是如何做的。为了表示对象的属性、方法等信息...转载 2019-07-30 17:43:43 · 119 阅读 · 0 评论 -
JVM - 对象的访问定位
转载:https://www.cnblogs.com/YYfish/p/6722258.htmlhttps://blog.youkuaiyun.com/Searchin_R/article/details/84348946虚拟机栈是 java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。局部变量表...转载 2019-07-30 17:49:28 · 201 阅读 · 0 评论 -
设计模式-原则-开闭原则
转载:https://blog.youkuaiyun.com/hfreeman2008/article/details/52344022开闭原则的定义开闭原则是java世界里最基础的设计原则,它指导我们如何建立一个稳定,灵活的系统。开闭原则定义如下:Software entities like classes,modules and functions should be open fo...转载 2019-07-26 15:07:46 · 133 阅读 · 0 评论 -
设计模式-原则-依赖倒置
转载:作者:WILL_HUNTING链接:https://www.jianshu.com/p/314b67f04e50依赖倒置原则定义依赖倒置原则(Dependence Inversion Principle ,DIP)定义如下:High level modules should not depend upon low level modules,Both should ...转载 2019-07-27 15:24:58 · 129 阅读 · 0 评论 -
设计模式-原则-里氏替换
转载:作者:KUN叔链接:https://www.jianshu.com/p/8d48a550cae4指的是任何基类可以出现的地方,子类一定可以出现。定义1如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都替换成o2时,程序p的行为没有发生变化,那么类型T2是类型T1的子类型。定义2所有引用基类的地方必须能透明地...转载 2019-07-27 14:34:33 · 219 阅读 · 0 评论 -
设计模式-原则-汇总
转载:https://mp.weixin.qq.com/s/L7X1IHPrMjjYjySRMox7Ug很多人在写代码的初始阶段懂了所写语言的语法后,经过不断地实践积累,总会发现自己代码的一些不足,要是是一个不断追求完美的人,就会不断地重构自己写过的代码,以达到各种优化程序,提升开发效率的目的。而随着不断的重构最终会发现重构的成本越来越重,可能到最后都不想做重构的工作了。所以对于大项目来说...转载 2019-07-26 16:00:29 · 88 阅读 · 0 评论 -
设计模式-原则-单一职责原则
转载:作者:冯丰枫链接:https://www.jianshu.com/p/c1073bd9b080定义:应该有且仅有一个原因引起类的变更(There should never be more than one reason for a class to change)单一职责原则为我们提供了一个编写程序的准则,要求我们在编写类,抽象类,接口时,要使其功能职责单一纯碎,将...转载 2019-07-26 15:54:21 · 107 阅读 · 0 评论 -
tomcat connector(BIO, NIO, APR)
Tomcat Connector三种运行模式(BIO, NIO, APR)的比较和优化这三种模式的不同之处如下:BIO:一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7或以下,在Linux系统中默认使用这种方式。NIO:利用Java的异步IO处理,可以通过少量的线程处理大量的请求。Tomcat8在Linux系统中默认使用这种方式。Tom...原创 2019-04-04 17:31:28 · 248 阅读 · 0 评论 -
设计模式-原则-迪米特法则
转载:https://www.douban.com/note/702728213/--------------------------------------------------姓名:迪米特法则英文名:Law of Demeter小名:最少知识原则小名英文名:Least Knowledge Principle价值观:妈妈说不和陌生人说话个人介绍:Each ...转载 2019-07-19 15:53:11 · 110 阅读 · 0 评论 -
设计模式-原则-组合复用原则
转载:组合复用原则定义:组合复用原则经常又叫做合成复用原则。该原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分:新的对象通过向这些对象的委派达到复用已有功能的目的。而在我们的代码中尽可能使用组合而不是用继承是什么原因呢?原因如下 第一,继承复用破坏包装,它把父类的实现细节直接暴露给了子类,这违背了信息隐藏的原则; 第二:如果父类发生了改...转载 2019-07-19 16:06:02 · 589 阅读 · 0 评论