自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java 泛型的理解

Java 泛型是 JDK5 引入的一个新特性,泛型提供了编译时类型安全检测机制,使得程序员能在编译期检测到非法的数据类型。泛型的格式:<数据类型>泛型的本质是参数化类型,就是给类型指定一个参数,使用的时候在指定参数具体的值。比如// 创建一个String类型的list// 创建一个Integer类型的list泛型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。泛型的数据类型只能填写引用数据类型,不可以使用基本数据类型;指定泛型的具体类型之后,可以传入该类类型或其子类类型的对象。

2024-08-31 10:47:42 703 1

原创 01. 并发事务问题、事务隔离级别

事务是一组 SQL 操作的集合。这一组 SQL 语句,要么都成功,要么都失败。最经典的说明事务的例子是转账。假如张三要给李四转1000块钱,转账涉及两个操作:张三的余额减少 1000,李四的余额增加 1000。如果在转账的时候出现问题导致张三的余额减少而李四的余额没有增加,这种情况肯定是不能允许的。事务,就是要保证这两个操作要么都成功,要么都失败。

2024-05-23 15:23:50 417

原创 03. Spring 事务管理

事务管理是应用系统开发中必不可少的一部分,Spring 为事务管理提供了丰富的功能。Spring 的事务管理分为编程式和声明式两种方式。声明式事务管理可以使业务代码逻辑不受污染,将业务逻辑和事务处理解耦。声明式事务也有两种方式:一种是在配置文件(xml)中做相关的事务规则声明,一种是基于注解的方式。事务是数据库的概念,Spring 本身是没有事务的,Spring 的事务是借助 AOP,通过动态代理的方式实现。

2024-05-23 12:00:13 1052 3

原创 Java 注解和反射

注解是 JDK 5.0 引入的新技术。注解是不是程序本身,但可以对程序做出解释;可以被其他程序(比如编译器)读取。注解是以 “@注解名” 在代码中存在,还可以添加一些参数,例如 @SuppressWarnings(value=“ubchecked”)。可以加在 package、class、method、field 等上面,相当于给他们添加额外的信息;我么可以通过反射机制编程实现对这些元数据的访问。使用@interface自定义注解时,自动继承了接口。@interface用来声明一个注解;

2024-05-22 23:24:01 799 1

原创 04. 动态 SQL

不拼 1 = 1 的话,当没有传递 title 参数的时候,SQL 语句变为 select * from blog where and author = ‘‘zk’’,执行会报错。如果 where 元素与你期望的不太一样,你也可以通过自定义 trim 元素来定制 where 元素的功能。当 author 条件不满足时,set 语句会自动拼接 title 条件,并去掉 title 条件后面的逗号。set 元素可以用于动态包含需要更新的列,忽略其它不更新的列。(这些逗号是在使用条件语句给列赋值时引入的)。

2024-05-22 23:22:05 873

原创 03. 一对多、多对一的处理

比如一个老师拥有多个学生。查询所有学生的信息,以及对应的老师的信息。

2024-05-22 23:20:35 429

原创 08. Redis 缓存穿透和雪崩

用户想要查询一个数据,发现 Redis 数据库没有,也就是缓存没有命中,于是向持久层数据库查询,发现也没有,于是本次查询失败。数据预热的含义就是,在正式部署之前,先把可能访问的数据预先访问一遍,这样部分可能大两房问的数据就会先加载到缓存中。那么到一点的时候,这批商品的缓存都到期了,这时候对这批商品的查询,都落到了数据库上。布隆过滤器是一种数据结构,对所有可能查询的参数以 Hash 形式存储,在控制层先进行校验,不符合要求的就丢弃,从而避免了对底层存储系统的压力。这种方式将高并发的压力转移到了分布式锁。

2024-05-22 23:07:49 382 1

原创 07. 哨兵模式

主从切换的技术是,当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这需要人工干预,还会造成一段时间内服务不可用。所以我们考虑使用哨兵模式。

2024-05-22 23:05:14 334

原创 06. Redis 主从复制

