自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 java8日期

由于传统的Date,Caleandar,SimpleDateFormat都是可变的,线程不安全的,多线程环境下需要考虑线程安全问题。而java8推出的新的日期API很好的解决了线程安全问题,而且操作简单,绝对优雅。 一、常用API 1.LocalDateTime java8中将时间和日期进行了区分...

2019-12-05 18:05:19 90 1

原创 Tair最佳实践

一、缓存定义 缓存(Cache)是一块为提升系统性能而开辟出来的内存空间。缓存的两个主要用途是:高性能、高并发。 高性能 对于一些复杂计算、耗时较高的操作,放在缓存中,从缓存中读取,可以提高系统的性能。比如:常见的数据库查询IO比较频繁的,放在缓存中,可以提高访问性能,降低DB的压力。 高并发 由...

2019-11-07 11:06:55 487 0

原创 redis查询优化

  最近公司运维提示线上redis出现报警,排查下来是redis存储的value过大导致查询的时候耗时过高。虽然redis最大限制可以存储512M,但是当单key过大时,每一次访问都会造成redis阻塞,由于redis是单线程的,其他请求只能等待了。在我们的这个场景下,主要是hash存储的json...

2019-07-12 10:36:39 987 0

原创 Spring event事件通知机制应用

Spring的事件通知机制是一项很有用的功能,使用事件机制我们可以将相互耦合的代码解耦,从而方便功能的修改与添加。 举个栗子:下单成功给用户送积分。这里介绍两种实现方式: spring的event事件机制 首先定义事件模型OrderEvent: public class OrderEvent ex...

2019-03-11 21:26:53 303 0

原创 spring cache注解@Cacheable缓存穿透

最近发现线上监控有个SQL调用量很大,但是方法的调用量不是很大,查看接口实现,发现接口是做了缓存操作的,使用Spring cache缓存注解结合tair实现缓存操作。但是为啥SQL调用量这么大,难道缓存没有生效。测试发现缓存是正常的,分析了代码发现,代码存在缓存穿透的风险。具体注解是这样的: @C...

2019-03-11 14:26:19 2697 0

原创 Spring @Cacheable注解类内部调用不生效

