ibut 的博客

总结之后必有收获 登录     注册

ibut 0 篇文章

用 Redis 构建分布式锁

用 Redis 构建分布式锁在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段。有很多三方库和文章描述如何用 Redis 实现一个分布式锁管理器,但是这些库实现的方式差别很大,而且很多简单的实现其实只需采用稍微增加一点复杂的设计就可以获得更好的可靠性。最近自己基于 Redis 做了一个实现,发出来希望大家一起讨论下,看是否还有不可靠情况,能否再完善。@Value("${配置服务器标识}")pr

群分享:不要落入实施细节的陷阱

分享一下阮一峰的观点:我引用了一个开发者对年轻程序员的告诫。在软件开发中,技术变化如此之快,你花费了大量时间学习技术和工具,一旦这些技术被取代,你的知识将变得毫无价值,因为它们大部分都是实施的细节。我最近总是在想这段话,软件开发算不算是真正的知识?如果它是一种真正的知识,那么理论上,我们学到的东西大部分应该不会过时,就好像微积分不会过时一样。可是实际上,我们都知道,软件开发技能有时效性,十年前学习的

领域驱动设计 (DDD)- 多研究些架构,少谈些框架

大家都知道软件开发不是一蹴而就的事情,我们不可能在不了解产品(或行业领域)的前提下进行软件开发,在开发前通常需要进行大量的业务知识梳理,然后才能到软件设计的层面,最后才是开发。而在业务知识梳理的过程中,必然会形成某个领域知识,根据领域知识来一步步驱动软件设计,就是领域驱动设计(DDD,Domain-Driven Design)的基本概念 。

mysql 8 + 用户密码设置注意事项