主机只有写操作,从机只有读操作。在从机执行写操作会报错。主机断开连接,从机依旧是连接到主机的,但是没有写操作;如果主机重新连接成功,从机依旧可以获取到主机写的数据。

2024-05-22 23:03:37 555

原创 05. Redis 持久化

在指定的时间间隔内,将内存中的数据集快照写入磁盘,也就是 Snapshot 快照,它恢复时是将快照文件直接读到内存里。Redis 会单独创建(fork)一个子进程来进行持久化,会现将数据写入到一个临时文件中,待持久化过程结束,再用这个临时文件替换上次持久化好的文件。整个过程,主进程是不进行任何 IO 操作的,这就确保了极高的性能。如果需要进行大规模的数据恢复,且对于数据恢复的完整性不是非常敏感,那 RDB 方式要比 AOF 模式更加的高效。

2024-05-22 23:02:20 722

原创 04. Redis 配置文件

配置文件对大小写不敏感(unit单位)。可以把多个配置文件包含进来。

2024-05-22 22:59:58 399

原创 03. SpringBoot 整合 Redis

Jedis:底层采用直连的方式,如果多个线程操作,不安全。更像 BIO 模式!Lettuce:采用 netty,实例可以在多个线程中共享,不存在不安全的情况!可以减少线程数,性能高,更像 NIO 模式!SpringBoot 所有的配置类,都有一个自动配置类,RedisAutoConfiguration;默认的 RedisTemplate 没有过多的设置,redis 保存的对象都是需要序列化的!SpringBoot 操作数据:Spring Data jpa jdbc redis。

2024-05-22 22:55:38 867

原创 02. Redis 事务

如果事务队列中存在语法性错误,那么执行命令的时候,其他命令是可以执行的!错误命令会抛出异常!(所以说没有原子性)事务的本质就是:一组命令一起执行!一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行!所有的命令在事务中,并没有被直接执行!只有在发起执行命令的时候才会执行!代码有问题,命令有错!事务中所有的命令都不会执行!放弃事务后,队列中的命令都没有执行!一次性、顺序性、排他性。

2024-05-22 22:49:40 311 1

原创 02. Springboot实现websocket

Java WebSocket 应用由一系列 Endpoint 组成。Endpoint 是一个 Java 对象,代表 WebSocket 链接的一端,对于服务端,我们可以视为处理具体 WebSocket 消息的接口。Endpoint 实例在 WebSocket 握手时创建,并在客户端与服务端链接过程中有效,链接关闭时结束。编写 WebSocketConfig 配置类,扫描添加了 @ServerEndpoint 注解的Bean。在定义 Endpoint 时,通过 @OnMessage 注解指定接收消息的方法。

2024-05-22 22:13:13 1384

原创 02. 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 1344

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

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

2024-03-17 09:41:12 602

原创 安装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 1256

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

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

2024-02-26 11:20:37 1783

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

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

2024-02-23 16:51:50 304

原创 09. Redis可视化工具——RedisInsight

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

2024-02-23 10:58:02 2207

原创 01. Redis 入门

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

2024-02-22 21:07:21 425

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

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

2024-02-22 11:08:40 2232

原创 保存Json对象到数据库

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

2024-02-21 15:58:28 1590

原创 CompletableFuture禁止嵌套使用

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

2024-02-21 11:22:06 509

原创 CompletableFuture 使用自定义线程池

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

2024-02-20 15:13:33 1916

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

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

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

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

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

2024-02-19 10:35:28 818

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

包:javax.validation.constraints.xxx。

2023-06-19 10:11:04 1112

原创 方法引用(::)

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

2023-03-30 16:20:53 823 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 2006

原创 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 583

原创 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 5680

原创 python 中的 __repr__() 方法

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

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

原创 Python 中的 zip() 函数

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

2021-10-22 11:04:32 772

原创 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 2812

原创 版本回退——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 2218

原创 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 6316

原创 Python 中的 __call__() 方法

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

2021-09-23 15:44:05 715

原创 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 2037 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 1643

空空如也

空空如也

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

TA关注的人

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