知行

总结之后必有收获 开始使用

ibut 0 篇文章

用 Redis 构建分布式锁

用 Redis 构建分布式锁

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

优雅你的代码 --Java8 Lambda 场景示例

阅读前提了解 java8 的一些新特性, 如: Optional、Stream 背景一切的一切,源于不喜欢在代码中写太多的 ifelse.scene&solution1.Optional 方法描述 of 把指定的值封装为 Optional 对象,如果指定的值为 null,则抛出 NullPointerExceptionempty 创建一个空的 Optional 对象 ofNullable 把指定的值封装为 Optional 对象,如果指定
Java 并发 - - 锁

Java 并发 - - 锁

昨天有人问到了乐观锁和悲观锁的使用场景,虽然有所了解但是在 java 中关于锁的概念还有很多, 今天趁着妇女之友的节日总结一下。CASCAS 全称 CompareAndSwap(比较与交换)是一种无锁算法。在不使用锁 (没有线程被阻塞) 的情况下实现多线程之间的变量同步。java.util.concurrent 包中的原子类就是通过 CAS 来实现了乐观锁。AQSAQS 是 AbustactQueuedSynchroniz
书看完了,跟没看一样,转头就忘?

书看完了,跟没看一样,转头就忘?

为什么有的人看完了书,跟没看差不多,转头就忘记?而有些人看完一本书就像升了一级 Level,这样的人学习能力就很强。差别的重点就是学习方法上的不同,让我们看看那些学习能力强的人是怎么看书的。看书 -> 理解 -> 思考 -> 产生疑问 -> 结合工作思考 -> 思考改善点(结合实际怎么做)—> 与他人分享和讨论如果大家都能够按照上面这个方法来看书,想忘记都难❤️
程序设计之 SOLID

程序设计之 SOLID

SOLID 是单一职责原则 (SRP),开闭原则(OCP),里氏替换原则(LSP),接口隔离原则(ISP) 和依赖倒置原则 (DIP) 的缩写,指代了面向对象编程和面向对象设计的五个基本原则。原则是要比设计模式更基础更重要的指导准则,是面向对象设计的 Bible。深入理解后,会极大的提升我们的程序设计能力切实提高代码质量。单一职责 (S) 对象应该仅具有一种功能, 单一职责可以看作是低耦合、高内聚在面向对象原则上的引
过滤器(Filter)与拦截器(Interceptor )

过滤器(Filter)与拦截器(Interceptor )

总得来说过滤器和拦截器触发时机不一样: 过滤器是在请求进入容器后,但请求进入 servlet 之前进行预处理的。请求结束返回也是,是在 servlet 处理完后,返回给前端之前。所以过滤器的 doFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain) 的入参是 ServletRequest,而不是 httpservletreques
群分享:不要落入实施细节的陷阱

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

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

java8 List 转 map

[Map 的 merge 方法] 为了取数据方便,经常会有遇到 List 转 Map 的需求,这是典型的空间换时间做法。Java8 提供了 merge,方便快捷 publicstaticvoidmain(String[]args){Map<Long,List<SpuProduct>>map=New.hashMap();List<SpuProduct>spuList=New.arrayList();spuList.add(
领域驱动设计 (DDD)- 多研究些架构,少谈些框架

领域驱动设计 (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 方法

优雅你的实体类 -- 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 与 WebSocket 与 http

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

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

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

MYSQL 数据库知识点

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

网络协议

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

Java 8 相关知识

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