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

夺宝网站开发咖啡网页设计

夺宝网站开发,咖啡网页设计,设计师接私单网站,jsp网站建设项目实战课本内容祝大家新年快乐#xff0c;有任何问题可与我联系#xff1a;关于snowflake算法的介绍和原理这里不过多说明了#xff0c;网上有很多。这里简单描述下SnowflakeUtil的优点#xff1a;1、做为底层工具使用#xff0c;可用于数据库主键、订单编号……2、不依赖数据库#xf…祝大家新年快乐有任何问题可与我联系关于snowflake算法的介绍和原理这里不过多说明了网上有很多。这里简单描述下SnowflakeUtil的优点1、做为底层工具使用可用于数据库主键、订单编号……2、不依赖数据库速度快3、可有序生成4、可分布式部署当然缺点也是有的我相信看了下面SnowflakeUtil的朋友自然能够明白。下面是SnowflakeUtil类的代码package cn.yyjjssnn.utils;/*** 本类主要用于生成主键ID方法参考twitter的SnowFlake。* SnowFlake的优点是整体上按照时间自增排序* 并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分)并且效率较高。* SnowFlake的示例结构如下(每部分用-分开)* 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 * 1位标识由于long基本类型在Java中是带符号的最高位是符号位正数是0负数是1所以id一般是正数最高位是0* 41位时间截(毫秒级)注意41位时间截不是存储当前时间的时间截而是存储时间截的差值(当前时间截 - 开始时间截得到的值)* 这里的的开始时间截一般是我们的id生成器开始使用的时间由我们程序来指定的(如下下面程序SnowflakeIdUtil类的twepoch属性)。* 41位的时间截可以使用69年年T (1L 41) / (1000L * 60 * 60 * 24 * 365) 69* 10位的数据机器位可以部署在1024个节点包括5位datacenterId和5位workerId可以合在一起使用也可以分开使用* 12位序列毫秒内的计数12位的计数顺序号支持每个节点每毫秒(同一机器同一时间截)产生4096个ID序号* 加起来刚好64位为一个Long型。*/public class SnowflakeUtil {/** 序列id所占的位数 支持每毫秒产生1024个id序号 */private final long sequenceBits 10L;/** 机器id所占的位数 支持256台机器 */private final long workerIdBits 8L;/** 区域id所占的位数 支持32个区域(即支持最大机器数为256*328192) */private final long datacenterIdBits 5L;/** 开始时间截 (2018-01-01 00:00:00) 可使用至2052年 */private final long twepoch 1514736000000L;/** 机器id左移位 */private final long workerIdShift sequenceBits;/** 区域id左移位 */private final long datacenterIdShift sequenceBits workerIdBits;/** 时间截左移位 */private final long timestampLeftShift sequenceBits workerIdBits datacenterIdBits;/** 生成序列的掩码 */private final long sequenceMask -1L ^ (-1L sequenceBits);/** 支持的最大机器id */private final long maxWorkerId -1L ^ (-1L workerIdBits);/** 支持的最大区域id */private final long maxDatacenterId -1L ^ (-1L datacenterIdBits);/** 当前毫秒内序列 */private long sequence 0L;/** 当前机器id */private long workerId;/** 当前区域id */private long datacenterId;/** 上次生成ID的时间截 */private long lastTimestamp -1L;/** 一台机子只需要一个实例以保证产生有序的、不重复的ID */private static SnowflakeUtil snowflakeUtil new SnowflakeUtil();private SnowflakeUtil() {// 设置workerId和datacenterId// TODO workerId和datacenterId可以通过数据库、配置文件、缓存等方式获取这里为方便演示默认都设置为0long workerId 0;long datacenterId 0;if (workerId maxWorkerId || workerId 0) {throw new IllegalArgumentException(String.format(workerId(%d)设置错误, maxWorkerId));}if (datacenterId maxDatacenterId || datacenterId 0) {throw new IllegalArgumentException(String.format(datacenterId(%d)设置错误, maxDatacenterId));}this.workerId workerId;this.datacenterId datacenterId;}public static SnowflakeUtil getInstance() {return snowflakeUtil;}/*** 获得下一个ID (该方法是线程安全的)* return SnowflakeId*/public synchronized long nextId() {long timestamp timeGen();// 如果当前时间小于上一次ID生成的时间戳说明系统时钟回退过这个时候应当抛出异常// 也就是说当应用运行时是不能将时钟改小的要么异常退出要么ID重复if (timestamp lastTimestamp) {throw new RuntimeException(String.format(系统时钟回退%d秒, lastTimestamp - timestamp));}// 如果是同一时间生成的则进行毫秒内序列if (lastTimestamp timestamp) {sequence (sequence 1) sequenceMask;// 毫秒内序列溢出if (sequence 0) {// 阻塞到下一个毫秒,获得新的时间戳timestamp tilNextMillis(lastTimestamp);}}// 时间戳改变毫秒内序列重置else {sequence 0L;}// 上次生成ID的时间截lastTimestamp timestamp;// 移位并通过或运算拼到一起组成64位的IDreturn ((timestamp - twepoch) timestampLeftShift) //| (datacenterId datacenterIdShift) //| (workerId workerIdShift) //| sequence;}/*** 阻塞到下一个毫秒直到获得新的时间戳* param lastTimestamp 上次生成ID的时间截* return 当前时间戳*/protected long tilNextMillis(long lastTimestamp) {long timestamp timeGen();while (timestamp lastTimestamp) {timestamp timeGen();}return timestamp;}/*** 返回以毫秒为单位的当前时间* return 当前时间(毫秒)*/protected long timeGen() {// 考虑到当前系统时钟不准确以及修改时钟产生的ID问题// 这里可以根据自身业务使用网络时钟或其他更加准确及稳定的时钟return System.currentTimeMillis();}}下面是测试代码package cn.yyjjssnn.utils;import java.util.Hashtable;import java.util.Map;public class SnowflakeUtilTest {public static void main(String[] args) {// 模拟多线程同时获取IDfor (int i 0; i 100; i) {new SnowflakeUtilTestThread(线程 i).start();}}}class SnowflakeUtilTestThread extends Thread {private static Map existId new Hashtable();public SnowflakeUtilTestThread(String name) {super(name);}Overridepublic void run() {for (int i 0; i 1000; i) {long id SnowflakeUtil.getInstance().nextId();if (existId.containsKey(id )) {throw new RuntimeException(ID重复);}existId.put(id , id);System.out.println(getName() 获取ID id 当前ID总数 existId.size());}}}下面是测试结果……线程1获取ID63578301855170593当前ID总数99962线程73获取ID63578301855170596当前ID总数99965线程73获取ID63578301855170598当前ID总数99967线程47获取ID63578301855170595当前ID总数99964线程73获取ID63578301855170599当前ID总数99968线程1获取ID63578301855170597当前ID总数99966线程73获取ID63578301855170601当前ID总数99970线程73获取ID63578301855170602当前ID总数99971线程73获取ID63578301855170603当前ID总数99972线程73获取ID63578301855170604当前ID总数99973线程73获取ID63578301855170605当前ID总数99974线程73获取ID63578301855170606当前ID总数99975线程73获取ID63578301855170607当前ID总数99976线程73获取ID63578301855170608当前ID总数99977线程73获取ID63578301855170609当前ID总数99978……线程73获取ID63578301855170626当前ID总数99995线程73获取ID63578301855170627当前ID总数99996线程73获取ID63578301855170628当前ID总数99997线程73获取ID63578301855170629当前ID总数99998线程73获取ID63578301855170630当前ID总数99999线程73获取ID63578301863559168当前ID总数100000~谢谢打赏~手机请长按图片~赞 赏
http://www.pierceye.com/news/182881/

