- 博客(55)
- 资源 (2)
- 收藏
- 关注
原创 Redis之集群模式
Redis集群通过分片的方式来保存数据库中的键值对:集群的整个数据库被分为16384个槽(slot),数据库中的每个键都属于这16384个槽的其中一个,集群中的每个节点可以处理0个或最多16384个槽。❑相反地,如果源节点没能在自己的数据库里面找到指定的键,那么这个键有可能已经被迁移到了目标节点,源节点将向客户端返回一个ASK错误,指引客户端转向正在导入槽的目标节点,并再次发送之前想要执行的命令。❑源节点会先在自己的数据库里面查找指定的键,如果找到的话,就直接执行客户端发送的命令。
2023-08-28 10:50:11 599
原创 Redis之Sentinel(哨兵)机制
Sentinel(哨岗、哨兵)是Redis的高可用性(high availability)解决方案:由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。(3)从服务器启动时,配置文件可配置优先级,按配置的优先级进行排序,找优先级最大。按照以下规则过滤筛选。
2023-08-28 09:32:22 855
原创 Redis之发布订阅
通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道,从而成为这些频道的订阅者(subscriber):每当有其他客户端向被订阅的频道发送消息(message)时,频道的所有订阅者都会收到这条消息。第一个字典key保存着频道,value是一个链表,保存订阅该频道的客户端信息;链表则保存着订阅频道模式的客户端信息。消息发送时,只需要遍历字典和链表,将消息发送给订阅相关频道的客户端即可。消息订阅有两种模式,一种是频道订阅,另一种是模式订阅。
2023-08-28 08:55:44 881
原创 Redis之SYNC与PSYNC命令
(2)当从服务器与主服务器断开连接一段时间后恢复,从服务器需要部分同步从断开连接到重新连接期间主服务器写入的数据,这时候从服务器会向主服务器发送PSYNC命令。(1)当新的服务器执行slave of 命令,成为主服务器的从服务器。当从服务器断线重连,会比较自身的复制偏移量和主服务器的复制偏移量,并从复制积压缓冲区取出gap数据,同步给从服务器。主服务器将BGSAVE命令生成RDB文件发送给从服务器,从服务器接收并载入这个RDB文件。主服务器的复制偏移量和从服务器的复制偏移量。主服务器的复制积压缓冲区。
2023-08-21 09:48:43 1212
原创 Redis事务
事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而改去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处理其他客户端的命令请求。WATCH命令是一个乐观锁,它可以在EXEC命令执行之前,监视任意数量的数据库键,并在EXEC命令执行时,检查被监视的键是否至少有一个已经被修改过了,如果是的话,服务器将拒绝执行事务,并向客户端返回代表事务执行失败的空回复。事务是多条命令希望保持原子性,lua脚本常用来执行事务性操作。
2023-08-21 08:52:09 86
原创 谈一谈redis脑裂
(1)一主多从架构中,主节点与客户端通信正常,主节点与哨兵、从节点连接异常,客户端仍正常写入数据(2)哨兵判定主节点下线,重新选主(3)原主节点与哨兵和其他节点通信恢复,成为新主节点的从节点,drop本身所有的数据,从新主节点全量copy数据(4)原主节点通信异常至新主节点出现期间客户端写入的数据丢失这就是脑裂。
2023-08-19 10:22:15 380
原创 Redis持久化
(1)AOF文件的载入:redis读取AOF文件并还原数据库状态时,会创建一个不带网络连接的伪客户端,因为Redis的命令只能在客户端上下文中执行,而载入AOF文件时所使用的命令直接来源于AOF文件而不是网络连接,所以服务器使用了一个没有网络连接的伪客户端来执行AOF文件保存的写命令,伪客户端执行命令的效果和带网络连接的客户端执行命令的效果完全一样。(1)SAVE:SAVE命令会阻塞redis服务器进程,知道RDB文件创建完成为止,在服务器进程阻塞期间,redis不能处理任何命令请求。
2023-08-18 15:51:02 127
原创 redisDb底层结构
使用惰性删除时,如果数据库中有非常多的过期键,而这些过期键又恰好没有被访问到的话,那么它们永远不会删除,无用的垃圾数据占用了大量的内存,而服务器不会去自己释放他们。redisDb主要包含了dict 和 expires两个字典,dict字典用于存储键值对,expires字典用于存储设置了过期时间的key和其过期时间。(1)定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时来临时,立即执行键的删除操作。(2)惰性删除:放任键过期不管,每次获取键时,都检查下键是否过期,如果过期,删除该键。
2023-08-17 09:35:52 218
原创 redis数据结构
五大数据类型底层采用的数据结构汇总:(1)string字符串:采用SDS存储(2)hash哈希: 当hash键值对数量很少且键值size都较小时,就会采用压缩列表存储;当hash类型无法满足ziplist条件时,采用字典存储(3)list列表:当一个列表的元素个数很少且元素size也较小时,就会采用压缩列表存储;当列表不满足ziplist条件时,就采用链表存储(4)set集合:当集合中的元素都是整数且元素个数小于512时,就采用整数集合存储;当不满足整数集合条件时,采用字典作为底层实现。
2023-08-16 09:17:22 77
原创 关于InheritableThreadLocal和TransmittableThreadLocal
最近经常遇到在调试和处理预发报警时的串租户问题,最终都归因到InheritableThreadLocal和TransmittableThreadLocal的使用上,做一次总结在Thread类中有一个私有变量inheritableThreadLocals,在线程创建时会去执行init方法,init方法里有一个将父线程中变量传递到子线程的过程,然而,InheritableThreadLocal只有在线程创建初始化的时候才会有父子线程传递的过程,但是在线程池中,业务线程(父线程)只是将任务对象(实现了Runnab
2022-07-07 18:11:23 426
原创 线程上下文的那些事儿
一、背景在实际代码开发中,有些时候,单个线程执行任务非常多的时候,后一个步输入是前一个步骤的输出,若是一直带着一个参数传递,就会显得很冗余,于是就有了线程上下文的设计,每个线程会有不同的参数实例。二、实现ThreadLocal作为一个线程私有化的类,内部有一个私有变量ThreadLocalMap,其已每个线程Thread.currentThread()作为key,这样就可以保证线程的独立性。因此我们可以利用ThreadLocal进行线程上下文的构建。新建一个上下文的类:import java.io
2022-04-19 15:19:41 260
原创 spring通过applicationContext获取bean
一、背景在我们实际开发中,通常通过@Autowired和@Resource来进行bean的获取,其中Autowired默认ByType,Resource默认ByName获取,但是我们如果需要动态的获取bean时,就需要直接借助ApplicationContext的getBean方法进行获取二、实现在实现中,自定义一个类实现ApplicationContextAware接口@Servicepublic class ContextUtil implements ApplicationContextAw
2022-04-19 15:03:38 5739 1
原创 spring ApplicationEventPublisher实现发布-订阅模式
一、背景在实际的项目开发过程中,经常碰到一块业务需要监听另一块的业务执行的结果进行变动,这时候,设计一个较为可扩展、可用性强的发布订阅模式代码架构就显得尤为重要二、代码架构代码架构:三、基础事件定义接口:public interface BaseEvent { Integer getEventId(); String getEventName(); String getEventType();}示例事件:@Datapublic class AddEvent i
2022-01-19 16:56:37 774
原创 分发策略+工厂设计模式的简易实现
一、背景我们在实际的业务开发中,经常会遇到这样的场景,对于不同的type,有同样的业务操作流程,只不过其中的某些操作需要根据type的不同特殊处理,这时候如果我们直接if,else判断来实现业务的话,势必会带来代码冗余重复的问题。说的太抽象,还是直接上代码吧二、简易工厂设计模式的实现业务背景:实现一个计算系统,计算类型有加、减、乘、除,计算前先做校验,计算完后打印日志。(1)新建Springboot项目项目目录(2)枚举类:四种运算,加减乘除@Getter@AllArgsConstruct
2021-05-27 15:44:44 533 1
原创 spring整合es,logstash,mysql实践
一、ElasticSearch简介Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并是一种流行的企业级搜索引擎。...
2021-05-26 20:22:51 519 1
原创 持续学习之:Springboot整合redis
一、redis简介redis是一个非关系型数据库,它能够存储字符串和五种不同类型之间的值的映射,key值只能字符串,value可以是五种不同数据类型:字符串、列表、集合、哈希、有序集合。redis相对于其他数据库,是基于内存的操作,因此其存取速度极快,被广泛应用于缓存方向。除了缓存之外,redis还常被用于分布式架构中锁的实现,用于保证多机多线程中共享资源的线程安全问题。这篇文章主要对redis在缓存中的具体应用做详细介绍,做一个springboot整合redis的简单实践。二、redis下载安装实验
2021-05-07 13:02:00 373 2
原创 rocketMq的高可用和高可靠机制
一、什么是高可用和高可靠高可用:描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性高可靠:运行时间能够满足预计时间的一个系统或组件二、rocketMq的高可用性rocketMq的分布式集群是通过主从的配合来达到高可用性的,在broker的配置文件中:brokerId为0表示这个broker是master,大于0表示这个broker是slave,同时brokerRole参数也会说明这个broker是master还是slave,master角色的broker支持读和写,而s
2021-05-04 12:32:39 868
原创 rocketMq集群模式和广播模式的区别
最近在学习rocketMq的时候,给两个不同的consumer设置了同一个groupName,这两个consumer所订阅的topic和tag也完全相同,但是producer放进mq中的消息却没有被两个consumer都消费到@Servicepublic class Consumer { @Value("${rocketmq.producer.group}") private String groupName; @Value("${rocketmq.name-server}")
2021-04-29 17:59:16 6209
原创 springboot整合rocketMq
一、消息队列前面一篇博文提到消息队列的三大作用:(1)解耦(2)异步(3)削峰限流当下主流的消息队列主要有Kafka、ActiveMQ、RabbitMQ、RocketMQrocketMq以其高吞吐量,支持分布式,可支撑大量的topic而成为一些公司的首选(实习的公司用的rocketMq),下面就做一个Springboot整合rocketMq的实践吧二、下载安装、启动rocketMq下载地址:下载地址安装:unzip rocketmq-all-4.8.0-bin-release.zip
2021-04-26 22:30:05 1696 2
原创 反射在Java中的应用
在我们平时的项目开发中,虽然很少用到反射机制,但实际上很多设计、开发都与反射机制有关,例如利用反射实现工厂设计模式,利用反射实现动态代理,利用反射获取注解信息等等,下面就基于这三种应用进行相关的描述一、利用反射实现工厂设计模式interface IMessage { public void send();}class NetMessage implements IMessage { @Override public void send() { System.
2020-12-13 16:01:08 368
原创 谈谈红黑树
一、什么是红黑树红黑树是一种平衡而叉树,是为了达到logn的查询性能而采取的一种数据结构试想若是用数组 [1,2,3,4,5,6,7,8]来构建一棵二叉树(一般以数组的第一个元素为根节点),那么构建的二叉树如下所示:那这样一棵二叉树就和普通的链表结构没什么分别,查询性能为n红黑树就是在这样的背景下提出的一种用于平衡二叉树的一种手段。二、红黑树的特点(1)节点要么是红色,要么是黑色(2)根节点必须是黑色(3)每个叶子节点必须是黑色(4)如果一个节点是红色的,则它的子节点必须是黑色的(5)
2020-12-12 21:41:30 228
原创 反射与工厂设计模式
一、什么是反射Java是先编译再运行的语言,而反射可以让我们在程序运行时动态加载类并获取类的详细信息,本质是JVM得到java.lang.Class对象之后,再对class对象进行反编译,从而获取对象的各种信息二、获取Class对象的三种方式(1)Object里的getClass方法获取(2)每个数据类型(包括基本的数据类型)都有一个静态的class属性(3)通过class类的静态方法forName三、根据class对象反射实例化对象利用class.getDeclaredConstruc
2020-12-12 16:36:15 502 2
原创 springboot实现token登录
一、Controller层login接口进行账密验证,验证成功返回tokencontroller:@PostMapping("/login") public Result<TokenStatus> login(@RequestBody LoginVO loginVO, HttpServletRequest request) { Result<TokenStatus> result = new Result<>(); UserDO
2020-12-03 12:20:35 7902 1
原创 浅谈消息队列
一、什么是消息队列当程序系统发现某些任务耗费时间且优先级较低,迟点完成也不影响整个任务,就把这个任务丢给消息队列二、消息队列的作用(1)解耦举个例子,系统A能够生产一个消息,而系统B、C、D都要用到这个消息,倘若不用消息队列,直接在系统A中定义系统B、C、D对这个消息的使用,那么势必会带来系统A和系统B、C、D代码的耦合问题,如果哪天系统B或者C或者D突然又不用这个消息了,又要在系统A中进行修改。而引入消息队列,系统A只负责产生消息丢个消息队列,其他系统对这个消息的使用则不需要关心,这样则实现了系统
2020-10-28 14:37:43 236
原创 来谈一谈Java中的正则表达式
正则表达式是一种强大而灵活的文本处理工具,使用正则表达式,我们能够以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索。一旦找到了匹配这些模式的部分,你就能够随心所欲的对它们进行处理(来自Java编程思想第四版的描述)。各种语言对正则表达式的支持都有着异曲同工之妙,但提供的API却不尽相同。一、String类中的利用正则表达式的三个方法(1)matches方法public boolean matches(String regex)该方法只有一个参数,即正则字符串,返回boolean类型,tr
2020-10-09 16:20:30 231
原创 Java中使用+号连接字符串和使用StringBuilder的append方法连接字符串的联系和区别
一、使用+连接字符串的底层原理我们先来看看这样一段代码public class Main { public static void main(String[] args) { String mango = "mango"; String s = "abc" + mango + "def" + 47; System.out.println(s); }}我们用jdk自带的工具javap来反编译以上代码:javap -c Main这里
2020-10-09 11:24:42 647
原创 学习下XML的约束模块DTD
一、什么是DTDDTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。DTD的实例:<!DOCTYPE NEWSPAPER [<!ELEMENT NEWSPAPER (ARTICLE+)><!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)><!ELEMENT HEADLINE (#PCDATA)><!ELEMENT B
2020-10-07 17:44:04 285 1
原创 来谈谈xml
一、什么是XMLXML是指可扩展性标记语言(eXtensible Markup Language)标记型:用标签来定义的语言,例如HTML,XML等可扩展:标签可以由自己来定义,也可以用中文标签,如:<person></person> <猫></猫>xml有两个版本:1.0和1.1,但我们一般用的都是1.0,因为1.1不能向下兼容二、XML的用途用于不同系统之间传输数据用于表示生活中有关系的数据经常用在配置文件中比如可以
2020-10-07 11:57:14 211
原创 Java异常
一、异常概念在程序中,错误可能产生于程序员没有预料到的各种情况,或者超出程序员可控范围的环境,例如用户的坏数据、试图打开一个不存在的文件等。为了能够及时有效地处理程序中的运行错误,Java 专门引入了异常类。二、异常继承图运行异常:也就是非检查异常,编译器不进行检查,只有运行时出现错误才抛出异常非运行时异常:检查异常,就是在程序编译阶段jvm就会检查程序是否对该异常进行了处理,如果未处理,则编译不能通过。编译时异常通常定义的是发生几率较高并具有预见性的异常,程序员进行事先处理。...
2020-10-06 10:56:17 142
原创 JavaWeb之监听器
一、JavaWeb中的监听器事件源:(三大域)ServletContext(1)生死监听:ServletContextListener,它有两个方法,一个在出生时调用,一个在死亡时调用(2)属性监听:ServletContextAttributeListener,它有三个方法,一个在添加属性时调用,一个在改变属性时调用,一个在移除属性时调用HttpSession(1)生死监听: HttpSessionListener,它有两个方法,一个在出生时调用,一个在死亡时调用(2)属性监听:
2020-10-05 16:50:28 412
原创 过滤器的三种常见的应用场景
一、执行目标资源之前做预处理操作,例如设置编码,这种Filter一般都会放行,只是再目标资源之前做一些准备工作当我们想要设置响应报文的编码方式时,就可以实现一个Filter来对所有的请求进行设置,如下public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
2020-10-05 10:35:14 1389
原创 过滤器概念和实现
一、什么是过滤器它会在一组资源(jsp,servlet,css,html)前面出现,它可以让请求得到目标资源,也可以让请求得不到目标资源。也就是说过滤器有拦截请求的能力。二、javax.servlet包中的Filter接口我们来看看这个接口中的方法:三个方法,也就是过滤器的三个生命周期函数,init方法在服务器启动时执行,doFilter在拦截请求时执行,destroy方法在服务器关闭时执行FilterConfig:FilterConfig与ServletConfig类似,用于获取过滤器的名
2020-10-05 10:16:04 1235
原创 Servlet,GenericServlet和HttpServlet关系详解
一、关系图二、源码解析Servlet,GenericServlet,HttpServlet是实现servlet的三个方法,其中Servlet是一个接口,它有五个方法,各种方法的作用在另一篇博客Servlet介绍与使用中已有介绍其中ServletConfig接口用于获取servlet的配置信息,包括servlet的名字,servlet的初始化参数名和参数值等等,而该接口的实现由servlet容器tomcat自行实现,我们无需关心,下图是ServletConfig的接口源码:我们再较之于Gener
2020-09-30 15:53:37 1331
原创 Servlet介绍与实现
一、什么是servlet?servlet是JavaWeb三大组件之一,servlet的作用是处理请求,服务器会把接收到的请求交给servlet处理,在servlet中通常需要:接收请求数据处理请求完成响应每个请求都对应着每一个不同的servlet,通常我们会去继承HttpServlet来实现Servlet二、接口Servlet中的五大方法其中init(),service(),destroy()三个方法是生命周期方法,这三个方法一般由servlet容器tomcat调用,init方法会在se
2020-09-30 11:31:22 651
原创 git常用命令汇总
一、拉取本分支代码git pull二、切换分支git checkout 分支名三、新建分支并切换到新建的分支git checkout -b 分支名四、把代码的更改提交到暂存区git add . // .表示全部更改五、将暂存区里的更改提交到本地版本库git commit -m '提交信息'...
2020-09-11 10:27:28 323
原创 js手写双向数据绑定
js手写双向数据绑定利用Object.defineProperty进行数据的双向绑定。HTML代码:<body> <span id="span"></span></body>js代码var obj = { val:'张三', }; var val = ''; Object.defineProperty(obj,'val',{ get:function(){ r
2020-07-09 19:17:50 487
原创 js实现单例设计模式
js实现单例设计模式 // js手写单例设计模式 var Singleton = (function(){ var instance = null; function Singleton(name){ this.name = name; } return function(name){ if(!instance){ instance = new Si
2020-07-09 11:29:25 311
原创 js实现桶排序
实现桶排序的js代码 function bucketSort(arr,bucketCount){ result = [] minValue = arr[0] maxValue = arr[0] // 找出最大值和最小值,为给每个桶分配大小做准备 for(let i=0;i<arr.length;i++){ if(arr[i]<minValue){ min
2020-06-28 16:19:12 1197 1
基于ege图形库和vs2013的推箱子小游戏,外带qq登录界面
2019-08-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人