分布式、锁、延时任务

1. redission

redission 原理

Redis分布式锁-这一篇全了解(Redission实现分布式锁完美方案)
3

2.zk

2.1 指令

ls / / 下有哪些子节点
get /zookeeper 查看某个子节点内容
create /aa “test”
delete /aa
set /aa “test01”

2.2 创建节点

模式 默认创建永久
create -e 创建临时
create -e /zz “hello zz”
create -s 创建 有序节点
3
create -s -e 临时序列化节点
3

2.3 节点事件监听

一次性的监听

  1. 节点创建 事件监听 NodeCreated
    stat -w /xx

  2. 节点 删除 监听 NodeDeleted
    stat -w

  3. 节点数据 变化 监听 NodeDataChanged
    get -w /bb
    set /bb “cc” //修改节点数据

  4. 子节点 监听 NodeChildrenChanged
    ls -w /bb

create /bb/cc “test”

2.4 zk 分布式锁

  1. 独占、排它, 其他线程获取不到
  2. 阻塞 解决自旋的消耗 临时 有序节点 + 事件 监听(监听 比他小1的节点),

让最小的节点 获取到锁, 44节点监听43节点,43 节点删除后,唤醒后续44节点 获得锁。公平锁
3. 锁的可重入性
思路1: 在节点的内容中记录 服务器、线程、已经重入信息
思路2 :Threadloacal: 线程的局部变量,线程私有

阻塞操作 获取不到监听 并阻塞

3
创建 临时 有序节点 返回节点路径
// 获取前置节点 ,如果前置节点为空,那么获得锁成功,否则监听 前置节点

countdownLatch(1)
在监听事件的内部 进行一个countDown();
3

可重入锁

threadloacal
在 trylock()
3
unlock 里面 判断:
3

2.5 锁

zk 的节点 存储机制+通知机制
zk 有4中节点类型,持久节点持久顺序节点临时节点临时顺序节点
持久和临时 判断标准依赖于客户端 的生命周期
3
顺序: 节点对应的id

  • 持久节点
    • 持久顺序节点
    • 持久的非顺序节点
  • 临时节点
    • 临时的非顺序节点( 实现分布式锁的条件)
    • 临时的顺序节点
      3

利用zk 支持的临时顺序节点 +通知机制 可以实现分布式锁

  • 加锁:判断是否持有了分布式锁,判断客户端 创建的节点是否是 有序节点中 序号最小的一个
  • 释放锁: 将自己的创建的节点 删除即可。

3. redission zk 分布式锁对比

4. 延时任务

4.0 场景

3

4.1 定时任务数据库轮询

  1. 定时任务轮询数据库,
    采用定时任务失效延迟、对业务表进行轮询判断,到点执行。有一点点误差
    1) 使用单机版本的spring schedule +分布式锁的实现。
    同一个服务,多个节点 同时执行 可能都会执行,需要加分布式锁
    3
  1. 分布式调度框架 xxl-job
    如果处理数据量较大,可以利用分布式调度系统的分片功能并行处理,大大提升数据的处理能力,加快处理速度。

优点
单机版 基于spring,实现简单。不用引入各种中间件,各个模块可以自行定义延迟规则。
缺点
2. 完全由业务代码进行控制,重复代码多,不论是否有待执行的数据,都要空轮询cpu 且频繁的访问数据库 io 消耗
3. 由于是定时轮询,存在一点误差。

基于@schedule

3

取消订单操作
3
3

基于xxl-job 的

3

4.2 Java 的DelayQueue

Java DelayQueue的使用及应用场景

DelayQueue 的实现原理。
1) DelayQueue 是JDK提供的一个无界 BlockQueue ,用于放置实现了Delayed 接口的对象。其中的对象只能在其到期时,才能从队列中拿走。
这种队列 是 有序的,即 队头对象的延迟到期时间最长。
注意不能将null 元素放置 到这种队列中。

2)实现注意事项
队列 里面的元素 需要实现Delayed 这个接口。getDelay 方法用于设置 延迟时间。 compareTo 方法用于对队列的元素 进行排序。

public class DelayQueue<E extends Delayed> extends AbstractQueue<E>implements BlockingQueue<E> 
// 入队
put(){
offer();} 线程安全  reentrantlock 加锁 
offer(); 线程安全
// 出队 
poll(); 非阻塞方法,没有到期元素 直接返回 null
take(); 阻塞式 获取,没有到期元素,线程将会进行等待。

优点:
jdk 自带的,不需要引入其他框架 中间件,实现简单。
缺点:

  1. 不支持分布式或者 持久化的,重启会丢失。
  2. 如果 并发量 非常大,因为DelayQueue式无界的,队列内的对象越多。可能会造成oom 的风险。
  3. 所以使用 delayQueue实现的定时任务,只适用于任务量较小的情况。

3

4.3 消息中间件

rocketmq如何实现延时队列

rocketmq 先把消息 按照延时时间段(1s,5s,10s) 发到指定的队列中,然后通过一个定时器轮询这些队列。如果到期,就把 这个消息发到指定的topic 队列。
注意点:
3

  1. rocketmq 延时消息的时长不支持随机时长的延迟。是通过特定的延迟等级来指定的。
    默认支持18个等级的延迟消息。
    延时等级 在rocketmq服务端的MessageStoreConfig类中