相关文章:

  • 怎么搭建小程序平台网站营销优化
  • 建设网站员工招聘策划方案软件开发的八个步骤
  • 怎样做cms电影网站赚钱网络营销需要学什么
  • wordpress快速仿站视频教程没有备案的网站会怎么样
  • 美团先做网站还是app惠州惠阳网站建设
  • 可以更改上传到网站的文件内容吗信用 网站 建设方案
  • 获奖设计网站公司制作网站价格表
  • 做单页免费模板网站我是做推广的怎么找客户
  • 企业网站建设的缺点网络营销最基本的应用方式是什么
  • 做cpa推广用哪种网站好上海h5网站开发
  • 怎样做免费网站推广怎么申请二级域名
  • 站长之家源码之家虚拟空间官网
  • 网站建设推荐书籍装修公司装修房子
  • 上海专业微信网站开发公司怎么做seo
  • 上海市质量工程建设管理协会网站网站后台源码
  • 淄博机关建设网站免费发布企业信息平台
  • 怎么注册网站免费的怎么给网站备案
  • 新公司 做网站 流程西安房价
  • 展厅设计软件珠海百度快速优化
  • 网站 关键词 地区seo对网络推广的作用是什么?
  • 网站建设 知乎wordpress woocommerce主题
  • 申请建设工作网站的函如何做网站词库
  • 化工集团网站建设 中企动力网站建设用的服务器
  • wow做宏的网站重庆网址大全
  • 网站建设试题 jsp炎陵做网站
  • 购物网站前台功能模块怀孕单子图片在线制作
  • 做百度推广和企业网站那个有效果吗互动的网站
  • 织梦网站后台怎么登陆磁力兔子搜索引擎
  • wordpress建站必须选择主题磁力引擎
  • 主流网站 技术做爰的网站