自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 小强统一认证中心开源介绍

小强统一认证中心开源了,集SSO单点+用户权限全家桶,支持多平台,多系统。同一账号,一点登录,多平台共享。新业务系统无需开发登录与用户权限,对接认证中心即可。干掉重复工作。

2021-02-07 20:49:25 11205 2

原创 SSO单点登录

本文主要讲解SSO登录相关知识点,主要从以下几个方面是什么?能做什么?优缺点登录完整流程图解注销流程总结1.SSO是什么单点登录的英文名叫做:Single Sign On(简称SSO)。SSO是一种统一认证和授权机制,作用在多个应用系统,或者是分布式系统中,用户只需一次登录,就可以访问所有相互信任的其它应用系统,实现自动登录。比如网页端的淘宝网和天猫商城,如果你登录了淘宝你会发现天猫也自动登录了。2.SSO能做什么统一登录 (一次登录,多平台共享);完善的统一认证中心还可

2021-02-05 14:34:42 5407

原创 ElasticSearch查询实战之电商商城商品搜索

1.简介Elasticsearch是一个基于Lucene的搜索服务器。提供了一个分布式多用户能力的全文搜索引擎,在前面的文章中讲解了单机、集群搭建、DSL语句、分词器、以及整合SpringBoot的Demo。Elasticsearch专题篇ElasticSearch基本概念(索引,分片,节点,倒排索引…)ElasticSearch7.x单机版安装ElasticSearch7.x高可用集群版搭建Elasticsearch 7x 配置文件详解Elasticsearch客户端工具之kibanaE

2021-01-05 15:29:07 8453 2

原创 ElasticSearch专题全总结篇

ElasticSearch专题总结内容来了,使用的版本是7.x 。从单机版安装到集群高可用生产环境搭建,以及DSL语法详细使用介绍,SpringBoot整合。大致预告内容如下,陆续更新中 …ElasticSearch基本概念(索引,分片,节点,倒排索引…)ElasticSearch7.x单机版安装ElasticSearch7.x高可用集群版搭建Elasticsearch 7x 配置文件详解Elasticsearch客户端工具之kibanaElasticsearch客户端工具之ES-Head

2020-12-12 21:44:11 8065

原创 轻量级任务调度平台xqiang-job

在开发过程中,定时任务随处可见,很多是配合业务功能使用的,任务调度的好,工作才会甜甜的。常见的几种任务调度方式:Timer(自带的定时器) ;ScheduledExecutor ;开源工具包 Quartz ;开源工具包 JCronTab ;分布式任务调度平台 XXL-job (传送门)常见的困扰项目中写死执行调度频率基本上不灵活,无法传动态参数 ;部署一个分布式调度平台,若数据量没那么大,显得厚重,得有服务器部署也复杂 ;功能期望支持手动启动与停止 ;支持传动态参数 ;

2020-05-24 15:35:26 8545

原创 基于自定义注解+切面+Redis通用接口缓存实现(附源码)

简介随着系统QPS逐渐提高,在一些读取频繁变更较少数据场景下,适当添加缓存不仅能提升用户访问速度还可以减轻系统压力。使用缓存主要有两个用途:高性能、高并发高性能:查询mysql耗时需要300ms,存到缓存redis,每次查询仅需要几毫秒,性能瞬间提升百倍。高并发mysql 单机支撑2K QPS就容易报警了,使用缓存的话,单机支撑的并发量轻松1s几万~十几万。缓存位于内存,内存...

2020-05-02 18:05:47 8909 1

原创 Redis4.0高可用集群模式搭建

Redis集群需要至少要三个master节点,因为选举模式,节点数必须是基数所以:1个master-1个slave,redis集群需要6个节点1个master-2个slave,redis集群需要9个节点,以此类推。这里搭建三个master节点,并且给每个master再搭建一个 slave , 共6个redis节点,3主3从由于节点数较多,这里采用在一台机器上创建6个redis实例做演示所...

2020-03-23 19:11:04 8011 1

原创 基于Redis实现分布式单号,分布式ID(自定义规则生成)

背景一些业务背景下,业务要求单号需要有区分不同的前缀,那么在分布式的架构下如何自定义单号而且还能保证唯一呢?Redis实现方式Redis的所有命令操作都是单线程的,本身提供像 incr 和 increby 这样的自增原子命令,所以能保证生成的 ID 肯定是唯一有序的。优点:不依赖于数据库,灵活方便,且性能优于数据库;数字ID天然排序,对分页或者需要排序的结果很有帮助。缺点:如果系统中没有...

2019-01-01 19:34:42 19503 8

