自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MyBatis<foreach>标签的用法

这里举例使用 foreach 遍历 map。使用 foreach 遍历 map 时,foreach 标签中的参数 index 表示的就是 map 的 key,item 就是 map 的 Value。foreach 可以在 SQL 语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。类型,可以直接以字符串类型作为入参,而不用传入一个 List。

2024-04-16 21:27:35 581

原创 MyBatis中 #{} 和 ${} 区别

在使用 SQL 语句进行数据库操作时,如果对入参没有校验,那么攻击者就可以构造特殊的 SQL 语句,直接获取或修改数据库中的数据。例如,我们有一个需求,给定了一个用户的姓名和密码,要求从用户表(user)中查询出该用户的信息。如果我们使用${}的方式实现,即</select>我们正常传入一组数据:username=“pual”、password=“123456” 当然不会有问题。

2024-03-17 09:41:12 553

原创 安装Prometheus及简单使用

Prometheus启动端口为 9090,可通过 http://localhost:9090/graph 登录。prometheus.yml 是 Prometheus 的配置文件。点击右侧的 Execute,如下,有 Table 和 Graph 两种形式。点击 status --> Targets:里面就是已经监控的节点。点击工具栏中的 Graph,进入如下界面,在搜索框输入要监控的目标。点击 status --> Configuration。访问 localhost:9090/metrics。

2024-03-15 11:11:56 622

原创 Java项目中使用Redis——Jedis

在 Jedis 的构造方法传入 Redis 的 host 和端口号,如果 Redis 有密码的话,再设置 Jedis 的 auth 参数即可。需要的配置,我们只需要在配置文件(application.yml 或者 application.properities)中配置连接。下面只是一个简单的例子,可以根据自己项目的需要封装对应的接口。,设置新的序列化规则,以便我们能够操作 Java 实例对象。的 maven 依赖 ,导入相应的 jar 包即可使用。的数据结构命令对应,提供对外的统一接口。

2024-02-26 11:20:37 660

原创 Redis数据类型及基础命令

也就是说,无论列表中有多少个元素,在列表的头和尾插入元素的速度都是一样的,都很快。用来向有序集合添加元素,从上面程序的结果看,我们得到了一个有序的集合。等数值操作,在对字符串执行数值操作后,Redis 会将字符串转换成。中有序集合的命令都以 z 开头,所以通常也把有序集合叫做。的每一种数据类型,以及常用的指令操作,可以使我们对。),集合就是根据这个序号对元素进行排序的。的数据类型及操作有一个初步的认识。用来查看有序集合的元素,带上。可以用来查看存储的值的类型。的特性,实现消息队列,集合是一种无序的集合。

2024-02-23 16:51:50 282

原创 Redis可视化工具——RedisInsight

RedisInsight 是 Redis 官方出品的可视化管理工具,支持 String、Hash、Set、List、JSON 等多种数据类型的管理,同时集成了 RedisCli,可进行终端交互。

2024-02-23 10:58:02 674

原创 Redis入门

Redis是一种基于内存的数据库;具有一定的持久化功能;一种高性能的 key-value数据库。Redis 支持每秒十几万次的读/写操作,其性能远超数据库,并且支持集群、分布式、主从同步等配置。Redis 还支持事务,保证了高并发的场景下数据的安全和一致性。

2024-02-22 21:07:21 402

原创 Java单元测试 - mock静态方法

在 3.4.0 版本之后,开始支持 mock static method。类 A 有一个静态方法 a(),

2024-02-22 11:08:40 1084

原创 保存Json对象到数据库

有两种实现方式,一种是直接保存 Json 对象到数据库,这种方式在创建实体类以及编写 Mapper XML 脚本时需要对 Json 对象做格式转换,另一种是直接以字符串保存,取用时使用。通常要保存一个 Json 字符串的话,一般都是比较大的数据,项目过程中可能需要保存 Json 对象到数据库中。要根据具体的数据量的大小决定使用。然后在编写 Mapper XML 脚本时,语句中需要对 Json 属性的字段设置。以字符串类型保存很简单,如下。解析为 Json 对象。类型是不够的,而需要用。

2024-02-21 15:58:28 917

