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

news2024/11/15 15:47:51

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){//可以使用构造函数来注入,也可以直接用    @Resource
        this.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 的解释在代码后面


   @Resource
    private 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个id
            Long 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《数据结构1800题》基础回合总结——第1章 绪论

前言&#xff1a;《数据结构1800》这本书相信大家或多或少都有所耳闻&#xff0c;收录了诸多不同档次学校的考研真题&#xff0c;因为和汤老师的1800撞名所以备受调侃。这1800道题目里面有选择有填空&#xff0c;也有简答和一些编程题&#xff0c;总的来说质量良莠不齐——亦或…

Transformer之Swin-Transformer结构解读

写在最前面之如何只用nn.Linear实现nn.Conv2d的功能 很多人说&#xff0c;Swin-Transformer就是另一种Convolution&#xff0c;但是解释得真就是一坨shit&#xff0c;这里我郑重解释一下&#xff0c;这是为什么&#xff1f; 首先&#xff0c;Convolution是什么&#xff1f; Co…

GaussianPro使用笔记

1. 介绍 GaussianPro: 3D Gaussian Splatting with Progressive Propagation 3D高斯分布(3DGS)最近以其高保真度和效率彻底改变了神经渲染领域。然而&#xff0c;3DGS在很大程度上依赖于运动结构&#xff08;SfM&#xff09;技术生成的初始化点云。当处理不可避免地包含无纹理…

语音识别 语音识别项目相关笔记内容

语音识别 语音识别项目相关笔记内容 语音识别应用范畴语音识别框架语音基本操作使用scipy.io.wavfile读取wav音频文件获取采样率、长度、通道数使用numpy读取pcm格式音频文件读取wav音频文件,并绘制图像读取双声道的wav音频文件,分别绘制不同声道的波形图读取一个采样率为16k…

拍立淘API返回值:图像搜索技术的商品信息获取指南

拍立淘API是基于图像搜索技术的商品信息获取工具&#xff0c;广泛应用于阿里巴巴旗下的电商平台如淘宝、天猫等。这一API通过用户上传的商品图片&#xff0c;利用深度学习、计算机视觉等先进技术自动识别图片中的商品信息&#xff0c;并返回与之相关的搜索结果。以下是对拍立淘…

go语言Gin框架的学习路线(八)

目录 GORM Model定义 使用 Model 结构体的自定义数据模型 理解并记忆 GORM 的 Model 结构体可以通过以下几个步骤和技巧&#xff1a; 1. 理解基本概念 2. 熟悉基本字段 3. 记忆技巧 4. 使用场景 结构体标记 支持的结构体标记&#xff08;Struct tags&#xff09; 关联…

浏览器渲染揭秘:从加载到显示的全过程;浏览器工作原理与详细流程

目录 浏览器工作原理与流程 一、渲染开始时间点 二、渲染主线程的渲染流程 2.1、渲染流程总览 2.2、渲染具体步骤 ①解析html-Parse HTML ②样式计算-Recalculate Style ③布局-Layout ④分层-Layer 相关拓展 ⑤绘制-Paint ⑥分块-Tiling ⑦光栅化-Raster ⑧画-D…

四川赤橙宏海商务信息咨询有限公司引领抖音电商新趋势

随着互联网的飞速发展&#xff0c;电子商务已成为企业竞争的新高地。在众多电商平台中&#xff0c;抖音以其独特的短视频直播形式&#xff0c;吸引了亿万用户的目光&#xff0c;成为电商领域的新宠。在这样的背景下&#xff0c;四川赤橙宏海商务信息咨询有限公司凭借其专业的电…

新零售电商:订单管理系统设计

传统电商依托于线上流量产生消费者&#xff0c;新零售则是通过网上商城、小程序以及其他应用程序相结合形成网店&#xff0c;同时与线下实体门店和现代物流进行深度整合&#xff0c;最终形成了新的销售模式。 订单管理系统上下游对接系统繁杂&#xff0c;包括&#xff1a;商品中…

【Java语法基础】1、变量、运算符、输入输出

1.变量、运算符、输入输出 跟C一样&#xff0c;先把必须写的框架写出来&#xff1a; package org.example; public class Main{public static void main(String[] args){//在里面写实际的代码} }变量 必须先定义&#xff0c;才能使用。与C、C差不多。 没有赋初值的变量无法…

如何实现Web服务只允许特定客户端访问

如何实现Web服务只允许特定客户端访问 需求来源 为了满足B/S系统给客户演示的需要&#xff0c;需要部署一套系统允许公网能够访问&#xff0c;便于业务人员到客户哪里进行系统演示&#xff0c;但是目前网络安全非常重要&#xff0c;希望能防止暴力破解或者端口扫描等黑客攻击…

全网最实用--神经网络各个组件以及效率指标 (含代码助理解,粘贴即用)

文章目录 一、神经网络相关组件0.前奏1.全连接层&#xff08;Fully Connected Layer, FC&#xff09;/密集层&#xff08;Dense Layer&#xff09;:2.卷积层&#xff08;Convolutional Layer, Conv&#xff09;:a.一维卷积b.二维卷积c.分组卷积 3.池化层&#xff08;Pooling La…

汇编语言例题分析

以下数据段定义了如下数据&#xff0c;对应内存图请填空&#xff0c;写出每个内存字节中的2位16进制数&#xff08;注意写准确&#xff0c;2位16进制数&#xff0c;末尾不带h&#xff09;。 Data1 segment x db 1,2,3 y db “ABa” z dw 1,2 Data1 ends 物理地址从0000开始&…

C语言指针超详解——最终篇二

C语言指针系列文章目录 入门篇 强化篇 进阶篇 最终篇一 最终篇二 文章目录 C语言指针系列文章目录1. sizeof 与 strlen1.1 字符数组1.2 二维数组 2. 指针运算笔试题解析 以上接指针最终篇一 1. sizeof 与 strlen 1.1 字符数组 代码三&#xff1a; #include<stdio.h>…

『 Linux 』System V共享内存

文章目录 System V IPCSystem V 共享内存的直接原理System V共享内存的创建挂接共享内存取消挂接共享内存释放共享内存利用System V共享内存进行进程间通信共享内存的特性共享内存的属性通过命名管道为共享内存添加同步互斥机制 System V IPC System v 是一种操作系统和相关技术…

不懂这些,面试都不敢说自己熟悉Redis

点赞再看&#xff0c;Java进阶一大半 下面这位就是Redis的创始人&#xff0c;他叫antirez&#xff0c;让我们Java开发者又要多学一门Redis的始作俑者。 我们肯定很难想象Redis创始人竟然学的是是建筑专业&#xff0c;而当年antirez是为了帮网站管理员监控访问者的实时行为才开发…

22集 如何minimax密钥和groupid-《MCU嵌入式AI开发笔记》

22集 如何获取minimax密钥和groupid-《MCU嵌入式AI开发笔记》 minimax密钥获取 https://www.minimaxi.com/platform 进入minimax网站&#xff0c;注册登录后&#xff0c;进入“账户管理”&#xff0c; 然后再点击“接口密钥”&#xff0c;然后再点击“创建新的密钥”。 之…

linux系统安装python3和pip

一、安装python 1、安装依赖环境 yum install gcc -y yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel yum install zlib zlib-devel openssl -y yum install openssl…

什么是信创沙箱?信创沙箱的原理是什么?

在这个数字化高速发展的时代&#xff0c;信息安全问题愈发显得重要。我们每天都在为数据的安全性、隐私性和完整性操心。有时候&#xff0c;感觉就像是一场没有终点的马拉松。而在这场马拉松中&#xff0c;深信达信创沙箱&#xff08;Trusted Computing Sandbox&#xff09;无疑…

谷粒商城实战笔记-52~53-商品服务-API-三级分类-新增-修改

文章目录 一&#xff0c;52-商品服务-API-三级分类-新增-新增效果完成1&#xff0c;点击Append按钮&#xff0c;显示弹窗2&#xff0c;测试完整代码 二&#xff0c;53-商品服务-API-三级分类-修改-修改效果完成1&#xff0c;添加Edit按钮并绑定事件2&#xff0c;修改弹窗确定按…