自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(114)
  • 资源 (1)
  • 收藏
  • 关注

原创 java8日期

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

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

原创 redis查询优化

  最近公司运维提示线上redis出现报警,排查下来是redis存储的value过大导致查询的时候耗时过高。虽然redis最大限制可以存储512M,但是当单key过大时,每一次访问都会造成redis阻塞,由于redis是单线程的,其他请求只能等待了。在我们的这个场景下,主要是hash存储的json串太大。这里提供两种优化方案,可以根据具体的业务场景进行选择。序列化压缩  Protobuf是Go...

2019-07-12 10:36:39 1759

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

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

2019-03-11 21:26:53 1073

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

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

2019-03-11 14:26:19 5582

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

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

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

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

最近利用tair做分布式锁的时候,在注入NS的时候发现一个bug,具体是这样的:@Componentpublic class SyncLock implements DisposableBean, DistributedLock { private static final Logger logger = LoggerFactory.getLogger(SyncLock.cla...

2018-07-20 10:44:19 1373

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

java基本类型与引用类型目录java基本类型与引用类型目录一基本数据类型二引用类型三基本类型与引用类型的区别默认值内存分配自动装箱自动拆箱自动装箱拆箱带来的问题程序的性能空指针异常对象相等比较时一、基本数据类型java中一共分为8种基本数据类型:byte、short、int、long、float、double、char、b

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

原创 封装的RedisUtil工具类

我们都知道redis支持5种数据结构,Jedis是redis官方首选的Java客户端开发包,大家常用的数据存储方式是把对象转化为JSON字符串,然后通过set存储,取出数据的时候,先通过get取出JSON字符串,然后转化为对象,如果碰到复杂的对象就比较头疼,下面封装了个通用RedisUtil工具,可以实现像Memcache一样快速的存取对象,不用担心转化的问题。实现原理其实就是数据存储之前自己手动

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

原创 笔记

一、List1.ArrayList底层是基于数组实现的,ArrayList存储的元素是有序的,可以重复的,查询速度较快,插入、删除数据,因为要移动大量的元素,所以相对较慢。2.它的数组结构是被transient修饰的。被transient修饰的数据是不会被序列化的,但是ArrayList实现了Serializeable接口。它是自己手动实现了序列化.因为ArrayList集合的容量可能不等于它实际存储的数据,ArrayList是按需进行序列化。3.因为实现了RandomAccess接口,支持快速访问。

2021-12-27 14:46:32 515

转载 大数据优化技巧

前期该系统是作为一个备用系统开发的,也就没有那么多讲究,重构了两次,现在支持对账数据量多少的瓶颈完全在 Redis 了,目前将近千万级别订单量的对账,使用服务器内存高峰在 2G 左右。现在二期对账系统的开发(一期对账系统和二期对账系统是分开的,不是重构)也在进行中了(针对亿级别订单量的对账),在后面会出如何完成日千万级别以上的订单对账(二)。对账的基本 5 大步骤,按照正常的对账来走,基本离不开下面这 5 个步骤\1. 数据加载(数据的缓存是不可少的,需要重新对账的情况很常见)\2. 数据对比(分

2020-12-30 18:25:56 1283

转载 java抽奖(二)

需求抽象一下:(1)前 100 个人有资格,假设抽出 N=5 个奖品;(2)报名就出奖,不用等 100 人到齐;(3)每个人概率一样,礼物平均发放;(4)有一个特例;花 1 分钟说下解决方案。_画外音:_文末会有一个更有意思的问题。特例怎么处理?用一个特殊的逻辑分支处理。报名就可以抽,不用等人齐,意味着什么?奖品可能发不完。例如:只有 1 个人参与,奖品一定发不完。又例如:抛硬币,每抛一次,正反的概率都是 50%(中奖概率相同),但这并不代表,抛 10 次一定有 5 个正面(如果只有

2020-12-29 21:05:22 443

原创 智力题

一、给你一个 5L 和 3L 桶,水无限多,怎么到出 4L。思考过程先将 3L 的桶装满水,倒入 5L 的桶里。 再重新将 3L 的桶装满水,倒入 5L 的桶里,把 5 L 的桶装满后,这样 3L 的桶中就剩下 1L 的水了。 然后把 5L 的桶里的水倒掉,把 3L 的桶中剩下的 1L 水倒入 5L 的桶里。 再打满 3L 的水倒入 5L 的桶里,就是 4L 了。思维拓展用 3L 和 5L 的水桶装出 1L 水,可以,3+3-5=1。用 3L 和 5L 的水桶装出 2L 水,可以,5-3=2。

2020-12-29 21:01:05 213

原创 拦截器+ThreadLocal验证用户

ThreadLocal 类定义public class UserContext { public static final ThreadLocal<String> USER_NAME = new ThreadLocal<>();}拦截器编写@Componentpublic class UserSecurityInterceptor implements HandlerInterceptor { public static final Logger log

2020-05-23 18:02:17 1011

转载 HashedWheelTimer 使用及源码分析

本文介绍的 HashedWheelTimer 是来自于 Netty 的工具类,在 netty-common 包中。它用于实现延时任务。另外,下面介绍的内容和 Netty 无关。如果你看过 Dubbo 的源码,一定会在很多地方看到它。在需要失败重试的场景中,它是一个非常方便好用的工具。本文将会介绍 HashedWheelTimer 的使用,以及在后半部分分析它的源码实现。接口概览在介绍它的使用前,先了解一下它的接口定义,以及和它相关的类。HashedWheelTimer 是接口 io.netty.u

2020-05-20 18:09:46 389

转载 短链接服务系统开发

最近上了一个比较大的系统,基于消息推送的需要,花了点时间做了一个短链服务,实现思路其实很简单,这里简单介绍下实现细节,以及一些优化过程。目录:功能简单描述功能很简单,实现将长网址缩短的功能,如:为什么要转短链?因为要控制每条短信的字数,对于公司来说,短信里面的字可都是钱呀。为什么不用 t.cn,url.cn 等短链服务呢,它们生成的链接不是更短吗?是的,它们确实能实现更短的链接,可是要收钱的,而且这里面充满了商业数据呀。短链服务总的来说,就做两件事:将长链接变为短链接,当然是越短越好用户

2020-05-20 18:02:32 390

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

MyBatis 插件之拦截器(Interceptor)一.背景​ 拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法。Mybatis拦截器设计的一个初衷就是为了供用户在某些时候可以实现自己的逻辑而不必去动Mybatis固有的逻辑。打个比方,对于Executor,Mybatis中有几种实现:BatchExecutor、ReuseExecutor、SimpleExecutor和Ca

2020-05-19 17:40:45 911

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

无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成 Java 类型。Mybatis默认为我们实现了许多TypeHandler, 当我们没有配置指定TypeHandler时,Mybatis会根据参数或者返回结果的不同,默认为我们选择合适的TypeHandler处理。那么,Mybatis为我们实现了哪些TypeHandler呢? 我们怎么自定义实现一个TypeHandler ? 这些都会在接下

2020-05-19 17:35:54 251

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

前言在使用诸如 Mybatis 这种 ORM 框架的时候,一般都会提供缓存功能,用来缓存从数据库查询到的结果,当下一次查询条件相同的时候,只需从缓存中进行查找返回即可,如果缓存中没有,再去查库;一方面是提高查询速度,另一方面是减少数据库压力;Mybatis 也提供了缓存,它分为一级缓存和二级缓存,接下来就来看看它的缓存系统是如何实现的。缓存系统的实现使用了 *模板方法模式* 和 *装饰器模式*装饰器模式在缓存模块的使用Cache:Cache 接口是缓存模块的核心接口,定义了缓存的基本操作;P

2020-05-19 17:32:52 274

转载 plantuml使用教程

Table of Contents前言什么是PlantUML在Emacs里配置PlantUML(参考:Run it from Emacs)其他软件里的PlantUML下载和安装如何使用顺序图(Sequence Diagram)简单示例注释语句申明参与者使用非字母的参与者名称(Use non-letters in participants)发送消息给自己(Message ...

2020-05-08 15:39:39 6327

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

Mybatis拦截器实现数据脱敏利用mybatis拦截器,我们可以实现如下常见的功能:1.数据加密2.数据脱敏3.审计功能4.逻辑删除5.分页6.租户与部门隔离简介数据脱敏(保形加密)与数据加密的区别1、脱敏兼顾数据安全与数据使用,采用专业的数据脱敏算法;而加密则是通过对数据进行编码来保护数据,检索原始值的唯一方法是使用解密密钥解码数据。2、脱敏数据仍然便于使用,但加密数据不...

2020-05-01 17:04:58 4422

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

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

2020-04-26 20:23:13 280

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

上一篇文章分析了 MyBatis 解析配置文件初始化的流程,本篇主要分析一下SqlSession 具体的执行流程。MyBatis 在解析完配置文件后生成了一个 DefaultSqlSessionFactory 对象,后续执行 SQL 请求的时候都是调用其 openSession 方法获得 SqlSessison,相当于一个 SQL 会话。 SqlSession 提供了操作数据库的一些方法,如 s...

2020-04-26 20:17:01 234

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

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

2020-04-26 20:11:39 204

原创 Mybatis入门

Mybatis入门1. ORM简介ORM(Object Relational Mapping)对象-关系映射框架,ORM的主要功能就是根据映射配置文件,完成数据在对象模型与关系模型之间的映射。1.1 常见的ORM框架1.1.1 HibernateHibernate通过hbm.xml映射文件维护一个Java类与数据库表的映射关系,通过Hibernate的映射,Java开发人员可以用看待J...

2020-04-26 20:06:49 183

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

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

2020-04-16 18:11:53 2670 4

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

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

2020-01-15 20:16:32 316

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

在公司有一个需求是要核对一批数据,之前的做法是直接用SQL各种复杂操作给怼出来的,不仅时间慢,而且后期也不好维护,就算原作者来了过一个月估计也忘了SQL什么意思了,于是有一次我就想着问一下之前做这个需求的人为什么不将这些数据查出来后在内存里面做筛选呢?直接说了你不怕把内存给撑爆吗?此核算服务器是单独的服务器,配置是四核八G的,配置堆的大小是4G。本着怀疑的精神,就想要弄清楚几百万条数据真的放入内存...

2020-01-15 15:38:34 1531

原创 DateUtil工具类

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

2019-12-20 10:41:21 700

转载 redis的淘汰算法持久化

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

2019-12-09 16:41:28 838

转载 redis高可用集群方案

絮叨半步神游,神游之下,天下无敌。一梦一游 便是天下。Redis前面几篇的文章链接:从零开始学Redis之金刚凡境从零开始学Redis之自在地境从零开始学Redis之逍遥天境上一篇的逍遥天境 讲的是Redis的内存淘汰策略 和持久化方式。那这半步神游就是带你们遨游Redis的主从HA,哨兵,和Lua脚本Redis主从和哨兵模式Redis 主从搭建(有兴趣的小伙伴自己用虚拟机搭一...

2019-12-09 16:36:47 183

转载 JVM线上监控工具

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

2019-12-09 16:31:33 1346

原创 JVM参数详解

一、参数分类.标准参数功能和输出的参数都是很稳定的 在未来的JVM版本中不会改变 可以使用java -help检索出所有的标准参数X参数非标准化参数 在未来的版本可能会改变 所有的参数都用-X开始 可以使用java -X检索 但是注意没有-XcompXX参数非标准 很长一段时间不会列出来 用于JVM开发的debug和调优二、常用参数1.GC信息打印-verbose:gc开启...

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

原创 JVM调优

JVM调优一.CPU过高1.查看jvm的进程ID,可以通过jps或者psjps -lvmps -ef | grep Test2.找出该进程内最耗费CPU的线程top -Hp 2444linux下,所有的java内部线程,其实都对应了一个进程id,也就是说,linux上的sun jvm将java程序中的线程映射为了操作系统进程3.将线程ID转化为16进制printf “%x\n” ...

2019-12-09 16:24:38 173

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

Java 1.8 常用GC参数速查表GC信息打印-verbose:gc开启输出JVM GC日志-verbose:class查看类加载信息明细-XX:+PrintGCDetailsGC日志打印详细信息-XX:+PrintGCDateStampsGC日志打印时间戳信息-XX:+PrintHeapAtGC在GC前后打印GC日志-XX:+PrintGCApplicationStop...

2019-12-09 14:47:44 384

转载 GC原理和性能调优

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

2019-12-09 14:45:48 403

转载 Springboot自定义starter

使用springboot开发应用已经有一段时间了,我们都沉醉于它简洁的配置和平滑的上手曲线。在springboot的开发中,starter是一个核心的配置,只需要引入对应模块的starter,然后在application.properties中引入对应的配置项,就可以开发业务逻辑了。这一切都归功于springboot的自动配置的能力。那么本文就让我们基于Jedis客户端封装一个我们自己的简易...

2019-11-27 11:50:27 180

原创 解决Maven依赖冲突

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

2019-11-26 15:13:42 516

原创 Springboot整合Sentinel

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

2019-11-22 19:39:19 12404 2

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

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

2019-11-07 10:54:34 792

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

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

2019-11-07 10:54:05 402

无向图的建立和遍历(C++)

用邻接矩阵作为存储方式,C++实现的无向图的建立,广度遍历和深度遍历,以及求顶点的度数和邻接点

2012-05-10

空空如也

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

TA关注的人

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