原创 CompletableFuture禁止嵌套使用

异步线程,且用的是同一个线程池(该线程池的最大线程数为 2)。在程序执行过程中,程序会依次给 A、B 分配一个线程去执行任务。由于线程池的最大线程数为 2,C 的线程会在队列中等待前面的某一个线程执行完成后释放资源才可执行。但是,由于 C 是 B 的子任务,B 需要等到 C 执行完自己才能执行然后释放资源,同样,A 也需要等待 B 执行完才能释放资源,此时系统进入死锁状态,服务卡死。假设一种场景,接口 A 有一个子任务 B,B 有一个子任务 C,在编码实现时为每个任务都创建了。

2024-02-21 11:22:06 232

原创 CompletableFuture 使用自定义线程池

合到生产环境进行发布验证时,我们组的人都在进行功能验证,并发量增大,导致服务报错。对于一个 4 核的机器来说,最只有 3 个线程,对于IO密集型的任务来说,这其实远远不够用,从而导致大量的IO任务在等待,甚至服务挂掉。需求是修改一批数据,由于当时并没有提供批量修改的接口,所以只能循环去修改数据,又想到可以使用。虽然在处理 IO 密集型任务时,任务越多,CPU 效率越高,但也有一个限度。等于没有使用线程池,机器会为每个任务创建一个新线程,且会有资源耗尽的风险。)也使用的是默认的线程池,需要谨慎使用。

2024-02-20 15:13:33 593

原创 异步编程——CompletableFuture用法详解

我们异步执行一个任务时,需要用线程池Executor如果不需要有返回值, 任务继承Thread类或实现Runnable接口;如果需要有返回值,任务实现Callable接口,调用Executor的submit方法执行任务,再使用获取任务结果。当我们得到包含结果的Future时,我们可以使用get方法等待线程完成并获取返回值,但问题是Future的get()方法会阻塞主线程。并且当多个线程存在依赖组合的时候,使用同步组件CountDownLatch是比较麻烦的。Java8新增的类提供了非常强大的。

2024-02-19 17:17:39 394 1

原创 分布式锁的应用场景及实现

电商网站在进行秒杀、特价等大促活动时,面临访问量激增和高并发的挑战。由于活动商品通常是有限库存的,为了避免库存超卖和并发问题,分布式锁是一种有效的解决方案。

2024-02-19 10:35:28 738

原创 Spring常用校验注解@NotEmpty,@NotBlank,@NotNull

包:javax.validation.constraints.xxx。

2023-06-19 10:11:04 952

原创 方法引用(::)

函数式接口,即适用于函数式编程场景的接口。Java 中的函数式编程体现就是 Lambda,所以函数式接口就是可以适用于 Lambda 使用的接口。只有确保接口中有且仅有一个抽象方法,Java 中的 Lambda 才能顺利地进行推导。使用 lambda 表达式会创建匿名方法, 但有时候我们想只调用一个已经存在的方法(不做其它), 这就有了方法引用!方法引用提供了一种不执行方法的方法,它需要由兼容的函数式接口构成的目标类型上下文。函数式接口是指:有且仅有一个抽象方法的接口。)运算符在Java 8 中被称为。

2023-03-30 16:20:53 561 2

原创 python的__new__和__init__方法

__new__和__init__方法的区别我们先看一个例子:class Idol(object): def __new__(cls, name, age): print('__new__ called') return super(Idol, cls).__new__(cls) def __init__(self, name, age): print('__init__ called') self.name = name

2021-12-31 11:33:26 1780

原创 git reset 版本回退

我们通常提交代码的一般流程是:git add --> git commit --> git push,添加到暂存区 --> 提交到git库生成版本号 --> push到远程仓库,以供他人可以使用。这是一个完整且顺利的流程。但是实际开发中,如果出现某些问题,需要撤销一些提交的代码(回退到某个版本),就可以使用 git reset 命令。reset 命令有 git reset 和 git reset --hard 两种,区别在于是否保留修改的文件。使用 git log 查看版本

2021-11-25 08:46:03 516

原创 Python 中变量名后面加冒号是什么意思?