private String messageDelayLevel ='1s 5s 10s 30s   1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 30m 1h 2h'发消息时: 设置delayLevel 等级即可  msg.setDelayLevel( level);level ==0 消息非延迟1<=level <=maxlevel 消息延迟特定的时间。level >maxlevel  那么 level=maxlevel  例如leve=20,延迟2h

优点:
基于消息中间件可以快速实现延时队列,而且天然支持消息消费的有序性、消息持久化、ack机制
缺点:
需要额外的部署 和运维成本。

4.4 redis zset、 key 过期回调

zrangebyScore

redis 127.0.0.1:6379> ZADD salary 2500 jack               # 测试数据
(integer) 0
redis 127.0.0.1:6379> ZADD salary 5000 tom
(integer) 0
redis 127.0.0.1:6379> ZADD salary 12000 peter
(integer) 0redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf           # 显示整个有序集
1) "jack"
2) "tom"
3) "peter"redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf WITHSCORES  # 显示整个有序集及成员的 score 值
1) "jack"
2) "2500"
3) "tom"
4) "5000"
5) "peter"
6) "12000"redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf 5000 WITHSCORES  # 显示工资 <=5000 的所有成员
1) "jack"
2) "2500"
3) "tom"
4) "5000"redis 127.0.0.1:6379> ZRANGEBYSCORE salary (5000 400000     # 显示工资大于 5000 小于等于 400000 的成员
1) "peter"

3

4.5 时间轮算法

3

核心参数

每个 刻度 代表一个duration 时长。

  • tickDuration s 、mins、 h
    每个刻度的时长
  • round
    第几圈 后执行,使用延期时长/ 一圈的时长得来
    一个刻度1s,15s 后执行,那么 需要 round =2,没到指定位置,round -1;
  • ticksPerWheel
    一圈下来有几个刻度

工作原理

  • 指针停在0处
  • tickDuration=1
  • ticksPerWheel=12

如果一个25秒才执行的延时任务添加进来,首先它会计算它的round和index,round=25/12 =2
index=25%12=1.
所以时间轮长这样:
34

当指针转到index=1的刻度时,会判断第一个task的round是不是为0,如果为0则取出来,去执行,如果大于0,则将round-1.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/130313.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis(1)-hiredis-Windows下的编译

1.linux编译说明文档 GitHub - sewenew/redis-plus-plus: Redis client written in C 2.hiredis 编译 2.1 hiredis下载 https://github.com/redis/hiredis.git 2.2 hiredis cmake编译 2.2.1 配置生成:ConfigeGenerateOpen Project 配置源目录&#xff1a;…

【直接运行TS文件的三种方法】

直接运行TS文件的三种方法 文章目录 直接运行TS文件的三种方法法一&#xff1a;将 ts 编译成 js&#xff0c;然后运行 js 文件法二&#xff1a;用 ts-node 直接运行 ts法三&#xff1a;webstorm中直接运行ts(TypeScript) 法一&#xff1a;将 ts 编译成 js&#xff0c;然后运行 …

解决:AD装配输出拾放文件出现闪退问题

PCB在装配输出过程中&#xff0c;需要导出拾放文件&#xff0c;但是今天每次执行这个过程&#xff0c;AD软件就会直接闪退。 重启AD把项目管理器中没有关掉的一系列乱七八糟文件手动关闭关闭AD软件再次重启AD&#xff0c;打开项目重新导出。

04JVM_语法糖

一、编译期处理 语法糖java编译器把*.java源码编译为*.class字节码的过程中&#xff0c;自动生成和转换的一些代码&#xff08;添加的class字节码&#xff09;&#xff0c;减轻程序员的负担。 1.默认构造器 默认构造器没有写任何的构造方法&#xff0c;但经过编译器编译成字…

Spark2x原理剖析(二)

一、概述 基于社区已有的JDBCServer基础上&#xff0c;采用多主实例模式实现了其高可用性方案。集群中支持同时共存多个JDBCServer服务&#xff0c;通过客户端可以随机连接其中的任意一个服务进行业务操作。即使集群中一个或多个JDBCServer服务停止工作&#xff0c;也不影响用…

Newman+Jenkins实现接口自动化测试

一、是什么Newman Newman就是纽曼手机这个经典牌子&#xff0c;哈哈&#xff0c;开玩笑啦。。。别当真&#xff0c;简单地说Newman就是命令行版的Postman&#xff0c;查看官网地址。 Newman可以使用Postman导出的collection文件直接在命令行运行&#xff0c;把Postman界面化运…

Fourier傅里叶变换的线性性质和位移性质

