- 博客(12)
- 资源 (10)
- 收藏
- 关注
原创 关于 ReentrantLock 中锁 lock() 和解锁 unlock() 的底层原理浅析
当我们在使用 ReentrantLock 进行加锁和解锁时,底层到底是如何帮助我们进行控制的啦?带着这样的疑问,我们先后跟进 lock()和unlock() 源码一探究竟。
2024-09-25 17:59:52
1060
原创 记一次分布式锁失效的生产事故
在给某项目做业务开发的时候,有一个任务派发的定时任务,该定时任务通过算法,把系统源源不断的任务每隔一分钟派发给不同的审核员进行审核。因为考虑到分布式任务调度器(如:xxljob/elasticjob)需要单独服务器搭建服务,所以为了减少服务器成本,就自己基于现有资源编写分布式锁,因为现有redis环境,于是就基于redis编写分布式锁,来保证多个实例只有一台实例在同一个时间点在执行派发任务。
2024-09-25 17:32:03
885
原创 数据库设计范式
大部分业务开发都需要我们开发人员自己进行表结构的设计,设计关系数据库时,会要求我们遵从不同的规范要求,设计出合理的关系型数据库,只有设计出更加合理的数据库表结构,才能在业务处理和后期维护变得更加方便。这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。关系数据库有六种范式(Normal form):第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。第一范式主要针对具体某一列;
2024-08-08 11:30:23
746
原创 Mybatis Plus配置多数据源
该项目主要描述了Mybatis Plus多数据源的配置和使用,其中详细记录的配置过程,整个过程从数据库表的创建到数据初始化都有详细的记录说明。另外,如果存在同一个表在多个数据源中都存在的情况,有一些注意事项,下面看文章通过例子说明。
2024-08-07 18:30:28
7485
原创 MySQL数据清洗到TiBD
一、业务背景公司主要做的业务是类似贝壳的二手房租售,数据库中存了上亿级别的房源数据,之前数据库使用的是 mysql,后面需要将 mysql 数据库切换成了 Tidb,在切换的过程中,需要将老库的数据经过数据清洗后再存入新库(因为有一些表结构的设计变了),其中我们处理的一个逻辑就是将房间下业主信息从老库清洗到新库:我们需要按照城市维度,查询新库所有的房间,然后拿着新老库的房间对应关系,再到老库中找到所有对应的房间,然后通过房间再找到每个房间对应的业主信息,最后将业主的不同维度信息(一共5个维度信息)清洗到新
2024-08-01 11:08:58
2568
原创 记一次for update“同一事务”中update无法获取数据锁的解决
问题原因就在这,虽然测试环境实际上只有一个数据库,但是ShardingJDBC配置了主从,那么即使只有一个数据库,也会产生两条连接,一条用于主、一条用于从,所以在select for update语句的时候默认使用从库的链接的事务中获取数据,并且将数据加锁,而表面上看代码是同一事务的update时,实际上是使用主库的链接的事务进行更新数据,所以select 和 update不在同一个事务中,故代码层面看是同一事务的先后两个操作,update时实际获取不到之前的select的锁,所以发生等待直至超时报错。
2024-07-30 18:34:14
1090
原创 git简单使用总结
Git是一种分布式版本控制系统。本地工作目录、暂存区和仓库,也可以称为三棵树,不过在仓库这个地方又可以分为本地仓库和远程仓库。:本地工作目录(工作区):暂存区Repository:仓库,仓库又分本地仓库和远程仓库Remote:远程仓库整个Git版本管理过程可以简单的理解为文件在三棵树上的管理过程:本地(本机)创建的文件,首先会存在本地工作目录,当使用git add命令后,会将文件同时保存到暂存区,在暂存区的文件使用git commit后,会将暂存区的文件提交到仓库,使用git push。
2024-07-30 15:23:21
903
原创 各种集合、对象的对比记忆
同类型的StringBuilder和StringBuffer的实现原理一样,其父类都是AbstractStringBuilder。StringBuffer是线程安全的,StringBuilder是JDK 1.5新增的,其功能和StringBuffer类似,但是非线程安全。因此,在没有多线程问题的前提下,使用StringBuilder会取得更好的性能。String是不可变对象,每次对String类型进行操作都等同于产生了一个新的String对象,然后指向新的String对象。
2024-07-29 17:47:42
847
转载 Java的12个语法糖
前面介绍了12种Java中常用的语法糖。所谓语法糖就是提供给开发人员便于开发的一种语法而已。但是这种语法只有开发人员认识。要想被执行,需要进行解糖,即转成JVM认识的语法。当我们把语法糖解糖之后,你就会发现其实我们日常使用的这些方便的语法,其实都是一些其他更简单的语法构成的。有了这些语法糖,我们在日常开发的时候可以大大提升效率,但是同时也要避免过渡使用。使用之前最好了解下原理,避免掉坑。说明:本文转载自公众号 Hollis 的文章《原创 | 不了解这12个语法糖,别说你会Java!侵权删。
2024-07-27 11:36:39
176
原创 GIT使用log命令显示中文乱码
1、运行Git Bash窗口,在该窗口导航条(即最上面)右键,选择Options−>Text,找到下面两处:Locale:选择 zh_CN ;Charector set:选择 UTF-8。2、到Git Bash命令窗口输入如下设置命令语句:git config --global i18n.commitencoding utf-8git config --global i18n.logoutputencoding utf-8export LESSCHARSET=utf-8
2024-07-26 16:06:16
1442
原创 深入理解HashMap扩容机制(JDK8)
Java 8 在新增数据存入成功后进行扩容。扩容会发生在两种情况下(满足任意一种条件即发生扩容):(1)当前存入数据大于阈值即发生扩容;(2)存入数据到某一条链表时,此时该链表数据个数大于8,且数组长度小于64即发生扩容。此外需要注意一点java7是在存入数据前进行判断是否扩容,而java8是在存入数据后再进行扩容的判断。
2024-07-26 15:14:50
1402
原创 深入理解HashMap扩容机制(JDK7)
Hashmap的扩容需要满足两个条件:当前数据存储的数量(即size())大小必须大于等于阈值;当前加入的数据发生了hash冲突。因为上面这两个条件,所以存在下面这些情况就是hashmap在存值的时候(默认大小为16,负载因子0.75,阈值12),可能达到最后存满16个值的时候,再存入第17个值才会发生扩容现象,因为前16个值,每个值在底层数组中分别占据一个位置,并没有发生hash碰撞。当然也有可能存储更多值(超多16个值,最多可以存27个值)都还没有扩容。
2024-07-26 14:50:44
2024
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