在 MySQL8.0.11 中,caching_sha2_password 是默认的身份验证插件,而不是以往的 mysql_native_password。(安装的时候可以自主选择为 mysql_native_password 避免客服端连接的麻烦) 有关此更改对服务器操作的影响以及服务器与客户端和连接器的兼容性的信息,请参阅 caching_sha2_password 作为首选的身份验证插件。(翻译自 https:/

Twitter 的分布式自增 ID 算法 snowflake (Java 版)

分布式系统中,有一些需要使用全局唯一 ID 的场景,这种时候为了防止 ID 冲突可以使用 36 位的 UUID,但是 UUID 有一些缺点,首先他相对比较长,另外 UUID 一般是无序的。有些时候我们希望能使用一种简单一些的 ID,并且希望 ID 能够按照时间有序生成。而 twitter 的 snowflake 解决了这种需求,最初 Twitter 把存储系统从 MySQL 迁移到 Cassandra,因为 Cassandra 没有顺序 ID 生成机制

优雅你的实体类 -- Lombok 代替 Getter/Setter 方法

大家经常在编写实体类 Model 的时候,需要生成 Getter/Setter 方法,如果一个 Model 类很多字段的时候,Model 类的代码将会很多,看起来不清爽,特此引入了 Lombok(lombok.* 包)。lombok 的官方网址:http://projectlombok.org / 让 IDE 支持 lombok,如果不安装插件,IDE 是无法解析 Lombok 的注解 IDEAFile–>Settings–>Plugi

Java Proxy 和 CGLIB 动态代理原理

动态代理在 Java 中有着广泛的应用,比如 SpringAOP,Hibernate 数据查询、测试框架的后端 mock、RPC,Java 注解对象获取等。静态代理的代理关系在编译时就确定了,而动态代理的代理关系是在编译期后确定的。静态代理实现简单,适合于代理类较少且确定的情况,而动态代理则给我们提供了更大的灵活性。今天我们来探讨 Java 中两种常见的动态代理方式:JDK 原生动态代理和 CGLIB 动态代理。JDK 原

分布式之数据库和缓存双写一致性方案解析

首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存。又或者是先删除缓存,再更新数据库,其实大家存在很大的争议。从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。这种方案下,我们可以对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是

maven 中 scope 标签详解

最近在做 pom 优化工作,发现对于 maven 依赖管理中的 scope 标签还是有不明白的地方,所以今天就来总结一下这方面的知识,scope 在 maven 的依赖管理中主要负责项目的部署 maven 的哲学在上次技术分享的时候也提到了:约定大于配置,所以在 maven 中,很多内容都有默认值,scope 的默认值是 compile,那么 scope 还能有哪些选项呢?scope 的分类 1.compile:默认值他表示被依赖项目需

Socket 与 WebSocket 与 http

什么是 Socket?socket 起源于 Unix,而 Unix/Linux 基本哲学之一就是 “一切皆文件”,都可以用“打开 open–> 读写 write/read–>关闭 close”模式来操作。我的理解就是 Socket 就是该模式的一个实现,socket 即是一种特殊的文件,一些 socket 函数就是对其进行的操作(读 / 写 IO、打开、关闭)。socket 中 TCP 的三次握手建立连接详解我们知道 tcp 建立连接要进行“三

java 常用框架相关知识 Spring MVC 和 MyBatis

JavaWeb 开发经典的 3 层框架:Web 层、Service 层(业务逻辑层)和 Dao 层(数据访问层)Web 层:包含 JSP 和 Servlet 等与 Web 相关的内容;业务层:只关心业务逻辑;数据层:封装了对数据库的访问细节。Spring 知识点 01.Spring 的 IOC 和 AOP 有了解吗?答:IOC:控制反转,(解耦合)将对象间的依赖关系交给 Spring 容器,使用配置文件来创建所依赖的对象,由主动创建对象改为了被

MYSQL 数据库知识点

01.MySQL 和 MongoDB 的区别有哪些?如何选择?关系型数据库和文档型数据库,存储方式数据处理,架构特点。mongoDB 适于事件的记录,内容管理或者博客平台等。02. 分析一下 Mysql 和 Mongodb 应用场景 (*HBase)1. 如果需要将 mongodb 作为后端 db 来代替 mysql 使用,即这里 mysql 与 mongodb 属于平行级别,那么,这样的使用可能有以下几种情况的考量:(1)mongodb 所

网络协议

01. 三次握手、四次挥手示意图:总共有四种状态:主动建立连接、主动断开连接、被动建立连和被动断开连接两两组合还是 4 种组合:主动建立连接、主动断开连接会经历的状态:SYNC_SENT——ESTABLISHED—-FIN_WAIT_1—-FIN_WAIT_2—-TIME_WAIT 主动建立连接、被动断开连接会经历的状态:SYNC_SENT——ESTABLISHED—-CLOSE_WAIT—-LAST_AC

Java 8 相关知识

0.1HashMap 的底层实现有变化:HashMap 是数组 + 链表 + 红黑树(JDK1.8 增加了红黑树部分)实现。02.JVM 内存管理方面,由元空间代替了永久代。区别:1. 元空间并不在虚拟机中,而是使用本地内存;2. 默认情况下,元空间的大小仅受本地内存限制;3. 也可以通过 - XX:MetaspaceSize 指定元空间大小。03.Lambda 表达式(也称为闭包),允许我们将函数当成参数传递给某个方法,或者把

JVM 内存管理

01.JVM 内存划分:方法区(线程共享):常量、静态变量、JIT(即时编译器) 编译后的代码也都在方法区;堆内存(线程共享):垃圾回收的主要场所;(jdk7 + 常量)程序计数器:当前线程执行的字节码的位置指示器;虚拟机栈(栈内存):保存局部变量、基本数据类型变量以及堆内存中某个对象的引用变量;本地方法栈:为 JVM 提供使用 native 方法的服务。02. 类似 - Xms、-Xmx 这些参数的含义:答:堆内存分配:

高并发编程

在 Java5.0 提供了 java.util.concurrent(简称 JUC)包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池、异步 IO 和轻量级任务框架。01. 多线程和单线程的区别和联系:答:在单核 CPU 中,将 CPU 分为很小的时间片,在每一时刻只能有一个线程在执行,是一种微观上轮流占用 CPU 的机制。多线程会存在线程上下文切换,会导致程序执行速度变慢,即采用

Java 中常见集合

集合这方面的考察相当多,这部分是面试中必考的知识点。01. 说说常见的集合有哪些吧?答:Map 接口和 Collection 接口是所有集合框架的父接口:1.Collection 接口的子接口包括:Set 接口和 List 接口;2.Map 接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap 以及 Properties 等;3.Set 接口的实现类主要有:HashSet

java 基础知识点解析

01. 面向对象的特性有哪些?答:封装、继承和多态。02.Java 中覆盖和重载是什么意思?解析:覆盖和重载是比较重要的基础知识点,并且容易混淆,所以面试中常见。答:覆盖(Override)是指子类对父类方法的一种重写,只能比父类抛出更少的异常,访问权限不能比父类的小。被覆盖的方法不能是 private 的,否则只是在子类中重新定义了一个方法;重载(Overload)表示同一个类中可以有多个名称相同的方法,

java 运算符

运算符归类:一元运算符:逻辑运算符 (!),非运算符(~) 二元运算符:复制运算符 (=),逻辑与运算符(&&),逻辑或运算符(||),逐位与运算符(&), 逐位或运算符(|), 右移运算符(>>) 三元运算符:X?Y:Z; 逐位运算符逐位运算符是一种比较复制的运算符。可以分为逐位逻辑运算符,逐位位移运算符两种。无论那种逐位运算符,都必须将操作数要求是整形的操作符,转换为 32 位的二进制数值。然后参与运算,运算完毕