Fourier傅里叶变换的线性性质和位移性质 为了阐述方便, 假定在这些性质中, 凡是需要求Fourier变换的函数都满足Fourier积分定理中的条件。在证明这些性质时, 不再重述这些条件。 一、线性性质 设 F 1 ( ω ) F [ f 1 ( t ) ] {F_1}(\omega ) {\mathscr F}[{f_1}(t)] F1​(…

2024苹果手机软件备份软件工具iMazing

很多人都会忘记备份iOS 资料&#xff0c;或者因为设置备份时间、位置等不到位&#xff0c;导致需要用的时候找不到备份。接下来&#xff0c;小编就来教大家iMazing软件备份功能的几个设置小技巧&#xff0c;都在软件界面的“选项”内调整&#xff0c;减少备份过程中的出错。 图…

OpenHarmony社区运营报告(2023年8月)

本月快讯 2023年8月3日&#xff0c;OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;发布了Beta2版本。OpenHarmony 4.0 Beta2在系统能力、应用框架、分布式通信、媒体功能、安全性等方面进行了全面升级。其中&#xff0c;ArkUI增强了界面组件能力&#x…

Docker Swarm

Docker Swarm提供 Docker 容器集群服务&#xff0c;是 Docker 官方对容器云生态进行支持的核心方案。将多个 Docker 主机封装为单个大型的虚拟 Docker 主机&#xff0c;快速打造一套容器云平台。 Swarm mode内置 kv 存储功能&#xff0c;提供了众多的新特性&#xff0c;比如&a…

报错ssh: Could not resolve hostname

…按照网上好多教程试了一下&#xff1a; 新建密钥&#xff0c;添加到gitee&#xff0c;重新测试。修改host&#xff0c;加入gitee的ip地址到里面去。修改.gifconfig配置文件&#xff0c;配置成ssh的仓库链接。 这上面的方法都不行&#xff0c;后面发现一篇文章&#xff1a;SS…

c语言flag的使用

flag在c语言中标识某种状态或记录某种信息&#xff0c;可以通过修改flag中来控制程序流程,判断某种状态是否存在或记录某种信息 操作:(1)初始化 (2)赋值 (3)判断 (4)修改 (5)去初始化 #include <stdlib.h>int power_state_check;int main() {int i 0;power_state_check…

GC 算法与种类

对于垃圾收集&#xff08;GC&#xff09;, 我们需要考虑三件事情&#xff1a;哪些内存需要回收&#xff1f;如何判断是垃圾对象&#xff1f;垃圾回收算法有哪些&#xff1f; 一、GC的工作区域 1、不是GC的工作区域 (1)程序计数器、虚拟机栈和本地方法栈三个区域是线程私有的&…

计算机视觉领域经典模型汇总(2023.09.08

一、RCNN系列 1、RCNN RCNN是用于目标检测的经典方法&#xff0c;其核心思想是将目标检测任务分解为两个主要步骤&#xff1a;候选区域生成和目标分类。 候选区域生成&#xff1a;RCNN的第一步是生成可能包含目标的候选区域&#xff0c;RCNN使用传统的计算机视觉技术&#x…

1905. 统计子岛屿

给你两个 m x n 的二进制矩阵 grid1 和 grid2 &#xff0c;它们只包含 0 &#xff08;表示水域&#xff09;和 1 &#xff08;表示陆地&#xff09;。一个 岛屿 是由 四个方向 &#xff08;水平或者竖直&#xff09;上相邻的 1 组成的区域。任何矩阵以外的区域都视为水域。 如…

记录第一次带后端团队

在过去的一个半月里我第一次作为后端开发组长角色参与公司项目从0到1的开发&#xff0c;记录这一次开发的经历。 1、背景介绍 首先说明一下背景。我所在的公司是做智慧社区相关业务&#xff0c;开发的项目是系统升级工具&#xff0c;方便公司实施同事安装和升级系统。 参与后…

借助ChatGPT使用Pandas实现Excel数据汇总

一、问题的提出 现在有如下一个Excel表&#xff1a; 上述Excel表中8万多条数据&#xff0c;记录的都是三年以来花菜类的销量&#xff0c;现在要求按月汇总实现统计每个月花菜类的销量总和&#xff0c;如果使用Python的话要给出代码。 二、问题的解决 1.首先可以用透视表的方…

冒泡排序、选择排序、插入排序、希尔排序

冒泡排序 基本思想 代码实现 # 冒泡排序 def bubble_sort(arr):length len(arr) - 1for i in range(length):flag Truefor j in range(length - i):if arr[j] > arr[j 1]:temp arr[j]arr[j] arr[j 1]arr[j 1] tempflag Falseprint(f第{i 1}趟的排序结果为&#…

ElasticSearch入门

一、基本命令_cat 1、查看节点信息 http://192.168.101.132:9200/_cat/nodes2、查看健康状况 http://192.168.101.132:9200/_cat/health3、查看主节点的信息 http://192.168.101.132:9200/_cat/master4、查看所有索引 http://192.168.101.132:9200/_cat/indices二、索引一…

思科的简易配置

vlan 划分配置 1. 拓扑连接 2. 终端设备配置&#xff0c;vlan(v2, v3)配置&#xff0c;模式设置 然后设置交换机 fa 0/5 口为 trunk 模式&#xff0c;使得不同交换机同一 vlan 下 PC 可以互连 3.测试配置结果 用 ip 地址为 192.168.1.1 的主机(PC0)向同一 vlan(v2)下的 192.…