Python 中的类型注解——变量名后面加冒号标明变量类型,用法:var: type = value这是 Python 3.5 中引入的 Type Annotation,是一种注解,用来提示变量的类型。其中var 为要定义的变量;type 为该变量期待的类型;value 为赋给该变量的值。这种用法本质上和 var = value 相同,只是加上了 var 的类型说明。例如:a: int = 10这行代码将 10 赋值给变量 a,并指出变量 a 的类型是 int 型。此外,类型注解也

2021-11-24 11:08:18 5398

原创 python 中的 __repr__() 方法

__repr____repr__() 是 Python 类中的一个特殊方法,由 object 对象提供,由于所有类都是 object 类的子类,所以所有类都会继承该方法。该方法主要实现 “自我描述” 功能——当直接打印类的实例化对象时,系统将会自动调用该方法,输出对象的自我描述信息,用来告诉外界对象具有的状态信息。但是,object 类提供的 __repr__() 方法总是返回一个对象(类名 + obejct at + 内存地址),这个值并不能真正实现自我描述的功能!如下:注:输出实例化的 P

2021-11-19 16:30:25 13315 1

原创 Python 中的 zip() 函数

zip() 函数1. 功能将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的 zip 对象。2. 语法zip(iterable)参数说明:iterables:可迭代对象,如列表、字典、元组、字符串等,zip() 函数允许多个可迭代对象作为参数。当 zip() 函数没有参数时,则返回空的迭代器。当 zip() 函数只有一个参数时,则从参数中依次取一个元素组成一个元组,再将依次组成的元组组合成一个新的迭代器。当 zip() 函数有两个参数时,分别从两个参数中

2021-10-22 11:04:32 714

原创 Python 中 ‘ ‘.join() 的使用

''.join()语法:'delimiter'.join(seq)delimiter:分隔符。可以为空。delimiter:要连接的元素序列、字符串、元组、字典。作用:将序列中的元素以指定的字符连接生成一个新的字符串。示例:a='abcd'a = ','.join(a)print(a)# 输出a,b,c,db = '|'.join(['a', 'b', 'c'])print(b)# 输出a|b|c...

2021-10-21 09:20:28 2627

原创 版本回退——git checkout 和 git reset --hard

2.还原工作区(文件内容)git checkout – <file_name> 丢弃工作区的修改,并用最近一次的commit内容还原到当前工作区(对文件中内容的操作,无法对添加文件、删除文件起作用)git checkout HEAD^ – <file_name> 将指定commit提交的内容(HEAD^表示上一个版本)还原到当前工作区git checkout <branch_name> – <file_name> 将指定分支的指定提交内容还原到当前分支工

2021-09-28 17:21:08 2020

原创 git cherry-pick——合并单个 commit 到指定分支

作用:git cherry-pick 会获取某一个分支的单笔提交,并作为一个新的提交引入到你当前的分支上。使用场景:当我们需要在当前分支上合并其他分支的提交时,如果我们不想对整个分支进行合并,而是只想将某一次提交合入到当前分支上,那么就要使用 git cherry-pick 了。例如,现在我们有一个稳定版本的分支 version 1.0,另外还有个开发版本的分支 version 2.0。version 2.0 开发了多个功能,但现在只需要增加某一个功能到 version 1.0,这里就可以使用 c

2021-09-28 15:51:33 5774

原创 Python 中的 __call__() 方法

Python 中的所有东西都是对象,其中包括 Int/str/func/class 这四类,它们都是对象,都是从一个类创建而来的。对象就可以被调用。__call__() 是一种 magic method,在类中实现这一方法可以使该类的实例(对象)像函数一样被调用。默认情况下该方法在类中是没有被实现的。__call__() 方法的作用其实是把一个类的实例化对象变成了可调用对象,只要类里实现了 __call__() 方法就行。如当类里没有实现 call() 时,此时的对象 p 只是个类的实例,不是一个可调

2021-09-23 15:44:05 671

原创 Python 调用函数时加括号和不加括号的区别

Python 调用函数时加括号和不加括号的区别:不带括号时,调用的是函数本身,是整个函数体,是一个函数对象,不需要等待函数执行完成;带括号时,调用的是函数的执行结果,需等待函数执行完毕的结果。示例:def f(num): return numa = fprint(a)b = f(2)print(b)输出:<function f at 0x7fdb0dd101f0>2a 是整个函数体,是一个函数对象,程序打印的是 a 的地址;b 是函数执行后返回的值,打

