- 博客(44)
- 收藏
- 关注
原创 5、Zuul使用和源码分析
统一入口:为全部微服务提供唯一入口点,网关起到外部和内部隔离,保障了后台服务的安全性。鉴权校验:识别每个请求的权限,拒绝不符合要求的请求。动态路由:动态的将请求路由到不同的后端集群中。减少客户端与服务的耦合,服务可以独立发展。通过网关层来做映射。Zuul介绍zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用。Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和。
2023-09-18 02:10:35
149
原创 4、Hystrix使用和源码分析
微服务架构中存在的问题由于调用链中的某个服务出现问题,引起整个系统的雪崩Hystrix是什么Hystrix是用于处理延迟和容错的开源库Hystrix的作用是怎么服务隔离丶服务熔断丶服务降级(快速失败)限流请求合并和请求响应自带单体和集群监控Hystrix熔断器介绍熔断器是一种开关,用来控制流量是否执行业务逻辑熔断器核心指标:快照时间窗熔断器核心指标:请求总数阈值熔断器核心指标:错误百分比阈值。
2023-09-18 02:09:02
438
原创 3、openFeign使用和源码分析
OpenFeign可以做到使用Http请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方,更感知不到这是个Http请求.openFeign是netflix开源的声明式Http客户端。 (1) Apache引入依赖。 (2) 属性配置。(1). 代码方式-指定日志级别。(2). 属性方式-指定日志级别。什么是OpenFeign。(1) 实现请求拦截接口。(2) 注入请求拦截器。(3)实现MVC拦截器。(4)注入MVC拦截器。常见的Http客户端。
2023-09-18 02:08:02
90
原创 1、Eureka使用和源码分析
一般情况下,微服务在eureka上注册后,会30秒发送一个心跳包,eureka通过心跳来判断服务是否健康,同事后定期删除超过90秒没有发送心跳的服务。eurekaserver在运行期间,会统计心跳失败的比例在15分钟内是否低于85%,这种算法叫做eureka server的自我保护机制。如果90秒内eureka server未收到续约,则进行服务剔除。有两种情况eureka server搜不到服务的心跳。自我保护机制: 不删除心跳过期的服务。什么条件下eureka会启动自我保护?为什么要启动自我保护。
2023-09-18 02:03:41
44
原创 6.4、Redis过期策略和惰性删除(设计与实现)
除了定时遍历之外,它还会使用惰性策略来删除过期的 key,所谓惰性策略就是在客户端访问这个 key 的时候,redis 对 key 的过期时间进行检查,如果过期了就立即删除。同时因为Redis 是单线程的,删除的时间也会占用线程的处理时间,如果删除的太过于繁忙,会不会导致线上读写指令出现卡顿。UNLINK的实现中,首先会清除过期时间,然后调用dictUnlink把要删除的对象从数据库字典摘除,再判断下对象的大小(太小就没必要后台删除),如果足够大就丢给后台线程,最后清理下数据库字典的条目信息。
2023-09-17 07:28:47
204
原创 6.3、Redis缓存淘汰算法(设计与实现)
比如我现在要进行LRU,那么首先拿到当前的全局时钟,然后再找到内部时钟与全局时钟距离时间最久的(差最大)进行淘汰,这里值得注意的是全局时钟只有24位,按秒为单位来表示才能存储194天,所以可能会出现key的时钟大于全局时钟的情况,如果这种情况出现那么就两个相加而不是相减来求最久的key。当字典的某个元素被访问时,它在链表中的位置会被移动到表头。它的全称是Least Frequently Used,它的核心思想是根据key的最近被访问的频率进行淘汰,很少被访问的优先被淘汰,被访问的多的则被留下来。
2023-09-17 07:27:47
46
原创 6.2、Redis中的线程和IO模型(设计与实现)
Redis 为各种文件事件需求编写了多个处理器,若客户端连接Redis,对连接服务器的各个客户端进行应答,就需要将socket映射到连接应答处理器写数据到Redis,接收客户端传来的命令请求,就需要映射到命令请求处理器从Redis读数据,向客户端返回命令的执行结果,就需要映射到命令回复处理器当主服务器和从服务器进行复制操作时,服务器会为执行不同任务的套接字关联不同的事件处理器, 这些处理器是一个个函数, 它们定义了某个事件发生时, 服务器应该执行的动作。开启多线程后,还需要设置线程数,否则是不生效的。
2023-09-17 07:27:17
45
原创 6.1、Redis数据结构和内部编码(设计与实现)
第一,可以改进内部编码,而对外的数据结构和命令没有影响,这样一旦开发出更优秀的内部编码,无需改动外部数据结构和命令,例如Redis3.2提供了quicklist,结合了ziplist和linkedlist两者的优势,为列表类型提供了一种更为优秀的内部编码实现,而对外部用户来说基本感知不到。第二,多种内部编码实现可以在不同场景下发挥各自的优势,例如ziplist比较节省内存,但是在列表元素比较多的情况下,性能会有所下降,这时候Redis会根据配置选项将列表类型的内部实现转换为linkedlist。
2023-09-17 07:26:40
35
原创 jvm调优
根据需求进行进行jvm规划预调优优化运行jvm运行环境(慢,卡顿)解决jvm运行过程中出现的各种问题(OOM) OOM内存溢出 观测有哪些对象产生了OO。
2023-09-15 01:34:34
49
原创 jvm类加载机制
在Java堆中生成一个数据访问入口也就是java.lang.class对象。类加载器:通过父类委托机制加载ClassLoader层级最高的class。将这个字节流所代表的静态储存结构转换成方法区的运行时数据结构。class文件 – 字节流 – 类加载器。双亲委派(父类委托)
2023-09-15 01:33:43
35
原创 jvm运行时数据区组成
是用来描述java方法执行的内存模型,每个方法在执行的同时创建一个栈帧,包括:局部变量表,操作数栈,动态链接,方法出入口信息。局部变量存储的对象:1.基本数据类型(int,long,float)2.对象的引用,指向对象起始地址的引用地址,代表的对象句柄3.returnAddress指向了一条字节码地址。程序运行java方法时,程序计数器记录的是,当前正在执行的虚拟机字节码指令地址,执行native方法时,计数器为空。如:类信息(类版本,方法,字段,接口等),常量,静态变量,编译后的代码等。
2023-09-15 01:32:52
35
原创 java基础面试题
Java虽然提供了丰富的异常处理类,但是在项目中还会经常使用自定义异常,其主要原因是Java提供的异常类在某些情况下还是不能满足实际需球。例如以下情况:1、系统中有些错误是符合Java语法,但不符合业务逻辑。2、在分层的软件结构中,通常是在表现层统一对系统其他层次的异常进行捕获处理。
2023-09-15 01:25:20
53
原创 微服务面试题
幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。在编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。
2023-09-15 01:24:32
256
原创 spring面试题
IOC(Inversion of Control),意思是控制反转,不是什么技术,而是一种设计思想,IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。 在传统的程序设计中,我们直接在对象内部通过new进行对象创建,是程序主动去创建依赖对象,而IOC是有专门的容器来进行对象的创建,即IOC容器来控制对象的创建。
2023-09-15 01:22:17
54
原创 数据库面试题
1、MVCC MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。2、当前读 像select lock in share mode(共享锁), select for update;
2023-09-15 01:21:19
48
原创 多线程面试题
1.创建当程序使用new关键字创建了一个线程之后,该线程就处于一个新建状态(初始状态),此时它和其他Java对象一样,仅仅由Java虚拟机为其分配了内存,并初始化了其成员变量值。此时的线程对象没有表现出任何线程的动态特征,程序也不会执行线程的线程执行体。2.就绪当线程对象调用了Thread.start()方法之后,该线程处于就绪状态。Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态的线程并没有开始运行,它只是表示该线程可以运行了。
2023-09-15 01:11:12
30
原创 5.6、Redis多级缓存实例与互联网大厂中的Redis(缓存使用问题)
一个使用了Redis集群和其他多种缓存技术的应用系统架构如图首先,用户的请求被负载均衡服务分发到Nginx上,此处常用的负载均衡算法是轮询或者一致性哈希,轮询可以使服务器的请求更加均衡,而一致性哈希可以提升Nginx应用的缓存命中率。接着,Nginx应用服务器读取本地缓存,实现本地缓存的方式可以是Lua Shared Dict,或者面向磁盘或内存的Nginx Proxy Cache,以及本地的Redis实现等,如果本地缓存命中则直接返回。
2023-08-02 18:50:26
57
原创 5.5、Redis脑裂(缓存使用问题)
数据就不一致了,哨兵恢复对老master节点的感知后,会将其降级为slave节点,然后从新maste同步数据(full resynchronization),导致脑裂期间老master写入的数据丢失。Redis集群的脑裂一般是不存在的,因为Redis集群中存在着过半选举机制,而且当集群16384个槽任何一个没有指派到节点时整个集群不可用。而脑裂最直接的影响,就是客户端不知道应该往哪个主节点写入数据,结果就是不同的客户端会往不同的主节点上写入数据。而且,严重的话,脑裂会进一步导致数据丢失。
2023-08-02 14:08:07
55
原创 5.4、Redis BigKey(缓存使用问题)
bigkey是指key对应的value所占的内存空间比较大,例如一个字符串类型的value可以最大存到512MB,一个列表类型的value最多可以存储23-1个元素。如果按照数据结构来细分的话,一般分为字符串类型bigkey和非字符串类型bigkey。字符串类型:体现在单个value值很大,一般认为超过10KB就是bigkey,但这个值和具体的OPS相关。非字符串类型:哈希、列表、集合、有序集合,体现在元素个数过多。bigkey无论是空间复杂度和时间复杂度都不太友好,下面我们将介绍它的危害。
2023-08-02 13:34:30
68
原创 5.3、Redis热点Key(缓存使用问题)
将热点key分散为多个子key,然后存储到缓存集群的不同机器上,这些子key对应的value都和热点key是一样的。在服务端读数据进行访问时,往往会对数据进行分片切分,此过程中会在某一主机Server上对相应的Key进行访问,当访问超过Server极限时,就会导致热点Key问题的产生。客户端其实是距离key"最近"的地方,因为Redis命令就是从客户端发出的,以Jedis为例,可以在核心命令入口,使用这个Google Guava中的AtomicLongMap进行记录,如下所示。
2023-08-02 13:12:29
191
原创 5.2、Redis缓存穿透、击穿、雪崩(缓存使用问题)
缓存雪崩:由于缓存层承载着大量请求,有效地保护了存储层,但是如果缓存层由于某些原因不能提供服务,比如同一时间缓存数据大面积失效,那一瞬间Redis跟没有一样,于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会级联宕机的情况。第二,缓存层和存储层的数据会有一段时间窗口的不一致,可能会对业务有一定影响。是指查询一个根本不存在的数据,缓存层和存储层都不会命中,于是这个请求就可以随意访问数据库,这个就是缓存穿透,缓存穿透将导致不存在的数据每次请求都要到存储层去查询,失去了缓存保护后端存储的意义。
2023-08-02 12:17:28
36
原创 5.1、Redis数据一致性(缓存使用问题)
这种方式,被称为Cache Aside Pattern,读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。更新的时候,先更新数据库,然后再删除缓存。主要取决于“更新缓存的复杂度”,更新缓存的代价很小,此时我们应该更倾向于更新缓存,以保证更高的缓存命中率,更新缓存的代价很大,此时我们应该更倾向于淘汰缓存。如果是新增数据,数据会直接写到数据库中,不用对缓存做任何操作,此时,缓存中本身就没有新增数据,而数据库中是最新值,此时,缓存和数据库的数据是一致的。这么做,加大吞吐量。
2023-08-02 11:39:03
97
1
原创 4.3、Redis集群(高并发高可用)
Redis集群中,在握手成功后,连个节点之间会定期发送ping/pong消息,交换数据信息,集群中节点数量越多,消息体内容越大,比如说10个节点的状态信息约1kb,同时redis集群内节点,每秒都在发ping消息。如下图所示,三个节点真实节点:Node1、Node2和Node3,每个真实节点虚拟出三个虚拟节点:X#V1、X#V2和X#V3,这样每个真实节点所负责的hash空间不再是连续的一段,而是分散在环上的各处,这样就可以将局部的压力均衡到不同的节点,虚拟节点越多,分散性越好,理论上负载就越倾向均匀。
2023-08-02 11:36:06
181
1
原创 4.2、Redis哨兵(高并发高可用)
当Sentinel主观下线的节点是主节点时,该Sentinel节点会通过sentinel is-master-down-by-addr命令向其他Sentinel节点询问对主节点的判断,当超过个数,Sentinel节点认为主节点确实有问题,这时该Sentinel节点会做出客观下线的决定,这样客观下线的含义是比较明显了,也就是大部分Sentinel节点都对主节点的下线做了同意的判定,那么这个判定就是客观的。假如Sentinel节点对于主节点已经做了客观下线,那么是不是就可以立即进行故障转移了?
2023-07-25 17:47:17
70
原创 4.1、Redis主从复制(高并发高可用)
在统计信息中可以看到从节点slave信息,分别记录了从节点的ip和 port,从节点的状态,offset表示当前从节点的复制偏移量,master_repl_offset表示当前主节点的复制偏移量,两者的差值就是当前从节点复制延迟量。当从节点(slave)正在复制主节点(master)时,如果出现网络闪断或者命令丢失等异常情况时,从节点会向主节点要求补发丢失的命令数据,如果主节点的复制积压缓冲区内存在这部分数据则直接发送给从节点,这样就可以保持主从节点复制的一致性。默认情况下,Redis都是主节点。
2023-07-24 18:26:11
91
原创 3.2、Redis 分布式锁(底层原理)
Redlock 只有建立在「时钟正确」的前提下,才能正常工作,如果你可以保证这个前提,那么可以拿来使用。但是时钟偏移在现实中是存在的:第一,从硬件角度来说,时钟发生偏移是时有发生,无法避免。例如,CPU 温度、机器负载、芯片材料都是有可能导致时钟发生偏移的。第二,人为错误也是很难完全避免的。所以,Redlock尽量不用它,而且它的性能不如单机版 Redis,部署成本也高,优先考虑使用主从+ 哨兵的模式实现分布式锁(只会有很小的记录发生主从切换时的锁丢失问题)。
2023-07-21 18:02:41
622
1
原创 3.1、Redis持久化(底层原理)
该状态开启后,如果执行bgrewriteaof命令,则会把当前内存中已有的数据弄成二进程存放在aof文件中,这个过程模拟了rdb生成的过程,然后Redis后面有其他命令,在触发下次重写之前,依然采用AOF追加的方式。加载损坏的AOF 文件时会拒绝启动,对于错误格式的AOF文件,先进行备份,然后采用redis-check-aof --fix命令进行修复,对比数据的差异,找出丢失的数据,有些可以人工修改补全。随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入AOF重写机制压缩文件体积。
2023-07-20 18:49:27
69
原创 2.5、Redis 实现请求限流(高级特性)
先有一个桶,桶的容量是固定的。以任意速率向桶流入水滴,如果桶满了则溢出(被丢弃)。桶底下有个洞,按照固定的速率从桶中流出水滴。
2023-07-19 20:30:55
99
原创 2.4、Redis Lua脚本(高级特性)
Lua语言是在1993年由巴西一个大学研究小组发明,其设计目标是作为嵌入式程序移植到其他应用程序,它是由C语言实现的,虽然简单小巧但是功能强大,所以许多应用都选用它作为脚本语言,尤其是在游戏领域,暴雪公司的“魔兽世界”,“愤怒的小鸟”,Nginx将Lua语言作为扩展。Lua支持模块与包,也就是封装库,支持元表(Metatable),支持协程(coroutine),支持文件IO操作,支持错误处理,支持代码调试,支持Lua垃圾回收,支持面向对象和数据库访问,更多详情请参考对应书籍。一般这种形式用得非常少。
2023-07-19 20:29:09
81
原创 2.3、Redis 事务(高级特性)
事务是Redis实现在服务器端的行为,用户执行MULTI命令时,服务器会将对应这个用户的客户端对象设置为一个特殊的状态,在这个状态下后续用户执行的查询命令不会被真的执行,而是被服务器缓存起来,直到用户执行EXEC命令为止,服务器会将这个用户对应的客户端对象中缓存的命令按照提交的顺序依次执行。另外discard命令是回滚。例如在社交网站上用户A关注了用户B,那么需要在用户A的关注表中加入用户B,并且在用户B的粉丝表中添加用户A,这两个行为要么全部执行,要么全部不执行,否则会出现数据不一致的情况。
2023-07-19 20:27:20
33
原创 2.2、Redis Pipeline(高级特性)
Pipeline虽然好用,但是每次Pipeline组装的命令个数不能没有节制,否则一次组装Pipeline数据量过大,一方面会增加客户端的等待时间,另一方面会造成一定的网络阻塞,可以将一次包含大量命令的Pipeline拆分成多次较小的Pipeline来完成,比如可以将Pipeline的总发送大小控制在内核输入输出缓冲区大小之内或者控制在单个TCP 报文最大值1460字节之内。但大部分命令是不支持批量操作的,例如要执行n次 hgetall命令,并没有mhgetall命令存在,需要消耗n次RTT。
2023-07-19 20:25:25
56
原创 2.1、Redis的慢查询(高级特性)
参数:slowlog-log-slower-than就是时间预设阀值,它的单位是微秒(1秒=1000毫秒=1 000 000微秒),默认值是10 000,假如执行了一条“很慢”的命令(例如keys *),如果它的执行时间超过了10 000微秒,也就是10毫秒,那么它将被记录在慢查询日志中。由于慢查询日志是一个先进先出的队列,也就是说如果慢查询比较多的情况下,可能会丢失部分慢查询命令,为了防止这种情况发生,可以定期执行slow get命令将慢查询日志持久化到其他存储中。慢查询记录存放在哪?
2023-07-19 20:23:24
217
原创 markdown图片上传工具(含Typora自定义命令图片上传功能)
启动不需要java环境,文件夹中有瘦身过后的jre2.1. 找到conf目录下的app.properties中配置文件设置默认上传服务 upload.type=设置上传后返回的URL file.image_bed_url=ftp/csdn/gitee配置2.2. typora图像设置2.3. 点击[验证图片上传选项]按钮,验证成功后即可使用。
2023-07-11 03:22:52
640
原创 2.8、Redis的Key和Value的数据结构组织(高级特性)
当然如果这个数组一直不变,那么hash冲突会变很多,这个时候检索效率会大打折扣,所以Redis就需要把数组进行扩容(一般是扩大到原来的两倍),但是问题来了,扩容后每个hash桶的数据会分散到不同的位置,这里设计到元素的移动,必定会阻塞IO,所以这个ReHash过程会导致很多请求阻塞。哈希表的最大好处很明显,就是让我们可以用 O(1) 的时间复杂度来快速查找到键值对:我们只需要计算键的哈希值,就可以知道它所对应的哈希桶位置,然后就可以访问相应的 entry 元素。此时,Redis 就无法快速访问数据了。
2023-07-11 01:59:50
85
原创 2.7、Redis Stream(高级特性)
足够简单,消费消息延迟几乎为零,但是需要处理空闲连接的问题。如果线程一直阻塞在那里,Redis客户端的连接就成了闲置连接,闲置过久,服务器一般会主动断开连接,减少闲置资源占用,这个时候blpop和brpop或抛出异常,所以在编写客户端消费者的时候要小心,如果捕获到异常,还有重试。其他缺点包括:做消费者确认ACK麻烦,不能保证消费者消费消息后是否成功处理的问题(宕机或处理异常等),通常需要维护一个Pending列表,保证消息处理确认;不能做广播模式,如pub/sub,消息发布/订阅模型;
2023-07-11 01:57:57
1315
原创 2.6、Redis发布和订阅(高级特性)
Redis提供了基于“发布/订阅”模式的消息机制,此种模式下,消息发布者和订阅者不进行直接通信,发布者客户端向指定的频道( channel)发布消息,订阅该频道的每个客户端都可以收到该消息。Pubsub 命令用于查看订阅与发布系统状态,包括活跃的频道(是指当前频道至少有一个订阅者),其中[pattern]是可以指定具体的模式,类似于通配符。订阅者可以订阅一个或多个频道,如果此时另一个客户端发布一条消息,当前订阅者客户端会收到消息。如果有多个客户端同时订阅了同一个频道,都会收到消息。
2023-07-11 01:54:19
56
原创 1.5、Redis高级数据结构(入门)
1970 年布隆提出了一种布隆过滤器的算法,用来判断一个元素是否在一个集合中。这种算法由一个二进制数组和一个 Hash 算法组成。本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。
2023-07-11 01:21:41
122
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人