当前位置: 首页 > news >正文

redis全局唯一ID生成策略、countDownLatch、Lambda表达式总结

redis全局唯一ID生成策略

  • 一、有哪些生成全局唯一ID的策略
  • 二、使用Redis自增
    • 1. 分析
    • 2. RedisIdWorker配置类
    • 3 单元测试+注解分析(难点较多)
      • 3.1 countDownLatch前言
      • 3.2 常用方法

一、有哪些生成全局唯一ID的策略

在这里插入图片描述

二、使用Redis自增

1. 分析

在这里插入图片描述

2. RedisIdWorker配置类

主要的逻辑就是,生成一个long类型的id,然后前31位通过时间戳来填充,后32位通过自增来填充,前31位用来判断时间,后32位是为了防止在那一秒中的时候,有成千上万的订单。

@Component
public class RedisIdWorker {private static final long BEGIN_TIMESTAMP=1689811200;/*** 序列号的位数*/private static final int COUNT_BITS=32;private StringRedisTemplate  stringRedisTemplate;public RedisIdWorker(StringRedisTemplate stringRedisTemplate){//可以使用构造函数来注入,也可以直接用    @Resourcethis.stringRedisTemplate=stringRedisTemplate;}public long nextId(String keyPrefix){//这个传入的是别名,就是用于区别缓存名//1.生成时间戳LocalDateTime now = LocalDateTime.now();long nowSecond = now.toEpochSecond(ZoneOffset.UTC);long timestamp = nowSecond - BEGIN_TIMESTAMP;//2.生成序列号//2.1 获取当前日期,精确到天String date = now.format(DateTimeFormatter.ofPattern("yyyyMMdd"));//2.2自增长long count = stringRedisTemplate.opsForValue().increment("icr:" + keyPrefix + ":" + date);//3.拼接返回return timestamp<<COUNT_BITS | count;//把COUNT_BITS时间戳往前面移动32位,后面的用count去插入。|代表的意思是,你count插入的一定成功}/*** 这个用来生成时间戳到目标年月日时分秒过的秒数。1689811200*//*   public static void main(String[] args) {//这个用来生成时间戳到当前年月日时分秒过的秒数。LocalDateTime time =LocalDateTime.of(2023,7,20,0,0,0);long second = time.toEpochSecond(ZoneOffset.UTC);System.out.println(second);}*/
}

3 单元测试+注解分析(难点较多)

对于 CountDownLatch、Lambda 的解释在代码后面

@Resourceprivate RedisIdWorker   redisIdWorker;//注入我们的配置类private ExecutorService es = Executors.newFixedThreadPool(500);//定义一个500的线程池@Test
void testIdWorker() throws InterruptedException {//redis全局唯一id的策略。CountDownLatch latch =new CountDownLatch(300); //countDownLatch相当于一个计数器,能够使一个线程等待( latch.await();)另外一些线程完成各自的工作后,// 再继续执行。这个计数器的初始值就是线程的数量,每当一个线程完成之后,计数器就进行减1,当计数器的值为0时,// 那么在countDownLatch上等待的线程就可以继续执行Runnable task=()->{     //这里是一个Lambda 表达式for (int i=0;i<100;i++){        //一次生成100个idLong id =redisIdWorker.nextId("order");//这个就是我们定义的类里面的方法“order是别名”System.out.println("id="+id);}latch.countDown();; //上面的for循环完一次,进行减一,减到0就执行下面的 latch.await();后面的操作};long begin =System.currentTimeMillis();for(int i=0;i<300;i++){    //程序其实从这里才开始,我们提交300个任务到线程里面,线程提交到task这个函数es.submit(task);}latch.await();//这里是当上面的latch为0后,开始启动这里long end =System.currentTimeMillis();System.out.println("time="+(end-begin));
}

3.1 countDownLatch前言

countDownLatch( 门阀、 计数器)是多线程控制的一种工具 ,它用来协调各个线程之间的同步。

countDownLatch相当于一个计数器,能够使一个线程等待另外一些线程完成各自的工作后,再继续执行。这个计数器的初始值就是线程的数量,每当一个线程完成之后,计数器就进行减1,当计数器的值为0时,那么在countDownLatch上等待的线程就可以继续执行。

countDownLatch接收一个int类型的参数,表示要等待的工作线程个数

public CountDownLatch(int count) {
if (count < 0) throw new IllegalArgumentException(“count < 0”);
this.sync = new Sync(count);
}

3.2 常用方法

方法 说明

await()	使当前线程进入同步队列进行等待,直到latch的值被减到0或者当前线程被中断,当前线程就会被唤醒。
await(long timeout, TimeUnit unit)	带超时时间的await()。
countDown()	使latch的值减1,如果减到了0,则会唤醒所有等待在这个latch上的线程
getCount()	获得latch的数值

原文链接:https://blog.csdn.net/qq_50652600/article/details/128075662
Lambda的超详细总结:https://blog.csdn.net/huangjhai/article/details/107110182

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 《峡谷小狐仙-多模态角色扮演游戏助手》复现流程
  • Java IO模型深入解析:BIO、NIO与AIO
  • 为什么 FPGA 的效率低于 ASIC?
  • SpringBoot之拦截器(Interceptor)
  • Rust代码答疑报错|Python一对一辅导答疑
  • sql查询报错空指针怎么解决?
  • Anything LLM ,构建自己的 RAG 架构 LLM,学习自己的知识库
  • HCIP之PPP协议(PAP认证,CHAP认证)、GRE、MGRE综合实验
  • git -.gitignore不生效的问题
  • React 18【实用教程】(2024最新版)
  • 从dev分支合并到master分支
  • Vue 3项目安装Element-Plus
  • el-table表格 及其el-pagination分页 封装及其使用
  • 【深度学习】sdxl的Lora训练技巧
  • day07:用户下单、订单支付
  • @angular/forms 源码解析之双向绑定
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Git的一些常用操作
  • HTTP中的ETag在移动客户端的应用
  • mysql 5.6 原生Online DDL解析
  • node和express搭建代理服务器(源码)
  • Web标准制定过程
  • 规范化安全开发 KOA 手脚架
  • 扑朔迷离的属性和特性【彻底弄清】
  • 使用API自动生成工具优化前端工作流
  • ​io --- 处理流的核心工具​
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​secrets --- 生成管理密码的安全随机数​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • ​字​节​一​面​
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • $.ajax中的eval及dataType
  • $nextTick的使用场景介绍
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (27)4.8 习题课
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (web自动化测试+python)1
  • (笔试题)合法字符串
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (四)事件系统
  • (图)IntelliTrace Tools 跟踪云端程序
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .Net Core 生成管理员权限的应用程序
  • .NET delegate 委托 、 Event 事件,接口回调
  • .net Signalr 使用笔记
  • .net 无限分类
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .Net7 环境安装配置
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)