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

徐州网站设计企业建设营销网站的基本步骤有哪些

徐州网站设计,企业建设营销网站的基本步骤有哪些,接效果图做网站,万网空间SueWakeup 个人中心#xff1a;SueWakeup 系列专栏#xff1a;学习Java框架 个性签名#xff1a;人生乏味啊#xff0c;我欲令之光怪陆离 本文封面由 凯楠#x1f4f7; 友情赞助播出! 目录 1. 什么是分布式 ID 2. 分布式 ID 基本要求 3. 数据库主键自增 4. UUID 5. S… SueWakeup 个人中心SueWakeup 系列专栏学习Java框架 个性签名人生乏味啊我欲令之光怪陆离 本文封面由 凯楠 友情赞助播出! 目录 1. 什么是分布式 ID 2. 分布式 ID 基本要求 3. 数据库主键自增 4. UUID 5. Snowflake 雪花算法 5.1 开源的雪花算法 注手机端浏览本文章可能会出现 “目录”无法有效展示的情况请谅解点击侧栏目录进行跳转    1. 什么是分布式 ID 在理解分布式 ID 之前请先阅读【概念】神马是分布式 分布式 ID 是指在分布式系统中数据库的自增 ID 不能满足需求需要在不同的节点之间通过一个唯一 ID 来进行标识。 个人理解在分布式微服务项目中多个线程同时对一张表新增数据且这张表的主键 ID 存在唯一性  2. 分布式 ID 基本要求 基本要求描述全局唯一在整个分布式系统中全局唯一不能出现重复 ID高性能高可用分布式 ID 的生成速度要快生成分布式 ID 的服务要保证可用性无限接近于 100%趋势递增在 MySQL InnoDB 引擎中使用的是聚焦索引由于多数 RDBMS 使用 B-tree 的数据结构来存储索引数据在主键的选择上面我们应该尽量使用有序的主键保证写入性能单调递增保证下一个 ID 一定大于上一个 ID具体的业务含义生成的 ID 拥有具体的业务含义可以让定位问题以及开发更透明化独立部署在分布式系统单独有一个发号器服务专门用来生成分布式 ID生成的 ID 的服务和业务相关的服务解耦但会带来服务之间网络调用消耗增加信息安全ID 中不能包含敏感信息如果 ID 是连续的恶意用户的扒取工作就非常容易做订单号就更危险了竞争对手可以获取到我们一天的订单信息所以一些应用场景下ID 需要呈现无规则状态 3. 数据库主键自增 通过关系型数据库的主键自增的方式产生唯一的 ID 优点缺点 实现简单、ID 有序递增、存储空间消耗小 单击模式下并发量不大性能瓶颈限制在单台 MySQL 的读写性能数据库服务器不可用时整个系统瘫痪ID 没有具体业务含义安全问题每次获取 ID 都要访问数据库 解决方案 在分布式系统中多部署几台及其每台机器设置不同的初始值且步长和机器数相等 如两台机器设置步长 step 为 2 TicketServer1 的初始值为 113579...、TicketServer2 的初始值为 2246810... 4. UUID Universally Unique Identifier通用唯一标识符的缩写 UUID 包含 32 个 16 进制数字8-4-4-4-12 生成规则包括 MAC 地址、时间戳、命名空间Namespace、随机或伪随机数、时序等元素基于这些规则生成的 UUID 不会重复 UUID.randomUUID(); 优点缺点 性能非常高本地生成没有网络消耗 不易于存储16 字节 128 位通常以长度为 36 的字符串表示很多场景不适用信息不安全基于 MAC 地址生成 UUID 的算法可能会造成 MAC 地址泄露不满足 MySQL 主键要求MySQL 官方有明确的建议主键要尽量越短越好对 MySQL 索引不利作为数据库主键在 InnoDB 引擎下UUID 的无序性可能会引起数据位置频繁变动影响性能 5. Snowflake 雪花算法 Snowflake 产生的 ID 由 64位 二进制数字组成被拆分成 4 个部分 符号位标识正负始终为0时间戳单位 ms毫秒可以支持 2^41 毫秒约 69 年工作时间 ID一般前 5 位表示机房 ID后 5 位表示机器ID用于区分不同集群/机房的节点10 位的长度可以表示 1024 个不同节点。序列号序列号为自增值代表单台机器每毫秒能够产生的最大 ID 数也就是说单台机器每毫秒最多可以生成 4096 个唯一ID最大支持 400W 左右的并发量。 5.1 开源的雪花算法 public class SnowFlake {// 机房数据中心IDprivate long datacenterId;// 机器 IDprivate long workerId;// 同一时间的序列号private long sequence;// 开始时间戳private long twepoch 1634393012000L; // 时间起点这里设置为2021-10-17 00:00:00// 机房ID所占的位数5个 bitprivate long datacenterIdBits 5L;// 机器ID所占的位数5个 bitprivate long workerIdBits 5L;// 最大机器ID5 bit 最多只能有31个数字就是说机器id最多只能是32以内// 最大111112进制 -- 3110进制private long maxWorkerId -1L ^ (-1L workerIdBits); // 最大机器ID值// 最大数据中心ID5 bit 最多只能有31个数字就是说数据中心id最多只能是32以内private long maxDatacenterId -1L ^ (-1L datacenterIdBits); // 最大数据中心ID值// 同一毫秒内的序列号位数12 bitprivate long sequenceBits 12L;// workerId左移位数12private long workerIdShift sequenceBits;// datacenterId左移位数125private long datacenterIdShift sequenceBits workerIdBits;// timestamp左移位数1255private long timestampLeftShift sequenceBits workerIdBits datacenterIdBits;// 序列号掩码4095 (0b1111111111110xfff4095)private long sequenceMask -1L ^ (-1L sequenceBits);// 上次时间戳private long lastTimestamp -1L;// 构造函数传入workerId和datacenterIdpublic SnowFlake(long workerId, long datacenterId) {this(workerId, datacenterId, 0);}// 构造函数传入workerId、datacenterId和sequencepublic SnowFlake(long workerId, long datacenterId, long sequence) {// 参数校验if (workerId maxWorkerId || workerId 0) {throw new IllegalArgumentException(String.format(worker Id cant be greater than %d or less than 0, maxWorkerId));}if (datacenterId maxDatacenterId || datacenterId 0) {throw new IllegalArgumentException(String.format(datacenter Id cant be greater than %d or less than 0, maxDatacenterId));}// 输出信息System.out.printf(worker starting. timestamp left shift %d, datacenter id bits %d, worker id bits %d, sequence bits %d, workerid %d,timestampLeftShift, datacenterIdBits, workerIdBits, sequenceBits, workerId);// 初始化参数this.workerId workerId;this.datacenterId datacenterId;this.sequence sequence;}// 生成下一个IDpublic synchronized long nextId() {// 获取当前时间戳long timestamp timeGen();// 检查时间回拨if (timestamp lastTimestamp) {System.err.printf(clock is moving backwards. Rejecting requests until %d., lastTimestamp);throw new RuntimeException(String.format(Clock moved backwards. Refusing to generate id for %d milliseconds,lastTimestamp - timestamp));}if (lastTimestamp timestamp) {// 同一毫秒内的序列号自增sequence (sequence 1) sequenceMask;if (sequence 0) {// 如果同一毫秒内的序列号超出范围等待下一毫秒timestamp tilNextMillis(lastTimestamp);}} else {// 不同毫秒内序列号重置为0sequence 0;}// 更新上次时间戳lastTimestamp timestamp;// 生成IDreturn ((timestamp - twepoch) timestampLeftShift) |(datacenterId datacenterIdShift) |(workerId workerIdShift) |sequence;}// 等待下一毫秒private long tilNextMillis(long lastTimestamp) {long timestamp timeGen();while (timestamp lastTimestamp) {timestamp timeGen();}return timestamp;}// 获取当前时间戳private long timeGen() {return System.currentTimeMillis();}// 主函数测试生成IDpublic static void main(String[] args) {SnowFlake worker new SnowFlake(1, 1);for (int i 0; i 100; i) {System.out.println(worker.nextId());}System.out.println();worker new SnowFlake(1, 2);for (int i 0; i 100; i) {System.out.println(worker.nextId());}}} 测试用例 SnowFlake flake1 new SnowFlake(1, 12);SnowFlake flake2 new SnowFlake(1, 12);Thread t1 new Thread(){Overridepublic void run() {for(int i0;i10;i){System.out.println(t1-flake1.nextId());}}};Thread t2 new Thread(){Overridepublic void run(){for(int i0;i10;i){System.out.println(t2-flake2.nextId());}}};t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}
http://www.pierceye.com/news/151757/

