雪花算法 Nginx

雪花算法介绍

SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id

  • 1位,不用。二进制中最高位为1的都是负数,但是生成的id都是正数,所以这个最高位固定是0

  • 41位,用来记录时间戳(毫秒)。

    • 41位可以表示2<sup>41</sup>-1个数字,

    • 如果只用来表示正整数(计算机中正数包含0),可以表示的数值范围是:0 至 2<sup>41</sup> - 1,减1是因为可表示的数值范围是从0开始算的,而不是1。

    • 也就是说41位可以表示2<sup>41</sup> - 1个毫秒的值,转化成单位年则是2<sup>41</sup> - 1 / (1000 * 60 * 60 * 24 * 365) = 69年

  • 10位,用来记录工作机器id。

    • 可以部署在2<sup>10</sup> = 1024个节点,包括5位datacenterId5位workerId

    • 5位(bit)可以表示的最大正整数是2<sup>5</sup> - 1 = 31,即可以用0、1、2、3、....31这32个数字,来表示不同的datecenterId或workerId

  • 12位,序列号,用来记录同毫秒内产生的不同id。

    • 12位(bit)可以表示的最大正整数是2<sup>12</sup> - 1 = 4095,即可以用0、1、2、3、....4095这4096个数字,来表示同一机器同一时间截(毫秒)内产生的4096个ID序号,减1是因为可表示的数值范围是从0开始算的,而不是1。

同一毫秒:0-4095 4096,因为这一毫秒生产的ID数已经满了,因此需要让CPU空转,使得毫秒数增加1,那么此时这一毫秒的ID生成应该从0重新开始

算法实现

package com.qf.electronic.util;

/**
 * 雪花算法
 */
public class SnowFlake {
    /**
     * 这里需要记录最后一次生成ID的时间,因为同一毫秒内,可能会生成多个ID,记录后可以用来做比对
     */
    private long lastTime = -1L;
    /**
     * 初始时间,因为时间占41位,所以可以从这个时间开始,差不多使用69年
     */
    private long startTime = System.currentTimeMillis();
    /**
     * 机房ID,占5位,因此最多能够对32个机房有效
     */
    private long dataCenterId;
    /**
     * 机器ID,占5位,因此最多能够对32个机器有效
     */
    private long workId;
    /**
     * 序列号,占12位,因此在一毫秒内最多生成2^12 = 4096个序列号
     */
    private long sequence;


    public SnowFlake(long dataCenterId, long workId, long sequence){
        //机房ID最小值为0,最大值为31
        if(dataCenterId > 31 || dataCenterId < 0){
            throw new IllegalArgumentException("机房ID必须>=0且<=31,当前使用机房ID:" + dataCenterId);
        }
        if(workId > 31 || workId < 0){
            throw new IllegalArgumentException("机器ID必须>=0且<=31,当前使用机器ID:" + workId);
        }
        this.dataCenterId = dataCenterId;
        this.workId = workId;
        this.sequence = sequence;
    }

    public long generateId(){
        long time = System.currentTimeMillis(); //获取系统当前时间
        if(time < lastTime){//防止时间回拨,必须手动将时间拨回
            throw new RuntimeException("时间回拨");
        }
        if(time == lastTime){//同一时间段内,生成多个ID
            //按位与操作符所得结果最大值不会超过参与运算的最小操作数,这里不能超过4096
            sequence = (sequence + 1) & 4095;
            if(sequence == 0){//如果计数重新归0,表示该毫秒内,ID生成的数量已满
                //CPU空转1毫秒
                while ((time = System.currentTimeMillis()) == lastTime);
            }
        } else {
            sequence = 0;
        }
        //时间本身占41位,但是需要向左移动22位才能在指定的位置上
        //机房ID占5位,但是需要向左移动17位才能在指定的位置上
        //机器ID占5位,但是需要向左移动12位才能在指定的位置上
        long id = (time - startTime) << 22 | dataCenterId << 17 | workId << 12 | sequence;
        lastTime = time;
        return id;
    }
}

Nginx

1. Nginx是什么

Nginx是一个高性能的基于HTTP的反向代理的服务器、也是一个基于SMTP和POP3的邮件服务器其主要功能就类似于Tomcat,对外提供资源共享

反向代理(Reverse Proxy)是指以代理服务器来接收客户端请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给客户端

反向代理的作用:

  • 保证内网的安全,阻止web攻击,因为客户端是无法感知真正做事的服务器的存在

  • 负载均衡:代理服务器将接收的请求均分给被代理的服务器

2. Nginx能干什么

