- 博客(41)
- 收藏
- 关注
原创 Elasticsearch安装
如果使用 Docker Desktop,请确保分配至少 4GB 的内存。您可以 通过转到“”来调整 Docker Desktop 中的内存使用情况。
2024-06-01 21:01:45
554
原创 JSR380验证框架
validat@NotNull 论证注解的属性值不是空的。@AssertTrue 验证注解的属性值是否为真。@Size 验证注解的属性值的大小介于属性min和max之间;可应用于string,collection,map和数组属性。@Min 验证注解属性的值不小于值属性的值@Max 验证被注解的属性的值不大于值属性的值@Email 验证注解的属性是一个有效的电子邮件地址。@Pattern 验证注解的属性是否匹配正则表达式@NotEmpty 验证属性不是空或空;可以应用于stri
2024-03-21 21:27:38
1004
1
原创 SpringBootApplication注解介绍
SpringBootApplication是springboot启动类注解,是一个组合注解除了元注解外,主要包含三个注解;
2023-12-27 22:52:54
471
原创 Spring boot 发送邮箱
Spring 提供了非常好用的 JavaMailSender 接口实现邮件发送。在 SpringBoot 的 Starter 模块中也为此提供了自动化配置。下面通过实例看看如何在 SpringBoot 中使用 JavaMailSender 发送邮件。是Spring Framework对邮件支持的基础包,发送邮件的核心接口MailSender封装了发送简单邮件的属性 ,这个包还包含检查异常的层次结构,这些层次结构在较低级别的邮件系统异常上提供了更高级别的抽象,而根异常是。
2023-12-11 00:11:55
651
1
原创 Mybatis一级缓存与二级缓存
数据库接收到sql语句后,需要词法/语法解析,优化sql语句,制定执行计划。多数情况下,相同的sql语句可能只是传入参数不同(如where条件后的值不同...)。如果每次都需要经过上面的等,则效率就明显不行了。所以预编译的优势就体现出来了。预编译语句在被MySQL编译器编译后,执行代码会被缓存下来。那么下次调用时,只要是相同的预编译语句就再不需要编译,只要将参数直接传入编译过的语句执行代码中即可。其中我们使用mybatis时,使用#{}注入参数时,mybatis使用的是预编译能够防止sql注入。
2023-12-07 23:13:35
426
原创 http状态码
服务不可用 - 由于临时情况,服务器当前无法处理请求,延迟一段时间后会缓解。未授权 - 请求需要用户身份验证,或者,如果请求包含授权凭据,则拒绝对这些凭据进行授权。Not Found - 找不到请求的资源。错误请求 - 由于语法错误,服务器无法理解请求;OK - 请求成功。网关错误 - 服务器充当网关或代理,并从上游服务器收到无效响应。来自单方的请求,以 429 状态响应每个请求。攻击,它可能更适合只是断开连接,或者采取;限制资源使用,直接drop可能更合适。禁止 - 服务器理解请求,但拒绝执行。
2023-12-07 23:09:08
962
原创 多数据源配置
在对应的mapper包中编写相应mapper类即可。dsName可以为组名也可以为具体某个库的名称。使用包路径来指定多数据源配置。可以注解在方法上或类上,
2023-12-06 11:47:03
810
原创 redis缓存首页热点数据
Spring Data Redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化功能,支持发布订阅,并对spring cache进行了实现。Jedis是Redis官方推荐的面向Java的操作Redis的客户端,而RedisTemplate是Spring Data Redis中对Jedis api的高度封装。
2023-12-04 17:11:13
423
原创 Spring切面编程
Aspect@Component/*** 处理请求前执行*/System.out.println("前置logStart()==>"+name+"....【args: "+ Arrays.asList(joinPoint.getArgs()) +"】");/*** 处理完请求后执行* @param joinPoint 切点*/
2023-12-04 16:16:37
760
原创 LongAddr
base:类似于AtomicLong中全局的value值。在没有竞争情况下数据直接累加到base上,或者cells扩容时,也需要将数据写入到base上collide:表示扩容意向,false一定不会扩容,true可能会扩容。cellsBusy:初始化cells或者扩容cells需要获取锁,0:表示无锁状态1:表示其他线程已经持有了锁casCellsBusy():通过CAS操作修改cellsBusy的值,CAS成功代表获取锁,返回true。
2023-12-03 23:17:30
933
原创 设计简单高效的短链系统
另外在生成短链接时,我们可以使用预生成的短URL,预生成短 URL 的算法可以采用随机数来实现,6 个字符,每个字符都用随机数产生(用0~63 的随机数产生一个 Base64 编码字符)。但是这样得到的短 URL,可能会发生 Hash 冲突,即不同的长 URL,计算得到的短 URL 是相同的(MD5 或者 SHA256 计算得到的 Hash 值几乎不会冲突,但是 Base64 编码后再截断的 6 个字符有可能会冲突)。使用redis存储短链接的数据结构可以使用hash结构来存储短链接到长链接的映射。
2023-12-03 21:26:22
1332
原创 Java 原子操作类
AtomicStampedReference是携带版本号的引用类型原子类,可以解决ABA问题。以一种线程安全的方式操作非线程安全对象内的某些字段。AtomicReference实现自旋锁。原子更新带有标记位的引用类型对象。
2023-12-03 16:32:06
478
原创 一种excel多线程并发写sheet的方案
首先一开始使用easyexcel去导出excel,结果发现导出时间需要3秒左右。于是想着能不能缩短excel导出时间,于是第一次尝试使用异步线程去查询数据库,却发现接口的时间并没有明显缩短,于是自己就开始排查耗时的操作,于是发现是写sheet的时候是串行执行,并且每个写sheet的时间并不短,尤其在sheet比较多的时候,会导致导出的时间比较长。于是,想着能不能使用异步线程并发去写sheet,但是,使用的时候报错。后来去找报错的原因,是因为easyexcel并不支持并发写。于是,我就转战POI。
2023-12-01 17:07:15
4219
原创 单机zk安装与zk四字命令
是一个简单、可靠的网络工具。watches 的简洁信息:连接总数、watching 节点总数和 watches。发送”的包数量操作延迟、当前服务模式(leader/follower。发送包数量、 连接数、模式(leader/follower。数量很大的话,将会产生很大的开销,会影响性能,小心使用。数量很大的话,将会产生很大的开销,会影响性能,小心使用。)、节点总数、watch 总数、临时节点总数。)、节点总数、 延迟。的所有节点,它的输出是一个与 watch。的四字命令功能默认是没有开启的,需要在。
2023-11-30 23:22:42
1093
原创 Redis缓存雪崩、击穿、穿透等问题解决方案
请求去查询一条记录,先redis后mysql发现都查询不到该条记录,但是请求每次都会打到数据库上面去,导致后台数据库压力暴增,这种现象称为缓存穿透。(大量请求去请求不存在的值)。大量的请求同时查询一个 key 时,此时这个key正好失效了,就会导致大量的请求都打到数据库上面去。或者说热点key突然失效了,请求都打mysql里。
2023-11-29 22:29:50
539
原创 Java锁AQS原理
阿里巴巴Java开发手册解释:AQS(AbstractQueuedSynchronizer):利用先进先出队列实现的底层同步工具类,它是很多上层同步实现类的基础,比如:ReentrantLock、CountDownLatch、Semaphore 等,它们通过继承 AQS 实现其模版方法,然后将 AQS 子类作为同步组件的内部类,通常命名为 Sync。AQS是。
2023-11-29 15:03:15
884
原创 Redis持久化机制
AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制, 当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩, 只保留可以恢复数据的最小指令集.可以使用命令bgrewriteaof。redis4.0版本后的重写,是指上就是把rdb 的快照,以二级制的形式附在新的aof头部,作为已有的历史数据,替换掉原来的流水账操作。auto-aof-rewrite-percentage:设置重写的基准值,文件达到100%时开始重写(文件是原来重写后文件的2倍时触发)
2023-11-29 11:03:12
694
原创 ThreadLocal
我们要在不使用某个ThreadLocal对象后,手动调用remoev方法来删除它,尤其是在线程池中,不仅仅是内存泄露的问题,因为线程池中的线程是重复使用的,意味着这个线程的ThreadLocalMap对象也是重复使用的,如果我们不手动调用remove方法,那么后面的线程就有可能获取到上个线程遗留下来的value值,造成bug。虚引用的主要作用是跟踪对象被垃圾回收的状态。(4)对于不同的线程,每次获取副本值时,别的线程并不能获取到当前线程的副本值,形成了副本的隔离,互不干扰。
2023-11-28 15:52:09
836
原创 CompletableFuture使用
没有指定Executor的方法,直接使用默认的ForkJoinPool.commonPool() 作为它的线程池执行异步代码。如果指定线程池,则使用我们自定义的或者特别指定的线程池执行异步代码线程池可以参考通常采用 cpu 核数 + 1 能够实现最优的 CPU 利用率,+1 是保证当线程由于页缺失故障(操作系统)或其它原因导致暂停时,额外的这个线程就能顶上去,保证 CPU 时钟周期不被浪费。
2023-11-27 20:03:13
813
1
原创 java垃圾回收算法
当垃圾回收器发现没有引用指向一个对象,即:垃圾回收此对象之前,总会先调用这个对象的finalize()方法。finalize() 方法允许在子类中被重写,
2023-11-24 21:41:36
871
2
原创 JVM类加载与运行时数据区
部分收集:不是完整收集整个Java堆的垃圾收集。其中又分为:新生代收集(MinorGC/YoungGC):只是新生代(Eden\s0,s1)的垃圾收集老年代收集(MajorGC/o1dGC):只是老年代的圾收集。
2023-11-24 15:30:52
884
1
原创 mysql数据库
b+树是在平衡树的基础上做了矮胖化处理,降低了树高,将一部分随机io转化为顺序io,扫的数据很多,时间复杂度其实是变大了,但是因为磁盘顺序io比随机io快太多了,所以可以牺牲一点时间复杂度来提高性能,但是redis都是在内存里面,不存在随机io和顺序io的区别,也就只需要考虑时空复杂度,用跳表肯定更好,同时跳表的实现相对来说简单一点。二级索引 自己根据业务来建的索引,除了聚簇索引,其他的都是二级索引,二级索引的叶子节点包含索引列和主键。脏写,一个事务修改了另一个未提交事务修改了的数据。
2023-11-22 16:15:01
35
原创 神经网络基础
1.常见初始化方法均匀分布初始化,权重参数初始化从区间均匀随机取值。即在(-1/,1/)均匀分布中生成当前神经元的权重,其中d为每个神经元的输入数量。正态分布初始化,随机初始化从均值为0,标准差时1的高斯分布中取样,使用一些很小的值对参数W进行初始化。全0初始化,将神经网络中的所有权重参数初始化为0.全1初始化,将神经网络中的所有权重参数初始化为1.固定值初始化,将神经网络中的所有权重参数初始化为某个固定值。
2023-04-13 23:03:56
269
原创 pytorch的使用(三)
1.使用Pytorch的nn.MSELoss()2.使用Pytorch的optim.SGD3.使用Pytorch的nn.Linear。
2023-03-30 23:01:08
115
原创 torch的使用(二)
自动微分模块对张量做了进一步的封装,具有自动求导的功能。reshape可以在保证张量数据不变的前提下改变数据的维度,将其转换成指定的形状,在神经网络中,会经常使用该函数来调节数据的形状的操作,以便能够更好处理网络各层之间的数据连接。transpose函数可以实现交换张量形状的指定维度,例如:一个张量的形状(2,3,4)可以通过transpose转换为(2,4,3)注意:detach之后会产生一个新的张量,新的张量作为叶子节点,并且该张量和原来的张量共享数据,但是分离后的张量不需要计算梯度。
2023-03-29 00:07:16
349
原创 Pytorch的使用-简洁明了(一)
3.torch.IntTensor、torch.FloatTensor、torch.DoubleTensor创建指定类型的张量。2.torch.random.init_seed和torch.manaual_seed随机种子设置。3.torch.full和torch.full_like创建全为指定值张量。2.torch.zeros和torch.zeros_like创建全0张量。1.torch.tensor 根据指定数据创建张量。1.torch.ones和torch.ones_like 创建全1张量。
2023-03-23 23:37:31
1947
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人