- 博客(22)
- 收藏
- 关注
原创 Java 8新特性---Lambda表达式
在这个例子中,我们定义了一个简单的函数式接口,它有一个方法sayMessage。然后我们创建了一个类型的Lambda表达式,并调用了它的sayMessage方法。Lambda表达式可以简化代码,并提高代码的可读性和可维护性,特别是在处理集合和流时,它们提供了一种更加简洁和直观的方式来处理数据。同时,Lambda表达式也是Java实现函数式编程风格的一个重要组成部分。
2024-03-07 15:00:00
371
原创 Java 8新增---CompletableFuture
它是对Future接口的扩展和增强,提供了非常强大的Future扩展功能,有助于简化异步编程的复杂性。CompletableFuture实现了Future接口,并在此基础上进行了丰富的扩展,从而完美地弥补了Future的局限性。CompletableFuture的一个核心能力是实现了对任务的编排。借助这项能力,用户可以轻松地组织不同任务的运行顺序、规则以及方式。这在以往虽然可以通过如CountDownLatch等工具类实现,但通常需要复杂的逻辑处理,不仅耗费精力且难以维护。
2024-03-07 11:41:47
914
原创 canal如何解决缓存一致性问题的
缓存一致性(Cache Coherence)是一个在计算机科学和分布式系统中广泛使用的概念,指的是在多个缓存副本之间保持数据一致性的能力。当多个系统或组件(如数据库和缓存)存储相同的数据时,这些系统或组件之间的数据需要保持一致,否则可能会出现不一致的状态,导致数据错误或业务逻辑错误。
2024-02-27 17:01:18
1330
原创 读写锁(Read-Write Lock)
然而,当需要写入共享资源时,必须等待所有持有共享锁的线程释放锁,然后只有一个线程可以获得排他锁进行写入操作。需要注意的是,读写锁可能会导致饥饿问题,即等待排他锁的线程可能永远无法获得锁,因为总是有线程不断获得共享锁进行读取操作。为了解决这个问题,一些实现会在一定时间内未获得锁的情况下采取降级措施,如尝试获取共享锁等。读写锁通常包含两种锁:共享锁(Shared Lock)和排他锁(Exclusive Lock)。在使用读写锁时,需要根据具体的业务场景和需求选择合适的锁类型和同步策略。
2024-02-26 16:57:20
476
原创 shell脚本,启动jar包
这个bash脚本的主要目的是管理一个Java应用程序的jar包。,它包含了要处理的jar包的名称。如果找到进程,则通过。提取进程ID(pid)。
2024-02-21 16:35:37
914
原创 gRPC 的长连接原理
HTTP/2 协议支持多路复用,即在一个 TCP 连接上可以同时处理多个请求和响应,而不需要为每个请求建立新的连接。当 TCP 连接开启 keepalive 机制后,系统会为每一个连接设置一个定时器,不断地发送纯 ACK 包,用来探测目标主机是否存活。在 gRPC 中,客户端和服务器之间的连接在完成一次数据交换后不会立即关闭,而是复用该连接继续进行下一次请求。需要注意的是,虽然长连接可以提高通信效率,但如果连接数过多或服务器资源有限,可能会导致资源过度消耗和服务器压力增大。
2024-02-12 21:36:38
876
原创 Redis的IO多路复用机制
在Redis中,IO多路复用是一种技术,允许单个线程处理多个网络连接。它利用了select、poll、epoll等机制,能够同时监视多个描述符(fd),一旦某个描述符就绪(读/写/异常),就能通知程序进行相应的读写操作。这种技术可以避免大量的无用操作,因为在空闲的时候,会将当前线程阻塞掉。当有一个或多个流有I/O事件时,就从阻塞态中唤醒,程序会轮询一遍所有的流(epoll是只轮询那些真正发出了事件的流),依次顺序的处理就绪的流。
2024-01-17 16:41:38
967
原创 MyBatis 中一级缓存与二级缓存的区别
简而言之,一级缓存是 SqlSession 内部的缓存,用于减少对数据库的访问;二级缓存是跨 SqlSession 的缓存,用于数据共享和分布式系统。MyBatis 提供了两级缓存机制:一级缓存和二级缓存。这两级缓存的主要区别在于它们的范围和用途。
2024-01-16 17:39:41
584
1
原创 使用vagrant快速创建linux,docker安装redis、mysql
vagrant upload source [destination] [namelid]: 上传文件https://www.vagrantup.com/docs/cli/init.html Vagrant命令行。Vagrant 下载:https://www.vagrantup.com/downloads.html。官方镜像仓库:https://app.vagrantup.com/boxes/search。vagrant ssh:自动使用 vagrant 用户连接虚拟机。2.下载&安装 Vagrant。
2024-01-05 11:54:37
495
1
原创 漏桶限流算法是什么?
1.当请求速度大于漏桶的流出速度时,也就是请求量大于当前服务所能处理的最大极限值时,触发限流策略.2.请求速度小于或等于漏桶的流出速度时,也就是服务的处理能力大于或等于请求量时,正常执行。漏桶算法的原理就像它的名字一样,我们维持一个漏斗,它有恒定的流出速度,不管水流流入的速度有多快,漏斗出水的速度始终保持不变,类似于消息中间件,不管消息的生产者请求量有多大,消息的处理能力取决于消费者。在这个容量范围内的请求可以排队等待系统的处理,超过这个容量的请求,才会被抛弃。在漏桶限流算法中,存在下面几种情况。
2023-12-15 10:45:00
48
原创 BASE理论是什么?
比如在电商平台中,当用户对一个订单发起文付时,往往会调用第三方支付平台,比如支付宝文付或者微信支付,调用第三方成功后,第三方并不能及时通知我方系统,在第三方没有通知我方系统的这段时间内,我们给用户的订单状态显示支付中,等到第三方回调之后,我们再将状态改成已支付。最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态,因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性.
2023-12-14 19:30:00
51
1
原创 设计微服务时遵循什么原则?
对每个服务的粒度把控,其实没有统一的标准,这个得结合我们解决的具体业务问题。服务的粒度随着业务和用户的发展而发展总结一句话,软件是为业务服务的,好的系统不是设计出来的,而是进化出来的。让每个服务之间的调用是轻量级,并且能够跨平台、跨语言。比如采用RESTful风格,利用消息队列进行通信等。每个服务要能做到独立开发、独立测试、独立构建、独立部署,独立运行。让每个服务能独立,有界限的工作,每个服务只关注自己的业务。
2023-12-14 18:45:00
40
1
原创 CAP定理
一致性(Consistency) ,数据在多个副本节点中保持一致,可以理解成两个用户访问两个系统A和B,当A系统数据有变化时,及时同步给B系统,让两个用户看到的数据是一致的。可用性(Availability),系统对外提供服务必须一直处于可用状态,在任何故障下,客户端都能在合理时间内获得服务端非错误的响应。分区容错性 (Partition tolerance) ,在分布式系统中遇到任何网络分区故障,系统仍然能对外提供服务。
2023-12-14 18:45:00
26
1
原创 令牌桶限流算法是什么?
令牌桶算法,是增加一个大小固定的容器,也就是令牌桶,系统以恒定的速率向令牌桶中放入令牌,如果有客户端来请求,先需要从令牌桶中拿一个令牌,拿到令牌,才有资格访问系统,这时令牌桶中少一个令牌。当令牌桶满的时候,再向令牌桶生成令牌时,令牌会被抛弃。那么此时系统的访问量远远低于系统的并发能力,请求可以被正营处理令牌桶算法,由于有一个桶的存在,可以处理短时间大流量的场景。这是令牌桶和漏桶的一个区别,那么令牌桶中的令牌会被取完,后续再进来的请求,由于拿不到令牌,会被限流。在令牌桶算法中,存在以下几种情况。
2023-12-14 14:00:00
47
1
原创 滑动时间窗口算法是什么?
在上图中,假设我们设置一分钟的请求闽值是100,我们将一分钟拆分成4个小时间窗口,这样,每个小的时间窗口只能处理25个请求,我们用虚线方框表示滑动时间窗口,当前窗口的大小是2,也就是在窗口内最多能处理50个请求。随着时间的推移,滑动窗口也随着时间往前移动,比如上图开始时,窗口是0:00到0:30的这个范围过了15秒后,窗口是0:15到0:45的这个范围,窗口中的请求重新清零,这样就很好的解决了计数器算法的临界值问题。最终只需要统计滑动窗口范围内的小时间窗口的总的请求数即可。
2023-12-14 09:33:10
430
1
原创 计数器算法是什么?
这个算法有一个临界问题,比如在上图中,在0:00到1:00内,只在0:50有60个请求,而在1:00到2:00之间只在1:10有60个请求,虽然在两个一分钟的时间内,都没有超过100个请求,但是在0:50到1:10这20秒内,确有120个请求,虽然在每个周期内,都没超过域值,但是在这20秒内,已经远远超过了我们原来设置的1分钟内100个请求的闻值。计数器算法,是指在指定的时间周期内累加访问次数,达到设定的闯值时,触发限流策略。下一个时间周期进行访问时,访问次数清零。
2023-12-14 00:22:53
76
1
原创 MySQL如何做分布式锁?
DB分布式锁的实现:通过主键id 或者 唯一索性 的唯一性进行加锁,说白了就是加锁的形式是向一张表中插入一条数据,该条数据的id就是一把分布式锁,例如当一次请求插入了一条id为1的数据,其他想要进行插入数据的并发请求必须等第一次请求执行完成后删除这条id为1的数据才能继续插入,实现了分布式锁的功能.
2023-12-13 23:50:21
42
原创 ZooKeeper和Reids做分布式锁的区别?
1.使用ZooKeeper集群,锁原理是使用ZooKeeper的临时顺序节点,临时顺序节点的生命周期在Client与集群的Session结束时结束。1.Redis只保证最终一致性,副本间的数据复制是异步进行(Set是写,Get是读,Reids集群一般是读写分离架构,存在主从同步延迟情况),主从切换之后可能有部分数据没有复制过去可能会[丢失锁] 情况,故强致性要求的业务不推荐使用Reids,推荐使用zk。2.Redis集群各方法的响应时间均为最低。2.ZK具有较好的稳定性,响应时间抖动很小,没有出现异常。
2023-12-13 23:36:29
29
原创 基于 ZooKeeper 的分布式锁实现原理是什么?
使用 ZooKeeper 的顺序节点特性,假如我们在/ock/目录下创建3个节点,ZK集群会按照发起创建的顺序来创建节点,节点分别为/ock/0000000001、/lock/0000000002、/lock/0000000003,最后一位数是依次递增的,节点名由zk来完成。3.客户端获取到所有子节点pah之后,如果发现自己在步骤1中创建的节点是所有节点中席号最小的,就是看自己创建的序列号是否排第一,如果是第一,那么就认为这个客户端获得了锁,在它前面没有别的客户端拿到锁。
2023-12-13 22:10:53
44
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人