Nginx既然是服务器,那么其能做的事就是数据共享,具体体现如下:

  • 虚拟主机

    虚拟主机就是虚拟服务器,就跟Java虚拟机差不多,Java虚拟机虽然是虚拟的,但也具备计算机的功能,也能运行。虚拟主机也一样,虽然不存在,但Nginx可以虚拟出来,对外提供服务

  • 反向代理

    前面已经介绍过

  • 负载均衡

    负载就是服务器承载的负荷,所谓均衡指的是多个服务器之间的负荷对比,单个服务器没有均衡的说法。负载均衡就是指多个服务器之间处理的请求数量要大致相同

  • 动静分离

    动指的是资源会变化,比如从服务器获取的数据。

    静指的就是资源不会变化,比如从服务器获取的html、css、js、图片等。

    动静分离指的是动态资源放在服务器上处理,静态资源放在nginx上处理。

3. Nginx的安装及目录说明

演示

4. Nginx配置

nginx的学习也就是配置文件的学习

4.1 虚拟主机配置

server {
       listen   8888;
       server_name localhost;
       location /{ 
         root d:/demo;
         index index.html;
       }
}
4.2 反向代理配置
# 以/electronic/开始的请求会被代理到另外的服务器访问
location /electronic/ {
   proxy_pass  http://localhost:9000/;
}
4.3 负载均衡配置
upstream electronicServer {
    server localhost:9000;
    server localhost:9001;
}
# 以/electronic/开始的请求会被代理到另外的服务器访问
location /electronic/ {
	proxy_pass  http://electronicServer/;
}
  • 负载均衡---轮询

    upstream electronicServer {
        server localhost:9000;
        server localhost:9001;
    }
  • 负载均衡---权重

    upstream electronicServer {
        server localhost:9000 weight=2; #权重越大,被分配处理的请求越多
        server localhost:9001 weight=1;
    }
  • 负载均衡---ip_hash

    ip_hash就是通过请求的ip地址,使用hash算法,算出来应该访问那一台服务器,如果是ip地址没变,那么这个请求的服务器 就永远都不会变

    upstream electronicServer {
        ip_hash; # 负载均衡规则
        server localhost:9000;
        server localhost:9001;
    }
4.4 动静分离

5. 附录: 匹配规则

  • =

    = 开头表示精确匹配

  • ^~

    ^~ 开头 表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。

  • ~

    ~ 开头表示区分大小写的正则匹配

  • ~*

    ~* 开头表示不区分大小写的正则匹配

  • !~

    !~开头表示区分大小写不匹配

  • !~*

    !~*开头表示不区分大小写不匹配

  • /

    / 通用匹配,任何请求都会匹配到。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入理解badblocks

文章目录 一、概述二、安装2.1、源码编译安装2.2、命令行安装2.3、安装确认 三、重要参数详解3.1、查询支持的参数3.2、参数说明 四、实例4.1、全面扫描4.2、破坏性写入并修复4.3、非破坏性写入测试 五、实现原理六、注意事项 团队博客: 汽车电子社区 一、概述 badblocks命令是…

【码农新闻】原来这就是网络,小霸王是我儿时快乐源泉之一,不知这里有没有你儿时玩过的游戏机呢......

目录 【码农新闻】原来这就是网络&#xff0c;小霸王是我儿时快乐源泉之一,不知这里有没有你儿时玩过的游戏机呢...... 【何同学】我毕业了&#xff01;&#xff01;原来这就是网络承载童年的游戏机&#xff0c;已停产&#xff01;但我在 GitHub 找到了它们国货正当潮-那些你所…

蓝桥杯省赛无忧 编程12 四元组问题

#include <bits/stdc.h> using namespace std; bool FoursNumberFind(vector<int>& nums) {stack<int> st;int n nums.size(), k INT_MIN, INF INT_MAX;//min_r[i] min(nums[r]), i < r < n。//表示第i个数&#xff08;不包括第i个数&#xff…

2024年电工(初级)证考试题库及电工(初级)试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年电工&#xff08;初级&#xff09;证考试题库及电工&#xff08;初级&#xff09;试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#…

k8s---安全机制

k8s的安全机制&#xff0c;分布式集群管理工具&#xff0c;就是容器编排。安全机制的核心&#xff1a;APIserver。为整个集群内部通信的中介&#xff0c;也是外控控制的入口。所有的机制都是围绕apiserver来进行设计&#xff1a; 请求api资源&#xff1a; 1、认证 2、鉴权 …

陈酿过程中的物质转化与品质改善

陈酿是酿酒过程中至关重要的环节&#xff0c;它能够改善酒的品质和口感&#xff0c;使酒更加醇厚、芳香。云仓酒庄的豪迈白酒在陈酿过程中&#xff0c;物质转化与品质改善方面表现得尤为杰出。 首先&#xff0c;陈酿能够促进酒中物质的转化。在长时间的陈酿过程中&#xff0c;酒…

遇到IP禁令怎么办?别慌,解决方法在这

相信很多人遇到过IP禁令&#xff1a;比如你在访问社交媒体、搜索引擎或电子商务网站时会被限制访问&#xff0c;又或者你的的账号莫名被封&#xff0c;这些由于网络上的种种限制我们经常会遭遇IP被封的情况&#xff0c;导致无法使用继续进行网络行动。在本文中&#xff0c;我们…

Docker容器引擎(3)