2021-09-23 09:41:08 1745 2

原创 Python单元测试——mock 模块

文章目录1. mock 简述2. mock 使用2.1 构造器name 参数spec 参数return_valueside_effect1. mock 简述mock 模块是 Python 的测试框架 unittest 下的一个子包,是单元测试的一个重要模块。单词 mock 有模拟的意思。在 Python 中,mock 可以理解为模拟一个方法、一个对象或者一个类等等,然后使用模拟的对象替换系统的一部分,对系统的一个单元进行测试,并对它们已使用的方式进行断言。那为什么要使用 mock 呢?因为,在实际

2021-09-22 17:15:26 1162

原创 debug 调试——step over、step into、step out 的区别

step over(F8):步过,一行一行地往下走,如果这一行上有方法不会进入方法。在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完在停止,也就是把子函数整个作为一步;step into(F7):步入,如果当前行有方法,可以进入方法内部,一般用于进入自定义方法内,不会进入官方类库的方法。单步执行,遇到子函数就进入并且继续单步执行;step out(Shift + F8):单步执行到子函数内时,用step out就可以执行完子函数余下部分,并返回到上一层函数。s

2021-09-22 09:17:52 2188

原创 Python 变量的作用域

文章目录全局变量和局部变量`global` 和 `nonlocal` 关键字全局变量和局部变量定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。# 全局变量total = 24def f(x, y): # 局部变量 total = x + y print("函数内:", total) return tota

2021-09-18 17:03:46 230

原创 Python 测试框架——unittest 模块

1. unittest 工作原理unittest 是 Python 自带的单元测试框架,最核心的部分有:TestCase,TestSuite,TestRunner。TestCase:用户自定义的测试 case 的基类。调用 run() 方法,会依次调用 setUp()方法、执行用例的方法、tearDown() 方法。TestSuite:测试用例集合。可以通过 addTest() 方法手动增加 TestCase,也可以通过 TestLoader 自动添加 Test Case,TestLoader 在添

2021-09-18 16:13:59 752

原创 Python 中下划线的含义

文章目录1. 单前导下划线,如 `_var`2. 单末尾下划线:如 `var_`3. 双前导下划线:如 `__var`4. 双前导和末尾下划线:如 `__var__`5. 单下划线:如 `_`单下划线和双下划线在 Python 变量和方法名中都各有其含义。有一些含义仅仅是依照约定,被视作是对程序员的提示,而有一些含义是由 Python 解释器严格执行的。本文主要介绍五种下划线模式和命名约定,以及它们如何影响 Python 程序的行为:单前导下划线,如 _var单末尾下划线:如 var_双前导下划

2021-09-17 17:14:02 1058

原创 Python 面向对象

文章目录1. 类1.1 类的定义1.2 类对象1.3 构造方法self——self 代表类的实例,而非类1.4 类的属性与方法类的私有属性与方法2. 继承1. 类类是用来描述具有相同的属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法。1.1 类的定义class ClassName: ......1.2 类对象类对象是类的实例。类对象支持两种操作:属性引用和实例化。属性引用:类名.属性名。示例:class MyCLass: i = 0; # 自定义方法

2021-09-17 14:59:42 148

原创 Python 中的__name__ 属性

一个 Python 文件通常有两种使用方法:第一是作为脚本直接执行,第二是 import 到其他的 Python 脚本中被调用(模块重用)执行。if __name__ == 'main':的作用就是控制这两种情况执行代码的过程。如果一个脚本文件中写了if __name__ == 'main':语句,则只有在直接执行该脚本文件时,if __name__ == 'main':下面的代码才会被执行;而如果将该脚本文件import到其它脚本中,if __name__ == 'main':下面的代码将不会被执行。举

2021-09-16 17:03:00 860 1

原创 Python 获取时间——time 模块

