自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 分布式锁实现问题小记

业务场景:消费端轮询服务端接口,服务端发现任务完成,则触发事件。首先这是有一定并发量的场景,为了避免并发场景下,服务端重复触发事件,在触发事件之前必须加分布式锁。我是这样设计的:本次请求先查询事件是否已经触发,如果已经触发,那么解锁;否则尝试加分布式锁,如果获取锁成功,触发事件,如果获取锁失败,直接返回问题产生了,我发现分布式锁没有互斥性,上一个请求获取锁成功,没等到有请求来解锁,下一个请求居然又能成功获取锁。

2024-03-26 19:54:53 582

原创 Spring的事务框架

Spring的事务框架设计理念的基本原则是:让事务管理的关注点与数据访问关注点相分离PlatformTransactionManager是Spring事务抽象架构的核心接口,它的主要作用是为应用程序提供事务界定的统一方式具体实现上,在事务开始之前取得一个java.sql.Connection,然后将这个Connection绑定到当前的调用线程,在事务结束时解除绑定。

2024-03-19 16:11:06 296

原创 SpringBoot约定大于配置

"约定大于配置"(Convention Over Configuration)是一种理念,旨在通过默认约定和规则来减少开发人员需要做的配置工作。在Spring Boot框架中,这一原则得到了充分应用,帮助开发者更快地构建高效的应用程序。

2024-03-02 18:18:38 1474

原创 开发环境热部署

在实际开发中,经常要修改代码,然后重启服务,再验证代码是否生效。对于开发场景,随着项目的演进,微服务越来越多,等待重启的时间也会越来越多;对于联调场景,对一处功能的修改后通知上游联调,同样会浪费大量的碎片化时间。热部署的出现就帮我们解决了这些痛点,所谓热部署,就是在应用正在运行时升级软件,却不需要重新启动应用,它能极大的提高开发效率。

2024-02-29 11:39:00 1117

原创 恢复IDEA的myabtis、sql代码提示

在mapper页面空白行或者根路径,快捷键,选择,选择sql然后打开,把Scope排倒序,发现我们新建了一个Scope为IDE的设置修改Local name为修改Namespace为。

2024-02-26 20:27:46 259

原创 Redis客户端异常:No way to dispatch this command to Redis Cluster because keys have different slots.

项目使用jedis,执行lua脚本报错:No way to dispatch this command to Redis Cluster because keys have different slots.jedis版本如下查了下报错原因,是,于是切lettucelettuce版本如下切完还是报错:io.lettuce.core.RedisCommandExecutionException: CROSSSLOT Keys in request don't hash to the same slot。

2024-02-20 15:39:12 384

原创 地铁监工问题

【代码】地铁监工问题。

2024-01-24 16:57:12 297

原创 深入理解Java虚拟机_JVM高级特性与最佳实践(第3版)学习笔记

Java虚拟机栈是线程私有的,它的生命周期与线程相同虚拟机栈描述的是Java方法执行的线程内存模型局部变量表所需的内存空间在编译期间完成分配。

2024-01-19 17:59:43 381

原创 双端列表java/c实现

【代码】双端列表java/c实现。

2024-01-12 17:53:42 305 1

原创 单链表的Java/C实现

【代码】单链表的C实现。

2024-01-03 17:34:33 386 2

原创 二分查找(Binary Search)

对数据大小为n的数组进行二分查找,每次需要遍历的区间为n,n/2,n/4,...,n/2^k经过k次比较后,二分查找完成,时间复杂度为O(k)。因为n/2^k=1,k=logn,故时间复杂度O(logn)

2024-01-02 16:39:49 343 1

原创 %p返回的地址

可以看到返回的char类型的数据在内存中占用1字节,我声明了一个char类型的指针,%p输出了他的地址,做+1后会指向下一字节,再次输出地址发现地址也+1了,这意味着返回的16位16进制数的每一个单位代表一个字节。64位机器的内存理论值是2的64次方字节,表示2的64次方需要64位2进制数,换算成16进制,每4位2进制数是1位16进制数,因此需要16位16进制。%p返回的这16位16进制数指向内存中的一个位置,这个位置可以存储1个字节,如果地址+1,那么这个地址就会指向下一字节。

2023-12-29 15:14:01 353 1

原创 为什么malloc

【代码】为什么malloc。

2023-12-28 15:52:32 339 1