相关文章:

  • 地下城钓鱼网站如何做iis添加网站无法访问
  • 招聘网站大全网站开发liucheng
  • erlang做网站优势深圳集团网站建设公司好
  • 烟台公司建网站seo网站推广 沈阳
  • 没有网站做APP企业网站模板建站
  • 国内炫酷的网站首页网站开发交易平台
  • 大型网站建设公司制作网站好大夫在线免费咨询
  • 有哪些设计的很优秀的网站诸暨市住房建设局网站
  • 建设网站网站建站延吉手机网站建设开发
  • 网站建设一意见08wordpress主题
  • 做网站备案不少天网络设计包括哪些
  • 仿腾讯视频网站源码个人制作网站工具
  • 泉州网站制作建设163注册企业邮箱
  • 漳州市建设局网站6热e国产-网站正在建设中-手机版
  • 给公司做网站数据分析江门网站设计制作
  • 怎么做新网站安宁网站建设熊掌号
  • com是什么网站网络科技公司可以去吗
  • 抖音创作者服务平台上海seo培训中心
  • 自己做网站app甘肃网站域名申请公司
  • 电子商务网站开发的课程介绍2023年新闻摘抄
  • 合肥如何做百度的网站推广百度知道官网首页登录入口
  • 织梦网站怎么做二级域名广州做网站费用
  • 湖南的商城网站建设网站建设与管理专业就业
  • 诸城企业网站建设wordpress经典编辑器插件
  • 做视频播放网站 赚钱全国建筑网站
  • 网站建站要多少钱2021安全员证报名入口
  • 成都建设网站那家好vs2019可以做网站吗
  • 个人网站开发教程济南高新网站制作
  • 中国空间站最新进展欧泰国际物流网站
  • 做淘宝链接网站成都网站建设 3e网络