文章目录time模块1. time.localtime()2. time.time()3. time.mktime(t)4. time.asctime()5. time.ctime()6. time.strftime(format,[t])time模块在 Python 中,通常有三种方式来表示时间:时间戳;格式化的时间字符串;元组(struct_time)。时间戳(timestamp:通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行 “type(ti

2021-09-16 10:04:17 2682

原创 Python 列表和元组

Python 有 6 个序列的内置类型,最常见的是列表和元组。列表列表的特性创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可;列表都可以进行的操作包括索引,切片,加,乘,检查成员;列表的数据项不需要具有相同的类型;Python 已经内置确定序列的长度以及确定最大和最小的元素的方法。示例:list1 = ['Google', 'Runoob', 1997, 2000] # 不同类型的数据项list2 = [1, 2, 3, 4, 5]list3 = ["a", "b",

2021-09-15 17:13:59 126

原创 Python 运算符

文章目录1. 成员运算符2. 身份运算符1. 成员运算符in 如果在指定的序列中找到指定值则返回 True,否则返回 False。not in 如果在指定的序列中没有找到指定值则返回 True,否则返回 False。a = 10b = 2list = [1, 2, 3, 4, 5]if a in list: print("a in list")else: print("a not in list")if b not in list: print("b not

2021-09-15 15:55:43 79

原创 Git 常用命令

1. 检查文件状态git status2. 跟踪新文件 & 暂存已修改的文件git add filename3. 查看已暂存和未暂存的修改git diffgit diff 只显示尚未暂存的改动;git diff --staged 查看已暂存的将要添加到下次提交里的内容。4. 提交更新git commit # 要进入编辑器编辑提交的信息git commit -m '给提交的信息写一个标注' # 不用进入编辑器5. 查看提交历史git log6. 分支操作6.1

2021-09-14 10:36:01 67

原创 工厂模式

文章目录概述1. 简单工厂模式2. 工厂方法模式3. 抽象工厂模式概述在面向对象编程中,要产生一个对象实例,最常用的方法就是使用 new 操作符,如果我们只需要生成一个对象实例,使用 new 产生对象就可以。但在有些情况下,你可能需要在生成对象之前生成一些辅助功能的对象(比如说权限处理、记录日志等等),这时候就要在 new 之前写大段的代码。如果在很多地方都需要生成这个对象,代码就会越来越复杂。工厂设计模式是一种创建型模式,它提供了一种创建创建对象的最佳方式。在工厂模式中,我们创建对象时不会对客

2020-08-26 17:22:23 192 3

原创 策略模式

一、什么是策略模式在生活中,假如我们可以通过很多种不同的方式来完成某一件事,这里的每一种方式就可以称为一种策略。比如说我们要去旅游,我们可以选择飞机、火车、大巴以及骑车等各种出行方式。如果距离较远,我们可以选择火车;如果我们还想更舒适快速,那可以选择飞机;如果距离比较近,我们也可以选择骑车······无论我们选择哪种方式,我们的目标都只有一个——到达目的地。这就是一种策略模式。策略模式 就是定义一系列的算法并把它们独立封装起来,所有的这些算法都是完成相同的工作,只是具体的实现不同,并且它们之间可以相

2020-08-25 11:15:05 209

原创 06. J.U.C 核心——AQS

文章目录前言一、AQS 简介二、AQS 源码分析前言AQS(AbstractQueuedSynchronizer)是java.util.concurrent(J.U.C)包下的一个抽象类。concurrent包下提供了一系列同步组件大大提高了并发的性能,包括ReentrantLock、CountDownLatch、semaphore以及CyclicBarrier等,这些同步组件都直接或间接基于 AQS 提供的独占锁、共享锁和等待队列实现了各自的同步需求,所以 AQS 被认为是 J.U.C的核心。一

2020-08-22 10:51:15 203

原创 剑指 offer 刷题——32. 从上到下打印二叉树

从上到下打印二叉树就是二叉树的层次遍历,又称为二叉树的广度优先搜索(BFS),通常借助队列实现。题目一:不分行从上到下打印二叉树从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回:[3,9,20,15,7]提示:节点总数 <= 1000实现:创建一个队列,先将根节点入队;队列不为空时,队首元素出队.

2020-08-21 11:20:00 104

空空如也

空空如也

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

TA关注的人

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