最近会员中心拼团中一个查询接口做了缓存,使用到spring cache框架。在用户状态变更的时候,清除用户的缓存cache。但是实际结果是数据库状态变了,但是缓存状态并没有清除, 结果出现缓存不一致的问题。具体如下: @CacheEvict(value = "group...

2018-07-20 10:50:58 7930 1

原创 spring中注入外部属性值到静态变量

最近利用tair做分布式锁的时候,在注入NS的时候发现一个bug,具体是这样的: @Component public class SyncLock implements DisposableBean, DistributedLock { private static final L...

2018-07-20 10:44:19 959 0

原创 java基本类型与引用类型

java基本类型与引用类型 目录 java基本类型与引用类型 目录 一基本数据类型 二引用类型 三基本类型与引用类型的区别 默认值 内存分配 自动装箱自动拆箱 自动装箱拆箱带来的问题 程序的性能 空指针异常 对象相等比较时 一、基本数据类型 java中一...

2018-01-04 17:30:32 15337 10

原创 封装的RedisUtil工具类

我们都知道redis支持5种数据结构,Jedis是redis官方首选的Java客户端开发包,大家常用的数据存储方式是把对象转化为JSON字符串,然后通过set存储,取出数据的时候,先通过get取出JSON字符串,然后转化为对象,如果碰到复杂的对象就比较头疼,下面封装了个通用RedisUtil工具,...

2017-01-18 10:56:06 22494 5

原创 拦截器+ThreadLocal验证用户

ThreadLocal 类定义 public class UserContext { public static final ThreadLocal<String> USER_NAME = new ThreadLocal<>(); } 拦截器编写 @Compone...

2020-05-23 18:02:17 159 0

转载 HashedWheelTimer 使用及源码分析

本文介绍的 HashedWheelTimer 是来自于 Netty 的工具类,在 netty-common 包中。它用于实现延时任务。另外,下面介绍的内容和 Netty 无关。 如果你看过 Dubbo 的源码,一定会在很多地方看到它。在需要失败重试的场景中,它是一个非常方便好用的工具。 本文将会介...

2020-05-20 18:09:46 69 0

转载 短链接服务系统开发

最近上了一个比较大的系统,基于消息推送的需要,花了点时间做了一个短链服务,实现思路其实很简单,这里简单介绍下实现细节,以及一些优化过程。 目录: 功能简单描述 功能很简单,实现将长网址缩短的功能,如: 为什么要转短链?因为要控制每条短信的字数,对于公司来说,短信里面的字可都是钱呀。 为什么不用 ...

2020-05-20 18:02:32 116 0

原创 MyBatis 插件之拦截器Interceptor源码解析(五)

MyBatis 插件之拦截器(Interceptor) 一.背景 ​ 拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法。Mybatis拦截器设计的一个初衷就是为了供用户...

2020-05-19 17:40:45 40 0

原创 Mybatis中的TypeHandler源码解析(四)

无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成 Java 类型。Mybatis默认为我们实现了许多TypeHandler, 当我们没有配置指定TypeHandler时,Mybati...

2020-05-19 17:35:54 45 0

原创 Mybatis 缓存系统源码解析(三)

前言 在使用诸如 Mybatis 这种 ORM 框架的时候,一般都会提供缓存功能,用来缓存从数据库查询到的结果,当下一次查询条件相同的时候,只需从缓存中进行查找返回即可,如果缓存中没有,再去查库;一方面是提高查询速度,另一方面是减少数据库压力;Mybatis 也提供了缓存,它分为一级缓存和二级缓存...

2020-05-19 17:32:52 61 0

转载 plantuml使用教程

Table of Contents 前言 什么是PlantUML 在Emacs里配置PlantUML(参考:Run it from Emacs) 其他软件里的PlantUML下载和安装 如何使用 顺序图(Sequence Diagram) 简单示例 注释语句 申明参与者 使用非字母的参与者名...

2020-05-08 15:39:39 85 0

转载 Mybatis拦截器实现数据脱敏

Mybatis拦截器实现数据脱敏 利用mybatis拦截器,我们可以实现如下常见的功能: 1.数据加密 2.数据脱敏 3.审计功能 4.逻辑删除 5.分页 6.租户与部门隔离 简介 数据脱敏(保形加密)与数据加密的区别 1、脱敏兼顾数据安全与数据使用,采用专业的数据脱敏算法;而加密则是通过对数据进...

2020-05-01 17:04:58 213 0

转载 MyBatis源码窥探(一):MyBatis整体架构解析

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java O...

2020-04-26 20:23:13 60 0

原创 MyBatis 源码解析(二):SqlSession 执行流程

上一篇文章分析了 MyBatis 解析配置文件初始化的流程,本篇主要分析一下SqlSession 具体的执行流程。 MyBatis 在解析完配置文件后生成了一个 DefaultSqlSessionFactory 对象,后续执行 SQL 请求的时候都是调用其 openSession 方法获得 Sql...

2020-04-26 20:17:01 37 0

原创 MyBatis 源码解析(一):初始化

MyBatis 源码解析(一):初始化 我们接着按照上一篇中mybatis入门的例子来分析mybatis的源码: public class App { public static void main(String[] args) { try { /...

2020-04-26 20:11:39 50 0

原创 Mybatis入门

Mybatis入门 1. ORM简介 ORM(Object Relational Mapping)对象-关系映射框架,ORM的主要功能就是根据映射配置文件,完成数据在对象模型与关系模型之间的映射。 1.1 常见的ORM框架 1.1.1 Hibernate Hibernate通过hbm.xml映射...

2020-04-26 20:06:49 37 0

原创 ArrayList数组为什么要用transient修饰?

ArrayList数组为什么要用transient修饰? 序列化 我们知道对象是不能直接进行网络传输的,必须要转化为二进制字节流进行传输。序列化就是将对象转化为字节流的过程。同理,反序列化就是从字节流构建对象的过程。 对于 Java 对象来说,如果使用 JDK 的序列化实现。对象只需要实现 ja...

2020-04-16 18:11:53 85 0

转载 OOM 常见原因及解决方案

当 JVM 内存严重不足时,就会抛出 java.lang.OutOfMemoryError 错误。本文总结了常见的 OOM 原因及其解决方法,如下图所示。如有遗漏或错误,欢迎补充指正。 1、Java heap space 当堆内存(Heap Space)没有足够空间存放新创建的对象时,就会抛出 ...

2020-01-15 20:16:32 50 0

转载 几百万数据放入内存不会把系统撑爆吗?

在公司有一个需求是要核对一批数据,之前的做法是直接用SQL各种复杂操作给怼出来的,不仅时间慢,而且后期也不好维护,就算原作者来了过一个月估计也忘了SQL什么意思了,于是有一次我就想着问一下之前做这个需求的人为什么不将这些数据查出来后在内存里面做筛选呢?直接说了你不怕把内存给撑爆吗?此核算服务器是单...

2020-01-15 15:38:34 134 0

原创 DateUtil工具类

基于java8日期函数的DateUtil工具类: import java.text.SimpleDateFormat; import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal....

2019-12-20 10:41:21 44 0

转载 redis的淘汰算法持久化

Redis的淘汰策略 如果你的 Redis 只能存8G数据,你写了11G,那么 Redis 会怎么淘汰那3G数据呢? redis.conf 中的过期淘汰配置 看下源码的配置 # MAXMEMORY POLICY: how Redis will select what to remove whe...

2019-12-09 16:41:28 47 0

转载 redis高可用集群方案

絮叨 半步神游,神游之下,天下无敌。一梦一游 便是天下。 Redis前面几篇的文章链接: 从零开始学Redis之金刚凡境 从零开始学Redis之自在地境 从零开始学Redis之逍遥天境 上一篇的逍遥天境 讲的是Redis的内存淘汰策略 和持久化方式。那这半步神游就是带你们遨游Redis的主从HA...

2019-12-09 16:36:47 42 0

转载 JVM线上监控工具

前言 通过上一篇的 JVM 垃圾回收知识,我们了解了 JVM 具体的 垃圾回收算法 和几种 垃圾回收器。理论是指导实践的工具,有了理论指导,定位问题的时候,知识和经验是关键基础,数据可以为我们提供依据。 在线上我们经常会遇见如下几个问题: 内存泄露; 某个进程突然 CPU 飙升; 线程死锁; 响...

2019-12-09 16:31:33 73 0

原创 JVM参数详解

一、参数分类 .标准参数 功能和输出的参数都是很稳定的 在未来的JVM版本中不会改变 可以使用java -help检索出所有的标准参数 X参数 非标准化参数 在未来的版本可能会改变 所有的参数都用-X开始 可以使用java -X检索 但是注意没有-Xcomp XX参数 非标准 很长一段时间不会列...

2019-12-09 16:28:37 156 1

原创 JVM调优

JVM调优 一.CPU过高 1.查看jvm的进程ID,可以通过jps或者ps jps -lvm ps -ef | grep Test 2.找出该进程内最耗费CPU的线程 top -Hp 2444 linux下,所有的java内部线程,其实都对应了一个进程id,也就是说,linux上的sun jvm...

2019-12-09 16:24:38 39 0

转载 Java 1.8 常用GC参数速查表

Java 1.8 常用GC参数速查表 GC信息打印 -verbose:gc 开启输出JVM GC日志 -verbose:class 查看类加载信息明细 -XX:+PrintGCDetails GC日志打印详细信息 -XX:+PrintGCDateStamps GC日志打印时间戳信息 -XX:+Pr...

2019-12-09 14:47:44 42 0

转载 GC原理和性能调优

前言 本文介绍 GC 基础原理和理论,GC 调优方法思路和方法,基于 Hotspot jdk1.8,学习之后你将了解如何对生产系统出现的 GC 问题进行排查解决。 正文 本文的内容主要如下: GC 基础原理,涉及调优目标,GC 事件分类、JVM 内存分配策略、GC 日志分析等 CMS 原理及调...

2019-12-09 14:45:48 17 0

转载 Springboot自定义starter

使用springboot开发应用已经有一段时间了,我们都沉醉于它简洁的配置和平滑的上手曲线。 在springboot的开发中,starter是一个核心的配置,只需要引入对应模块的starter,然后在application.properties中引入对应的配置项,就可以开发业务逻辑了。 这一切都归...

2019-11-27 11:50:27 46 0

原创 解决Maven依赖冲突

项目开发中使用maven引入jar包经常会出现jar包的依赖冲突问题,这是由于我们引用的库的传递依赖导致的。这里提供两种常用的解决办法。 maven项目的依赖树 通过 mvn dependency:tree 命令,可以输出依赖树到控制台,可以查看到项目的maven依赖树(直接依赖、间接依赖): ...

2019-11-26 15:13:42 331 0

原创 Springboot整合Sentinel

Sentinel简介 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel具有如下特性: 丰富的应用场景:承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀,可以实...

2019-11-22 19:39:19 1267 0

转载 技术选型系列 - Tair&Redis对比

适应场景 Redis 适用 需要使用复杂数据结构(map, set),map/set中元素很多(1000以上) 延迟敏感服务 不适用 数据量超过600GB(数据太多,全内存太浪费资源) 需要多语言客户端支持 Tair 适用 不能容忍数据丢失 数据量大,内存放不下的服务 不适用 使用复杂数据结构(m...

2019-11-07 10:54:34 71 0

转载 缓存Tair高性能使用规范

不要短时间大量重复读写相同的key server端的原理是网络收包后,放入到工作队列(读写队列分离,但都只有一个),再由工作线程从队列中取出进行处理。这里一个问题是,为保证数据的正确性,会对同一个key的读写加锁,而如果存在大量读写同一个key的情况,则势必会阻塞其他线程(锁不慢,锁竞争才慢),导...

2019-11-07 10:54:05 30 0

原创 tair整合Spring Cache

Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术;并支持使用JCache(JSR-107)注解简化我们开发; Cache接口为缓存的组件规范定义,包含缓...

2019-11-07 10:38:34 71 0

原创 Java 实现抽奖

版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/liujun03/article/details/80708293 设计思路 1.奖品设计 ​ ...

2019-11-07 10:27:24 50 0

原创 爬虫策略

URL去重 将 URL 保存到数据库进行去重,比如 redis、MongoDB 将 URL 放到哈希表中去重,例如 hashset 将 URL 经过 MD5 之后保存到哈希表中去重,相比于上面一种,能够节约空间 使用 布隆过滤器(Bloom Filter)去重,这种方式能够节约大量的空间,就是不...

2019-10-18 16:28:24 37 0

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