目录 一.Docker 镜像的创建 1&#xff0e;基于现有镜像创建 2&#xff0e;基于本地模板创建 3.基于Dockerfile创建&#xff1a; Dockerfile 操作常用的指令&#xff1a; ADD 和 COPY 的区别&#xff1f; CMD 和 ENTRYPOINT 的区别&#xff1f; 容器启动命令的优先级 如…

c++day2

计算矩形的面积 #include <iostream> using namespace std; class Rect {int width;int heigh; public:void init(int w, int h){width w;heigh h;}void set_w(int w){width w;}void set_h(int h){heigh h;}void show(){cout << "该矩形面积:" <…

ASP.NET Core NE8实现HTTP Upgrade和HTTP CONNECT代理服务器

看到一个文章[Go] 不到 100 行代码实现一个支持 CONNECT 动词的 HTTP 服务器 在NET8中如何实现 创建项目为MiniApi 编辑Program.cs文件。 var builder WebApplication.CreateSlimBuilder(args);var app builder.Build();// 将HTTP请求通过协议升级机制转为远程TCP请求&…

可视化智慧水电站EasyCVR视频智能监控系统方案设计与技术应用介绍

一、背景需求 水电站作为国家重要的能源基地&#xff0c;其安全运行对于保障能源供应和社会稳定具有重要意义。然而&#xff0c;传统的人工监控方式存在着诸多问题&#xff0c;如人力成本高、监控范围有限、反应不及时等。因此&#xff0c;水电站急需引进一种先进的视频智能监…

开始学习Vue2(组件的生命周期和数据共享)

一、组件的生命周期 1. 生命周期 & 生命周期函数 生命周期&#xff08;Life Cycle&#xff09;是指一个组件从创建 -> 运行 -> 销毁的整个阶段&#xff0c;强调的是一个时间段。 生命周期函数&#xff1a;是由 vue 框架提供的内置函数&#xff0c;会伴随着 组件…

解读Android进程优先级ADJ算法

本文基于原生Android 9.0源码来解读进程优先级原理,基于篇幅考虑会精炼部分代码 一、概述 1.1 进程 Android框架对进程创建与管理进行了封装,对于APP开发者只需知道Android四大组件的使用。当Activity, Service, ContentProvider, BroadcastReceiver任一组件启动时,当其所…

[极客大挑战 2019]Upload1

直接上传php一句话木马&#xff0c;提示要上传image 把文件名改成gif并加上gif文件头后&#xff0c;绕过了对image类型的检测&#xff0c;但是提示文件内含有<?&#xff0c;且bp抓包后改回php也会被检测 那我们考虑使用js执行php代码 <script languagephp>eval($_PO…

使用 LinkAi 打造自己的知识库和数字人

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、LinkAi 介绍 二、文档库 2.1 创建知识库 2.2 配置知识库 2.3 Ai配置 2.4 导入文档 2.5 接入微信 三、扩展 四、总结…

华媒舍:15种媒体发稿推广的创意理念与案例分析

媒体发稿已经成为推广知名品牌、产品与服务关键方式之一。怎样通过媒体发稿提升曝光度和吸引住受众却是一个挑战。下面我们就详细介绍15种创意理念和案例分析&#xff0c;帮助你更好地进行新闻媒体发稿推广。 1.造就日常生活小故事通过展示真实用户故事和感受&#xff0c;读者对…

Elasticsearch内核解析 - 写入篇

Elasticsearch内核解析 - 写入篇 - 知乎 目前的Elasticsearch有两个明显的身份,一个是分布式搜索系统,另一个是分布式NoSQL数据库,对于这两种不同的身份,读写语义基本类似,但也有一点差异。 写操作 实时性: 搜索系统的Index一般都是NRT(Near Real Time),近实时的,比…

vue3项目中用codemirror实现格式化java代码及不太成熟的历程

本期只介绍创作的曲折历程&#xff0c;并不能解决实际问题&#xff0c;现有插件不支持&#xff0c;总结在了最后 一、案例效果 vue3项目使用preitter 搭配prettier-plugin-java 实现codemirror 格式化 java 二、步骤 1. 安装prettier和prettier-plugin-java&#xff0c;可以…

Tomcat好帮手---JDK

目录 1、Tomcat好帮手---JDK 2、安装JDK 部署Tomcat参考博主博客 部署TOMCAT详解-CSDN博客 1、Tomcat好帮手---JDK JDK是 Java 语言的软件开发工具包&#xff0c;JDK是整个java开发的核心&#xff0c;它包含了JAVA的运行环境&#xff08;JVMJava系统类库&#xff09;和JAVA…

计算机网络 第5章(运输层)

系列文章目录 计算机网络 第1章&#xff08;概述&#xff09; 计算机网络 第2章&#xff08;物理层&#xff09; 计算机网络 第3章&#xff08;数据链路层&#xff09; 计算机网络 第4章&#xff08;网络层&#xff09; 计算机网络 第5章&#xff08;运输层&#xff09; 计算机…