![](https://img-blog.csdnimg.cn/20190918140213434.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
随心记
文章平均质量分 62
日常开发过程的点点滴滴
fo3hd
#走出舒适圈,勇于探索未知#
展开
-
一次未重写父类hashCode和equal方法引发的线上问题
问题描述定义一个集合用它来收集一些特殊对象,后续对集合中的元素做操作。 集合是一个HashSet,上线后发现异常,有些应该进去的偏偏进不去。 分析过程因为代码中使用到了RedisTemplate的HashOperations,因为我每次操作都是同一个HashOperations对象,所以开始怀疑HashOperations不是线程安全的,后面证实它在并发环境下没有问题。 于是线下模拟一遍, 发现HashSet永远只有一个,但是其实每次add进去的都是新的,为什么没有新增? 后面才发现原来自定义对象没有重写原创 2022-01-10 11:55:05 · 504 阅读 · 0 评论 -
spring cache设置指定Key过期时间
spring cache 集成redis是基于spring-data-redis组件开发的一直通过注解就能轻松实现redis缓存操作的框架。但原生的spring cache不支持缓存过期,默认都是没有过期时间的,以下实现自定义缓存过期时间。spring-data-redis版本是1.8.11,所以需要使用此版本或者兼容此版本的其他版本。先看spring的RedisCacheManager类代...原创 2019-12-31 16:33:11 · 17038 阅读 · 2 评论 -
实现一个自定义的spring boot starter
spring boot大家都知道,是集成了spring的几乎所有类库,通过它核心的spring-boot-autoconfigure模块,结合一系列的starter来完成原本需要开发人员配置的各种xml和依赖jar的工作,开发人员针对自身需求,只要引入指定的starter即可。下面就来实现一个自定义的spring boot starter。主要功能是拦截所有controller请求,并打印出请求参数和header部信息。看了网上很多人都拆分成两个模块,autoconfigure模块和starter模块,原创 2020-05-21 22:37:21 · 134 阅读 · 0 评论 -
spring cache实现自定义redis过期时间
前一篇文章(spring cache设置指定Key过期时间)已经提到过怎么实现spring cache自定义过期时间,但是拿来使用后,被吐槽不够优雅(也是醉了),也对,身为一个有追(不)求(服)心态的程序猿,就应该做到更好。重新梳理后,大概思路是这样的:自定义一个注解@TimeToLive,包括过期时间、和时间单位方法上增加自定义注解@TimeToLive定义一个切面,利用spring ...原创 2020-01-04 14:15:36 · 1169 阅读 · 0 评论 -
spring rest docs创建api文档介绍
日常开发中可能很少会用到spring rest docs来创建API文档,因为spring boot容易集成的原因,大家可能还是比较倾向于使用swaggerUI文档框架了,spring rest docs有一个好处是需要写单元测试(这个是很多开发人员不愿意的,包括我 -_-),还有个人觉得从界面和展示效果,我还是比较喜欢spring rest docs。在开发中接口文档是必不可少的,至于选择哪一种...原创 2019-07-11 15:53:28 · 789 阅读 · 1 评论 -
spring cache动态获取redis指定namespace下的key
spring cache是一种可以通过注解或XML配置方式来实现缓存的组件。 在开发过程中很方便,如@Cacheable、@CacheEvict等。一般都是事先在方法上去加入注解,并且写死了cacheName,比如如下例子: @Cacheable(value = "ota.applications", key = "#packageName") public Application...原创 2019-07-05 17:18:47 · 11103 阅读 · 0 评论 -
解决@Async注解在springboot中不起作用
1. 不起作用的写法Controller @Autowired private VehicleService vehicleService; @RequestMapping(value = "/queryBy", method = RequestMethod.GET) public CommonResponse queryList(@RequestParam(...原创 2019-04-30 16:50:46 · 3133 阅读 · 0 评论 -
validation-api包校验嵌套属性(集合对象)的写法
我们知道javax.validation提供了validation-api的jar包实现请求参数校验,避免在业务代码中写一些繁琐的校验逻辑。以下说明嵌套属性的一种写法。package com.example.demo.controller;import com.example.demo.model.ActionParentModel;import com.example.demo.serv...原创 2019-04-29 14:19:23 · 5966 阅读 · 1 评论 -
spring cloud微服务实现一个简单的例子
spring cloud集成feign实现微服务调用,服务注册使用consul,构建选择maven。项目目录结构,主要包含以下3个module:kp-core提供公共类和公共配置(如:feign)kp-service-customer-back 服务提供者kp-service-customer-mid 服务调用者首先在父模块(proj-hd-parent)的pom.xml引入依...原创 2019-02-12 11:56:46 · 703 阅读 · 0 评论 -
spring boot监控组件actuator 结合consul注册中心使用总结
最近的项目使用到了spring boot,相比之前使用spring来说,的确方便很多,不再需要单独引入各个jar包依赖,只需引入spring boot 需要的起步依赖即可,spring boot的自动配置会帮我们将要依赖的事情做完。spring boot还提供支持条件化配置,即可以使用自定义配置覆盖自动配置。比如: @Bean @ConditionalOnMissingBean({...原创 2019-01-30 15:58:55 · 2733 阅读 · 0 评论 -
多线程按顺序打印输出
如果我们想实现一个这样的功能:每一个线程负责输出一个字母,要求按顺序输出。打个比方,有3个线程,线程A线程B、线程C,分别输出A、B、C,最终打印结果希望是按顺序输出,即ABC要实现这个有两个方案,可以利用Thread的join方法或者java.util.concurrent.CountDownLatch类来实现。第一种:joinpublic static void main(String[...原创 2019-02-21 14:55:07 · 1093 阅读 · 0 评论 -
MongoDB 4.0安装远程连接不上的问题
mkdir -p /data/db日志文件路径sudo mkdir -p /var/log/mongodb使用后台运行方式:sudo mongod --dbpath /data/db --logpath /var/log/mongodb/mongod.log --fork切到mongodb的安装目录的bin目录执行:./mongo 127.0.0.1 没有问题,可以执行mongo的sh...原创 2018-11-26 21:28:08 · 2466 阅读 · 1 评论 -
EhCache使用入门
EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。与深受大众喜爱的redis相比,因为它直接在jvm虚拟机中存储,具有速度快,效率高以及多种缓存策略等优点,但如果是分布式应用redis会更优。EhCache的使用很简单,下面就以一个例子来说明怎么在项目中使用它。1.引入maven依赖<dependenc...原创 2018-07-05 20:37:14 · 305 阅读 · 0 评论 -
多线程写文件以及分布式锁实现
有一天梦见女朋友跟一个陌生男人逛街,我很是着急,于是有很多志同道合的朋友开始为我出谋划策。有说,让那个男的指向null,让垃圾回收他。 也有的说给个死循环,让他们逛到累,累死他们。。。没错,你们说的都有道理,但是,如果换是我,我会给自己女朋友逛街这个行为上锁,并且只有我才能获取到锁,也不会把锁让给别人。好了,扯完,开始进入正题,没错,就是锁。在开发过程中往往会遇到大量数据请求,并且需要快速响应...原创 2018-01-12 18:25:33 · 956 阅读 · 0 评论 -
Spring Boot日志自定义输出
如果你什么都不做,Spring Boot默认会使用Logback来打印和记录日志,并且它的日志级别是INFO,也就是说,它只输出级别比INFO高的日志(TRACE 并且它输出的日志格式是这样子的:这个是因为Spring Boot包的默认配置文件base.xml,全路径是:org/springframework/boot/logging/logback/base.xml在包中的具体路径如下:在def原创 2018-01-18 16:03:50 · 5160 阅读 · 1 评论