用 Redis 构建分布式锁

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

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

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

程序设计之 SOLID

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

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

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

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

至少 30 年以前,一些软件设计人员就已经意识到领域建模和设计的重要性,并形成一种思潮,EricEvans 将其定义为领域驱动设计(Domain-DrivenDesign,简称 DDD)。在互联网开发“小步快跑,迭代试错”的大环境下,DDD 似乎是一种比较“古老而缓慢”的思想。然而,由于互联网公司也逐渐深入实体经济,业务日益复杂,我们在开发中也越来越多地遇到传统行业软件开发中所面临的问题。本文就先来讲一下这些

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

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

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 容器,使用配置文件来创建所依赖的对象,由主动创建对象改为了被