原创 假设我们有10万条URL访问日志,如何按照访问次数给URL排序?

【代码】假设我们有10万条URL访问日志,如何按照访问次数给URL排序?

2023-12-27 17:38:20 388 1

原创 C语言指针

定义二维数组指针*p表示p是一个指针,它指向一个数组,数组类型为int[3],这正是arr包含的每个一维数组类型,即每行。这里括号是必须的,否则p会变成一个指针数组二维数组指针遍历i < 2;这里括号是必须的,如果写作就成了函数原型,它表示函数的返回值为使用函数指针a : b;return 0;p是一个函数指针,在前面加 * 就表示对它指向的函数进行调用,这里括号同样不能省略。

2023-12-25 17:02:20 1394

原创 C语言宏定义

而 typedef 是在编译阶段由编译器处理的,它并不是简单的字符串替换,而给原有的数据类型起一个新的名字,将它作为一种新的数据类型。#define 叫做宏定义命令,它也是C语言预处理命令的一种。所谓宏定义,就是用一个标识符来表示一个字符串,如果在后面的代码中出现了该标识符,那么就全部替换成指定的字符串。#表示这是一条预处理命令,所有的预处理命令都以 # 开头。在x86机器上int指针的类型变量占8字节,int类型的变量占4字节。由此可见b变量是int类型,宏定义只是简单的字符串替换,使用时要格外小心。

2023-12-25 09:50:15 341

原创 逆序删除Map中的元素

使用LinkedHashMap时逆序删除元素。

2023-12-21 19:41:48 355 1

原创 预处理命令

C语言源文件要经过编译、链接才能生成可执行程序编译(Compile):将源文件(.c文件)转换成目标文件(.o,.obj等)链接(Link):将编译生成的多个目标文件及系统中的库、组件等合并成一个可执行程序在编译之前对源文件进行简单加工的过程,就称为预处理,即预先处理、提前处理。

2023-12-20 12:37:07 329 1

原创 Java的跨平台性

以socket编程为例,java.net.ServerSocket#accept这个方法因为要调用底层操作系统的接口,一定是平台相关的,如果使用windows版本的jdk,底层实现将是。也就是说,java借助对底层实现的封装和双亲委派的原则,屏蔽了平台相关性的细节,使得java程序只需生成在jvm上运行的目标代码(字节码),就可以在不同平台上不加修改地运行。而使用linux版本的jdk,底层实现又会是另一种。简单的说,“一次编译,到处运行”:java文件经过编译后生成和平台无关的class文件。

2023-12-19 11:06:37 324 1

原创 spring-session-data-redis原理

session是服务器端的一个 key-value 的数据结构,经常和 Cookie 配合,保持用户的登陆会话。客户端在第一次访问服务端的时候,服务端会响应一个 SessionId 并且将它存入到本地 Cookie 中,在之后的访问中浏览器会将 Cookie 中的 sessionId 放入到请求头中去访问服务器,如果通过这个 SessionId 没有找到对应的数据,那么服务器会创建一个新的SessionId并且响应给客户端。

2023-12-15 09:13:21 356

原创 断路器模式

理解这个原理之后,如果我自己实现一个断路器会怎么实现?我想我很快会想到代理模式+aop来实现一个简单断路器。

2023-11-14 15:43:54 19 1

原创 getResourceAsStream()引发的对类加载器的思考

一个最简单的maven工程,读取rescoures目录下的文件。

2023-10-25 22:36:48 64 1

原创 chapter1

【代码】chapter1。

2023-07-03 20:27:53 19 1

原创 mysql事务

而每行数据也有多个版本,每次事务更新数据的时候,都会生成一个新的数据版本,并且把当前事务的id赋给这个数据版本,记为row trx_id。在实现上,InnoDB为每个事务构造了一个数组,用来保存每个事务的启动瞬间,所有“活跃”的事务id,活跃是指启动了但未提交。1.最常说的视图view,由一个查询语句定义的虚拟表,在调用的时候执行查询语句并生成结果,查询方法和表一样。按照RR的定义,一个事务启动的时候,能看到当前所有已提交的事务,但是之后其他事务的更新对它不可见。该数组中事务id的最小值记为。

2023-06-08 19:44:02 11

原创 数据库索引

索引的出现是为了提高查询效率,本质上也是用空间换时间,索引三种比较常见的数据结构有哈希表、有序数组和搜索树。

2023-05-31 23:30:16 15

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除