草庐IT

不好意思,UUID 该换了!

ULID:UniversallyUniqueLexicographicallySortableIdentifier(通用唯一词典分类标识符)UUID:UniversallyUniqueIdentifier(通用唯一标识符)为什么不选择UUIDUUID目前有5个版本:版本1:在许多环境中是不切实际的,因为它需要访问唯一的,稳定的MAC地址,容易被攻击;版本2:将版本1的时间戳前四位换为POSIX的UID或GID,问题同上;版本3:基于MD5哈希算法生成,生成随机分布的ID需要唯一的种子,这可能导致许多数据结构碎片化;版本4:基于随机数或伪随机数生成,除了随机性外没有提供其他信息;版本5:通过SH

不好意思,UUID 该换了!

ULID:UniversallyUniqueLexicographicallySortableIdentifier(通用唯一词典分类标识符)UUID:UniversallyUniqueIdentifier(通用唯一标识符)为什么不选择UUIDUUID目前有5个版本:版本1:在许多环境中是不切实际的,因为它需要访问唯一的,稳定的MAC地址,容易被攻击;版本2:将版本1的时间戳前四位换为POSIX的UID或GID,问题同上;版本3:基于MD5哈希算法生成,生成随机分布的ID需要唯一的种子,这可能导致许多数据结构碎片化;版本4:基于随机数或伪随机数生成,除了随机性外没有提供其他信息;版本5:通过SH

异步线程里的日志不好追踪?小支一招,轻松搞定!

众所周知,通过唯一的链路id来追踪一次请求的所有日志,对于排查生产问题来说,会是非常给力的。这个比较容易实现。我之前的博客也有多次提及▄︻┻┳═一https://www.cnblogs.com/buguge/tag/日志链路追踪/。那么,如果涉及到异步线程处理的话,我们知道,由于异步线程与工作线程是两个不同的线程,因此,这时的线程名会发生变化。一次请求的完整日志就无法通过唯一的标识来过滤了。 有没有办法呢?问题即答案。当然是有的。 线程是用来执行任务的,任务是一段程序代码的封装。在java中,任务通过java.lang.Runnable来表示。使用方面,我们可以自己定义一个实现Runnable

异步线程里的日志不好追踪?小支一招,轻松搞定!

众所周知,通过唯一的链路id来追踪一次请求的所有日志,对于排查生产问题来说,会是非常给力的。这个比较容易实现。我之前的博客也有多次提及▄︻┻┳═一https://www.cnblogs.com/buguge/tag/日志链路追踪/。那么,如果涉及到异步线程处理的话,我们知道,由于异步线程与工作线程是两个不同的线程,因此,这时的线程名会发生变化。一次请求的完整日志就无法通过唯一的标识来过滤了。 有没有办法呢?问题即答案。当然是有的。 线程是用来执行任务的,任务是一段程序代码的封装。在java中,任务通过java.lang.Runnable来表示。使用方面,我们可以自己定义一个实现Runnable

不好!有敌情,遭到XSS攻击【网络安全篇】

XSS:当一个目标的站点,被我们用户去访问,在渲染HTMl的过程中,出现了没有预期到的脚本指令,然后就会执行攻击者用各种方法注入并执行的恶意脚本,这个时候就会产生XSS。涉及方:用户(通过浏览器去访问网页)攻击者(通过各种办法让用户访问页面执行恶意脚本,盗取信息)Web服务器(存储并返回恶意脚本)XSS的危害挂马网页挂马是指在一个程序中利用木马生成器生成一个网码,加上一些代码,可以让木马程序再打开网页的时候就立即执行。盗取用户的Cookie盗取了用户的关键信息后,就可以模拟去做一些事情:包含但不局限于转账请求、恶意信息发送请求、未知文件下载请求、删除目标文章、恶意篡改数据、嫁祸。蠕虫病毒爆发W

不好!有敌情,遭到XSS攻击【网络安全篇】

XSS:当一个目标的站点,被我们用户去访问,在渲染HTMl的过程中,出现了没有预期到的脚本指令,然后就会执行攻击者用各种方法注入并执行的恶意脚本,这个时候就会产生XSS。涉及方:用户(通过浏览器去访问网页)攻击者(通过各种办法让用户访问页面执行恶意脚本,盗取信息)Web服务器(存储并返回恶意脚本)XSS的危害挂马网页挂马是指在一个程序中利用木马生成器生成一个网码,加上一些代码,可以让木马程序再打开网页的时候就立即执行。盗取用户的Cookie盗取了用户的关键信息后,就可以模拟去做一些事情:包含但不局限于转账请求、恶意信息发送请求、未知文件下载请求、删除目标文章、恶意篡改数据、嫁祸。蠕虫病毒爆发W

[开源]React/Vue通用的状态管理框架,不好用你来打我👀

为了防止被打,有请“燕双鹰”镇楼?️‍♀️?️‍?️‍...o...话说新冠3年,“状态管理框架”豪杰并起、群雄逐鹿,ReduxToolkit、Mobx、Vuex、Pinia、Dva、Rematch、Recoil、Zustand、Mirror...敢问英雄独钟哪厢?Flux状态管理笔者也用过很多态管理框架,大部分都是Flux框架的变种,只不过加上了一些自己的糖衣和辅助方法。?只要糖衣做得好,省时省力人人要!后面随着Typescript的普及,自动类型推断也是状态管理框架易用性的重要指标。我们先简单回顾几款最主流的Flux状态管理框架的写法://基于Redux的Dva:{state(){retu

[开源]React/Vue通用的状态管理框架,不好用你来打我👀

为了防止被打,有请“燕双鹰”镇楼?️‍♀️?️‍?️‍...o...话说新冠3年,“状态管理框架”豪杰并起、群雄逐鹿,ReduxToolkit、Mobx、Vuex、Pinia、Dva、Rematch、Recoil、Zustand、Mirror...敢问英雄独钟哪厢?Flux状态管理笔者也用过很多态管理框架,大部分都是Flux框架的变种,只不过加上了一些自己的糖衣和辅助方法。?只要糖衣做得好,省时省力人人要!后面随着Typescript的普及,自动类型推断也是状态管理框架易用性的重要指标。我们先简单回顾几款最主流的Flux状态管理框架的写法://基于Redux的Dva:{state(){retu

为什么95%的Java程序员人,都是用不好Synchronized?

Synchronized锁优化jdk1.6对锁的实现引入了大量的优化,如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。锁主要存在四中状态,依次是:无锁->偏向锁->轻量级锁->重量级锁,他们会随着竞争的激烈而逐渐升级。注意锁可以升级不可降级,这种策略是为了提高获得锁和释放锁的效率。锁优化偏向锁偏向锁是Java6之后加入的新锁,它是一种针对加锁操作的优化手段,经过研究发现,在大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,因此为了减少同一线程获取锁(会涉及到一些CAS操作,耗时)的代价而引入偏向锁。偏向锁的核心思想是,如果一个线程获得了锁,那么

为什么95%的Java程序员人,都是用不好Synchronized?

Synchronized锁优化jdk1.6对锁的实现引入了大量的优化,如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。锁主要存在四中状态,依次是:无锁->偏向锁->轻量级锁->重量级锁,他们会随着竞争的激烈而逐渐升级。注意锁可以升级不可降级,这种策略是为了提高获得锁和释放锁的效率。锁优化偏向锁偏向锁是Java6之后加入的新锁,它是一种针对加锁操作的优化手段,经过研究发现,在大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,因此为了减少同一线程获取锁(会涉及到一些CAS操作,耗时)的代价而引入偏向锁。偏向锁的核心思想是,如果一个线程获得了锁,那么