原创 Mybatis 批量操作8种实现总结

Mybatis 批量操作8种实现总结超全带实例

2018-12-09 15:57:53 26020 3

原创 Redis 分布式锁的java版正确实现

分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁本文主要介绍了Java代码如何正确实现Redis分布式锁,对于加锁和解锁也分别给出了几个比较经典的错误示例分布式锁可靠性条件1.互斥性、在任意时刻,只有一个客户端能持有锁。2.不会发生死锁、即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。3...

2018-10-10 20:03:48 11123

原创 高并发下System.currentTimeMillis()并发问题以及优化对比

前言在高并发场景下System.currentTimeMillis()并发问题严重,甚至比创建一个普通对象要耗时的多;在系统中有时候不可避免要打印一些时间戳,但怎么做才更好呢。代码实现iimport java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java...

2018-09-22 16:15:28 13671 3

原创 基于Redis位图BitMap的布隆过滤器(附源码)

Redis的 bitmap 支持2^32大小,内存最大512MB,误判率万分之一 ,差不多可以放下2亿左右的数据,性能高,空间占用率极小,省去了大量无效的数据库连接。可用于实现用户签到、用户日活、在线状态、布隆过滤器等。本文主要讲解基于Redis的 Bitmap (位图) 实现布隆过滤器,可用于防止缓存穿透等场景。1.主要涉及知识点jedis连接池pipeline redis管道技术,也叫流水线位图bitMap2.布隆过滤器代码实现注:这里仅列出了部分核心代码实现,详见文末源码链接/**

2021-12-05 22:05:59 2113

原创 [ Redis16篇]BitMap布隆过滤器

1.什么是布隆过滤器本质上布隆过滤器是一种数据结构,特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。实现原理:布隆过滤器是一个 bit 向量或者说 bit 数组,长这样:2.使用场景解决数据库缓存击穿(比如受到攻击服务器时,会构建大量不存在于缓存中的key向服务器发起请求,在数据量足够大的时候,频繁的数据库查询会导致宕机);去重(比如:爬

2021-12-05 21:54:48 1471

原创 [ Redis15篇]事务支持

Redis事务Redis事务功能是通过MULTI、EXEC、DISCARD和WATCH 四个原语实现的Redis事务的三个阶段事务开始 MULTI命令入队事务执行 EXEC事务执行过程中,如果服务端收到有EXEC、DISCARD、WATCH、MULTI之外的请求,将会把请求放入队列中排队Redis会将一个事务中的所有命令序列化,然后按顺序执行。1.redis 不支持回滚“Redis 在事务失败时不进行回滚,而是继续执行余下的命令”, 所以 Redis 的内部可以保持简单且快速。2.如果

2021-12-05 21:52:22 1065

原创 [ Redis14篇]字典之渐进式Hash结构

1.Redis字典Hash底层数据结构?Redis 字典 hash 的数据结构底层是一个 dict 对象。用key值计算hashkey元素插入到某个hash链上(拉链法解冲突)dict的结构:dictht table 哈希表内部的table结构使用了拉链法来解决哈希冲突其实是一个指向数组的指针,数组中的每一项都是entry链表的头结点。dictht ht[2]:在dict的内部,维护了两张哈希表(可以理解为2个数组)。作用等同于是一对滚动数组,ht[0]表是旧表,ht[1]

2021-12-05 21:51:11 1172

原创 [ Redis13篇] 跳表底层结构的深度分析

1.跳跃表是什么?**跳跃表(skiplist)是一种有序数据结构它通过在每个节点中维持多个指向其它节点的指针, 从而达到快速访问节点的目的。跳跃表支持平均 O(log N) 最坏 O(N) 复杂度的节点查找Redis 实现有序集合就用到了跳跃表是一种以空间换时间的存储方式跳表的结构2.Redis中跳跃表的实现Redis的跳跃表由 zskiplistNode 和 skiplist 两个结构定义zskiplist 结构则用于保存跳跃表(节点的数量,头节点 、表尾节点、目前表内节点的

2021-12-05 21:48:29 512

原创 [ Redis12篇]数据类型底层结构的神秘面纱

1.RedisObjectstruct RedisObject{ int4 type; // 4bits 类型 int4 encoding; // 4bits 存储形式 int24 lru; // 24bits LRU时间 int32 refcount; // 4bytes 引用计数 void *ptr; // 8bytes 指向对象的指针}不同的对象具有不同的类型type, 例如string,lis

2021-12-05 21:46:55 369

原创 [ Redis11篇] 主从复制原理

1.主从简版流程主从初次建立连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。Redis 的策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。2.主从复制原理slave 初次连接 master 后,发送同步 sync 命令;master 接收到 sync 命令后,开始执行 bgsave 命令生成 RDB 文件并使用缓冲区记录,同步期间产生的变更命令;master 执行 bgsave 完成后,向所有

2021-12-05 21:45:56 146

原创 [ Redis10篇] 集群Cluster相关灵魂16问

1.哨兵与集群1)、Redis 哨兵 着眼于高可用,在 master 宕机时会自动将 slave 提升为master,继续提供服务。2)、Redis 集群(Cluster)着眼于扩展性,在单个 redis 内存不足时,使用 Cluster 进行分片存储。2.集群的配置根据官方推荐,集群部署至少要 3 台以上的master节点,最好使用 3 主 3 从六个节点的模式。3.集群方案什么情况下会导致整个集群不可用?**比如有 A,B,C 三个节点的集群在没有复制模型的情况下,如果节点 B 失败了。

2021-11-26 20:20:30 1448

原创 [ Redis09篇] 哨兵模式工作原理

1.哨兵模式哨兵在redis集群架构中是一个非常重要的组件**,具有监控、通知、故障转移的功能。**哨兵也是一台 Redis 服务器,只是不对外提供任何服务。配置哨兵时配置为单数,哨兵使用的配置文件是 sentinel.conf哨兵集群至少要 3 个节点,来确保自己的健壮性。redis主从 + sentinel的架构,是不会保证数据的零丢失的,它是为了保证redis集群的高可用。2.哨兵的作用监控:监控主节点和从节点是否正常运行;通知:哨兵检测的服务器出现问题时,会向其他的哨兵发送通知,

2021-11-26 20:19:03 1042

原创 [ Redis08篇] 缓存一致性问题

1.缓存一致性问题怎么解决?针对缓存一致性要求不是很高的场景,可以只通过设置合适的超时时间就可以了可以使用延迟双删, 先删除缓存,再更新数据库,然后休眠适当时间,再删除一次缓存若先更新数据库,再删除缓存 , 可引入消息队列 ,使用消息订阅方式来删缓存,但是引入消息队列增加了复杂度。不推荐也可以通过订阅数据库binlog,也达到了与业务截藕的作用。2.为什么先更新数据库,再删除缓存​更新数据库成功,如果删除缓存失败或者还没有来得及删除,那么,其他线程从缓存中读取到的就是旧值3.为什么是删

2021-11-26 20:16:28 241

原创 [ Redis07篇] 实现消息队列的方案

1.如何用Redis做异步队列么?**list 结构作为队列,lpush 生产消息,lpop 消费消息。当 lpop 没有消息的时候,要适当 sleep 一会再重试。2.可不可以不用 sleep 呢?list 还有个指令 blpop,在没有消息的时候,它会阻塞住直到消息到来。3.能不能生产一次消费多次呢?**使用 发布订阅(pub/sub)阅者模式,可以实现1:N 的消息队列。4.pub/sub发布订阅 有什么缺点?**在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列

2021-11-26 20:13:16 190

原创 [ Redis06篇] 分布式锁实现的话术表达

如何实现分布式锁,是面试老生常谈的一个问,但是怎么回答的才算好呢,个人认为可以将多种方案一一列举,然后说出其优缺点,以及使用场景,这样回答会比较好。1.使用Redis如何实现分布式锁方案一使用 redis set(k,v ,nx,px) 命令 ,一个命令,设置锁的同时设置失效时间。使用一个命令保证原子性。key 是自己定义的key, value 可以用当前线程的ID或者是 ,建议调用方自定义一个业务标识,在加锁的方法开始可以使用UUID解锁放在 finally 中 , 由于 redis 没有提

2021-11-26 20:11:17 608

原创 [ Redis篇05] 持久化机制的秘密

1. 持久化机制是什么?各自的优缺点?**Redis 提供两种持久化机制 RDB 和 AOF 机制:RDB(Redis DataBase)以数据集快照形式保存在一个二进制dump.rdb文件通过配置 save 属性, 定时执行 ,会fork 子进程来完成写操作,不影响主进程服务,保证了 redis的高性能相比AOF 数据恢复更快数据安全性低。间隔一段时间进行持久化,若发生故障可能会存在间隔时间内的丢失。AOF (Append-only fifile)记录所有的命令记录 ,

2021-11-26 20:03:59 820

原创 [ Redis篇04] IO多路复用的神秘面纱

1.Redis 为什么这么快Redis 为什么这么快的原因前面已经基本提到了,现在我们再进行总结一下:Redis 是一款纯内存结构,避免了磁盘 I/O 等耗时操作。Redis 命令处理的核心模块为单线程,减少了锁竞争,以及频繁创建线程和销毁线程的代价,减少了线程上下文切换的消耗。采用了 I/O 多路复用机制,大大提升了并发效率。2.解释IO多路复用I/O 指的是网络 I/O多路指的是多个 TCP 连接(如 Socket),复用指的是复用一个或多个线程。多路I/O复用模型是利用 sel

2021-11-26 20:01:31 663

原创 [ Redis03篇] 穿透与击穿与雪崩

1.穿透1.1什么是缓存穿透?查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。如果key对应的value是一定不存在的,并且对该key并发请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。1.2造成的原因业务自身代码或数据出现问题;一些恶意攻击、爬虫造成大量空的命中,此时会对数据库造成很大压力。1.3如何避免?对查询结果为空的情况也进行缓存,缓存时间设置短一点;但是也

2021-11-26 19:59:53 465

原创 [ Redis02篇] Redis过期与内存淘汰策略

1.Redis的过期策略惰性删除流程:在进行get或setnx等操作时,先检查key是否过期,若过期,删除key,然后执行相应操作;若没过期,直接执行相应操作。定期删除流程:遍历每个数据库,检查当前库中的指定个数个key(默认是每个库检查20个key,注意相当于该循环执行20次,循环体时下边的描述),如果当前库中没有一个key设置了过期时间,直接执行下一个库的遍历,随机获取一个设置了过期时间的key,检查该key是否过期,如果过期,删除key,判断定期删除操作是否已经达到指定时长,若已经达到,直

2021-11-26 19:55:41 222

原创 [ Redis01篇] 10+种数据类型与使用场景

1.String含义:字符串使用场景:缓存、验证码、计数器、分布式锁、分布式id生成器常用命令: get、set 、 mget(批量获取)、incr(计数器)、setnx(锁)2.List含义:双向列表特点:有序,方便截取使用场景:最新列表,关注列表,消息队列常用命令:lpush(添加到头部)、lrange(指定范围查)、 brpop (移除并弹出最后一个) 、lpop(移除并获取第一个元素)3.Set含义:set集特点:可根据自定义分值排序使用场景:无序集合,已读,抽奖,共同好友

2021-11-26 19:53:14 204

原创 高级必会,摸鱼必背之CPU过高常见原因与解决

1.CPU过高常见原因代码的锅, 比如 :死循环,递归系统创建了大量线程池。线程池并发执行导致CPU过高JVM在频繁执行full gc2.频繁full gc原因JVM内存配置不合理,导致新生代ygc快速进入老年代,老年代迅速撑满触发full gc.存在内存泄露,内存里驻留了大量对象进入老年代gc不释放,导出少量对象进入老年代就会触发full gc.元空间(永久代)设置太小类多塞满导致频繁full gc.代码有System.gc(),高并发下频繁full gc。3.线上服务的CPU很

2021-11-21 22:05:05 2981

原创 常见OOM异常及原因

1.堆内存溢出(Java heap space)异常信息:java.lang.OutOfMemoryError: Java heap space可能原因:死循环、递归层数太多、内存泄露。或者系统并发高请求量大内存太小。解决方案:排查代码 jstack jmap jstat参数设置:-Xms1024m JVM启动内存初始大小 -Xmx3062m JVM启动内存的最大值2.栈溢出(Thread Stack space)异常信息:java.lang.StackOverflowError:

2021-11-21 22:03:23 2762

原创 JVM调优五大技能

1.什么时候需要JVM调优应用的响应慢、CPU占用高应用吞吐量小,占用内存空间过大这些表象一般伴随着频繁的垃圾回收,或者OOM。2.JVM调优一般调什么应用占用的内存(堆内存,元空间内存)新生代老年代的大小,比例。垃圾回收器的选择。堆内存参数| -Xms512m | 初始堆大小默认值:若未设置,初始值将是老年代和年轻代分配制内存之和-Xmx1024m年轻代内存相关参数| -Xmn512m | 新生代的初始值及最大值。默认值:堆内存的1/4(已经

2021-11-21 22:00:19 875 1

原创 如何判断对象应被回收?

1.如何判断对象应被回收?【引用计数法】系统为对象添加一个计数器,当有新的引用时加1,引用失效时减1。但此方法无法解决两个对象循环引用的问题。【可达性分析法】通过对象的引用链来判断该对象是否需要被回收。通过一系列的GC Roots的对象作为起始点,从这些起节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是不可用的,就需要回收此对象。2.GC ROOT 对象虚拟机栈中栈桢中的局部变

2021-11-21 21:56:58 591

原创 GC 垃圾收集器层层剖析

1.你知道哪些垃圾收集器?新生代收集器:串行-**收集器 **Serial (单线程、复制算法) [-XX:+UseSerialGC]ParNew (Serial+多线程 , 复制算法)[-XX:+UseParNewGC]ParallelScavenge [-XX:+UseParallelGC]G1 (多线程标记清除算法)老年代收集器:SerialOld(单线程、标记整理算法) [ -XX:+UseSerialOldGC ]ParallelOld(多线程标记整理算法) [ -X

2021-11-21 21:54:44 295

原创 垃圾回收机制点睛4问

1.触发垃圾回收的条件新生代 Eden区域满了,触发young gc (ygc)老年代区域满了,触发full gc (fgc)MetaSpace空间不足,触发full gc (fgc)通过ygc后进入老年代的平均大小大于老年代的可用内存,触发full gc(fgc).程序中主动调用的System.gc()强制执行gc,是full gc,但是不必然执行。2.垃圾回收流程当Eden满后,会触发young gc, 把有引用存活的对象复制到S0区域,回收清空Eden区域。当Eden再次满后,触

2021-11-21 21:52:57 271

原创 类的实例化顺序

1. 类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,他们的执行顺序答:先静态:父静态 > 子静态 。优先级:父类 > 子类 , 静态代码块 > 非静态代码块 > 构造函数。父类的静态成员变量 、 静态代码块加载子类的静态成员变量、 静态代码块加载父类成员变量和方法块加载父类的构造函数加载子类成员变量和方法块加载子类的构造函数加载2.一个类的实例化过程:父类中的static代码块,当前类的static顺序执行父类的普通代码

2021-11-21 21:51:28 3802

原创 类加载器与双亲委派

1.类加载器分类默认的类加载器有3种Bootstrap ClassLoader(根类加载器)、Extension ClassLoader(扩展类加载器)、Application ClassLoader (系统类加载器)类加载器之间是委派体系,首先会到自己的父类中查找,如果找不到才会到自己在加载。为了避免重复加载。2.启动类加载器 BootstrapClassLoader嵌在JVM内核中的加载器,由C++语言编写。主要负载加载 JAVA_HOME/lib 下的类库,启动类加载器无法被应用程序直接

2021-11-21 21:50:38 427

原创 类的加载全过程

1.什么是类的加载虚拟机把描述类的数据从Class文件加载到内存,并为之创建一个java.lang.Class对象,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的java类型。也就是说程序使用任何类时,系统都会为之建立一个java.lang.Class对象。2.类的生命周期类的生命周期包括这5个部分,加载、连接、初始化、使用和卸载,其中前三部是类的加载的过程,如下图;加载(Loading):java文件加载成 Class 文件,在堆中创建一个java.lang.Class类的对象

2021-11-21 21:48:11 785

原创 JVM高频突击

1.JVM内存模型,哪些区,分别干什么方法区也被称为永久代,存储虚拟机加载的类信息、常量、静态变量。常量池也是方法区的一部分。JDK8以后废弃了永久代改用元空间,不在虚拟机,在本地内存中。方法区移至 Metaspace,字符串常量移至 Java Heap,常量池移至 Metaspace。2.JVM垃圾回收算法有哪些?它们有什么区别?标记 -清除算法(Mark-Sweep)分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。缺点:标记和清

2021-11-21 21:45:14 238

原创 Java异常总结

1.Java中异常分为哪两种?**编译时异常运行时异常2.异常的处理机制有几种?异常捕捉:try…catch…fifinally,异常抛出:throws。3.如何自定义一个异常继承一个异常类,通常是RumtimeException或者Exception4.try catch fifififinally,try里有return,fifinally还执行么?执行,并且finally的执行早于try里面的return结论:不管有木有出现异常,finally块中代码都会执行;5.常见的异常

2021-10-30 17:43:46 188

原创 Http网络高频题目

1.tcp和udp区别①TCP面向连接(三次握手),数据安全、面向字节流、速度略低。分为客户端和服务端。三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据②UDP是无连接的,数据不安全,速度快,无阻塞。不区分客户端与服务端。2.什么时候应该使用UDP,场景哪些?当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。 比如,日常生活中。常见使用UDP协议的应用如下: QQ语音 QQ视频 TFTP。3.Cookie和Session的区别Htt

2021-10-30 17:29:30 217

空空如也

空空如也

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

TA关注的人

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