国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

pathon能做網(wǎng)站開發(fā)嗎如何去推廣

pathon能做網(wǎng)站開發(fā)嗎,如何去推廣,學(xué)校自己做的網(wǎng)站需要買服務(wù)器嗎,成都網(wǎng)站建設(shè)公司有哪些內(nèi)容文章目錄 前言步驟查看結(jié)果 前言 分布式系統(tǒng)常需要全局唯一的數(shù)字作為id,且該id要求有序,twitter的SnowFlake解決了這種需求,生成了符合條件的這種數(shù)字,本文將提供一個(gè)接口獲取雪花算法數(shù)字。以下為代碼。 步驟 SnowFlakeUtils …

文章目錄

        • 前言
        • 步驟
        • 查看結(jié)果

前言
  • 分布式系統(tǒng)常需要全局唯一的數(shù)字作為id,且該id要求有序,twitter的SnowFlake解決了這種需求,生成了符合條件的這種數(shù)字,本文將提供一個(gè)接口獲取雪花算法數(shù)字。以下為代碼。
步驟
  1. SnowFlakeUtils 雪花算法工具類。

    @Slf4j
    public class SnowFlakeUtils {private static final RedisOperation REDIS_OPERATION = ApplicationContextHelper.getBean(RedisOperation.class);private static final String LOCAL_IP = getLocalIp();private static volatile SnowFlakeUtils instance;/*** 該任務(wù)開始時(shí)間,必須手動(dòng)設(shè)置(差值的唯一性)* 建議在生產(chǎn)部署時(shí)選擇某一日的0時(shí)0分0秒0毫秒的時(shí)間戳,方便計(jì)算*/private static final long START_TIME = 1588733692671L;/*** 各個(gè)位的位數(shù),Timestamp為41L(無需定義)*/private static final long DATA_CENTER_ID_BITS = 5L;private static final long WORKER_ID_BITS = 1L;private static final long SEQUENCE_BITS = 16L;/*** 各位的最大值*/private static final long DATA_CENTER_ID_MAX = ~(-1 << DATA_CENTER_ID_BITS);private static final long WORKER_ID_MAX = ~(-1 << WORKER_ID_BITS);private static final long SEQUENCE_MAX = ~(-1 << SEQUENCE_BITS);/*** 各位應(yīng)該向左移動(dòng)位數(shù)*/private static final long TIMESTAMP_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATA_CENTER_ID_BITS;private static final long DATA_CENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS;private static final long WORKER_ID_SHIFT = SEQUENCE_BITS;/*** 數(shù)據(jù)中心ID*/private final long dataCenterId;private static final String DATA_CENTER_ID = "DATACENTERID";/*** 工作線程ID*/private final long workerId;private static final String WORKER_ID = "WORKERID";/*** 序列號(hào)*/private long sequence = 0L;/*** 上次時(shí)間(保證不回退)*/private long lastTimestamp = -1L;/**** 是否在高并發(fā)下*/private boolean isClock = false;public static SnowFlakeUtils getInstance() {if (instance == null) {synchronized (SnowFlakeUtils.class) {if (instance == null) {int dataCenterId = 0;int workerId = 0;while (true) {// tryCatch保證即使redis等出現(xiàn)問題也可以保證當(dāng)前線程阻塞,重啟redis即可處理繼續(xù)處理try {String replace = RedisKeyConstant.SNOW_FLAKE_KEY.replace(DATA_CENTER_ID, String.valueOf(dataCenterId)).replace(WORKER_ID, String.valueOf(workerId));if (REDIS_OPERATION.setnx(replace, LOCAL_IP, 1, TimeUnit.MINUTES)) {instance = new SnowFlakeUtils(dataCenterId, workerId);break;}// 進(jìn)行重新set直至成功,目前只運(yùn)用dataCenterIdif (dataCenterId++ == DATA_CENTER_ID_MAX) {log.error("SnowFlake is getting CacheLock, please checkDATACENTERID_MAX={}", DATA_CENTER_ID_MAX);dataCenterId = 0;}} catch (Exception e) {log.error("SnowFlakeUtils get CacheLock Error, errorMsg:", e);try {Thread.sleep(MagicNum.THOUSAND);} catch (InterruptedException ex) {log.error(ex.getMessage(), ex);}}}}}}return instance;}public SnowFlakeUtils(long dataCenterId, long workerId) {if (dataCenterId > DATA_CENTER_ID_MAX || dataCenterId < 0) {throw new IllegalArgumentException(String.format("data center id can't be greater than %d or less than 0", DATA_CENTER_ID_MAX));}if (workerId > WORKER_ID_MAX || workerId < 0) {throw new IllegalArgumentException(String.format("worker id can't be greater than %d or less than 0", WORKER_ID_MAX));}this.dataCenterId = dataCenterId;this.workerId = workerId;String key = RedisKeyConstant.SNOW_FLAKE_KEY.replace(DATA_CENTER_ID, String.valueOf(dataCenterId)).replace(WORKER_ID, String.valueOf(workerId));log.info("SnowFlakeUtils Cache Key={}", key);// 起線程保證workerId和dataCenter組合不重復(fù)Thread thread = new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {log.debug("SnowFlakeUtils is keep geting CacheLock-{}", key);String localIp = REDIS_OPERATION.get(key);if (LOCAL_IP.equals(localIp)) {REDIS_OPERATION.setex(key, LOCAL_IP, 1, TimeUnit.MINUTES);} else if (!REDIS_OPERATION.setnx(key, LOCAL_IP, 1, TimeUnit.MINUTES)) {throw new ProcessException(CommonConstants.ENUM_PROCESSING_EXCEPTION,"SnowFlakeUtils losed CacheLock-" + key + "." +"CacheLockKeeperThread broken!" +"Reday to retrieve CacheLock and Single Instance!");}Thread.sleep(MagicNum.FIFTY * MagicNum.THOUSAND);} catch (Exception e) {// 發(fā)生異常 將單例清除 并退出循環(huán)結(jié)束子線程synchronized (SnowFlakeUtils.class) {instance = null;}log.error(e.getMessage(),e);break;}}}});thread.setName("SnowFlake-CacheLockKeeper-" + dataCenterId + "-" + workerId);thread.start();}public void setClock(boolean clock) {this.isClock = clock;}public synchronized long nextId() {long timestamp = this.getTime();if (timestamp < lastTimestamp) {long offset = lastTimestamp - timestamp;if (offset <= MagicNum.FIVE) {try {this.wait(offset << 1);timestamp = this.getTime();if (timestamp < lastTimestamp) {throw new RuntimeException(String.format("Clock moved backwards, Refusing to generate id for %d milliseconds", offset));}} catch (InterruptedException e) {log.error(e.getMessage(), e);}} else {throw new RuntimeException(String.format("Clock moved backwards, Refusing to generate id for %d milliseconds", offset));}}if (lastTimestamp == timestamp) {sequence = sequence + 1;if (sequence > SEQUENCE_MAX) {timestamp = tilNextMillis(timestamp);sequence = 0;}} else {sequence = 0;}lastTimestamp = timestamp;return ((timestamp - START_TIME) << TIMESTAMP_SHIFT) |(dataCenterId << DATA_CENTER_ID_SHIFT) |(workerId << WORKER_ID_SHIFT) |sequence;}/*** 該毫秒達(dá)到上限,等待到下1毫秒*/private long tilNextMillis(long timestamp) {while (getTime() <= timestamp) {log.debug("單毫秒主鍵生成達(dá)到上限");}return this.getTime();}private long getTime() {if (isClock) {return SystemClock.currentTimeMillis();} else {return System.currentTimeMillis();}}private static String getLocalIp() {String ip = "";try {InetAddress addr = InetAddress.getLocalHost();ip += addr.getHostAddress();} catch (Exception e) {ip += "127.0.0.1";}ip += "_" + System.currentTimeMillis() + "_" + Math.random();log.info("SnowFlakeUtils Cache Value={}", ip);return ip;}
    }
    
  2. SystemClock工具類。

    /*** 由于高并發(fā),在同一毫秒中會(huì)多次獲取currentTimeMillis,而每次使用System.currentTimeMillis都會(huì)占用CPU(native方法).* 于是自定義類(single)來獲取currentTimeMillis,實(shí)現(xiàn)方法是在此類中定義時(shí)間并設(shè)置一個(gè)周期任務(wù)(定時(shí)線程)1毫秒更新類中的時(shí)間*/
    public final class SystemClock {private static final SystemClock INSTANCE = new SystemClock(1);public static SystemClock getInstance() {return INSTANCE;}/*** 更新時(shí)間的時(shí)間間隔,默認(rèn)為1毫秒*/private final long period;/*** 當(dāng)前時(shí)間*/private final AtomicLong now;private SystemClock(long period) {this.period = period;this.now = new AtomicLong(System.currentTimeMillis());scheduleClockUpdate();}/*** 定時(shí)任務(wù)(設(shè)置為守護(hù)線程,1毫秒后開始更新)* scheduleAtFixedRate: 每次開始間隔為1毫秒* scheduleWithFixedDelay: 每次結(jié)束與開始為1毫秒*/private void scheduleClockUpdate() {ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {@Overridepublic Thread newThread(Runnable r) {Thread thread = new Thread(r, "System Clock");thread.setDaemon(true);return thread;}});executorService.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {now.set(System.currentTimeMillis());}}, period, period, TimeUnit.MILLISECONDS);}public static long currentTimeMillis() {return getInstance().now.get();}
    }
    
  3. ApplicationContextHelper Spring上下文工具類。

    @Slf4j
    @Component
    public class ApplicationContextHelper implements ApplicationContextAware {
    /**
    * Spring上下文
    */
    private static ApplicationContext applicationContext;/*** @return ApplicationContext*/public static ApplicationContext getApplicationContext() {return applicationContext;}/*** 獲取ApplicationContextAware**/@Overridepublic void setApplicationContext(ApplicationContext applicationContext) {ApplicationContextHelper.applicationContext = applicationContext;}/*** 根據(jù)Class獲取對應(yīng)實(shí)例**/public static <T> T getBean(Class<T> clz) {return applicationContext.getBean(clz);}/*** 根據(jù)beanName獲取對應(yīng)實(shí)例*/public static <T> T getBean(String name, Class<T> requiredType) {return applicationContext.getBean(name, requiredType);}public static Object getBean(String name) {return applicationContext.getBean(name);}
    }
    
  4. RedisOperation獲取 RedisOperation,Redis操作工具類。

  5. 在Controller里編寫接口,測試結(jié)果。

    @RestController
    @RequestMapping("/part/util")
    public class UtilController {@ApiOperation("獲取雪花數(shù)字")@GetMapping("/getSnowFlakeNo")public Result getSnowFlakeNo() {return Result.ok().data(String.valueOf(SnowFlakeUtils.getInstance().nextId()));}
    }
    
查看結(jié)果
  • 啟動(dòng)項(xiàng)目,有postman訪問接口,查看結(jié)果如下,返回結(jié)果中data的值即為雪花算法數(shù)字。
    在這里插入圖片描述
http://m.aloenet.com.cn/news/33512.html

相關(guān)文章:

  • 做網(wǎng)站能成功嗎產(chǎn)品策劃方案怎么做
  • 網(wǎng)站開發(fā)方倍工作室中山seo推廣優(yōu)化
  • 門戶網(wǎng)站 建設(shè)最近的新聞?dòng)心男?/a>
  • 廣州做網(wǎng)站的網(wǎng)絡(luò)公司新聞株洲最新
  • 門戶網(wǎng)站建設(shè)情況西地那非片的功能主治
  • 機(jī)械加工怎么找客戶seo快速排名是什么
  • 做電影網(wǎng)站還能賺錢seo在線優(yōu)化技術(shù)
  • 湖南高端網(wǎng)站制百度地圖關(guān)鍵詞優(yōu)化
  • 易企秀怎么做招聘網(wǎng)站超鏈接全國疫情的最新數(shù)據(jù)
  • 常州做網(wǎng)站公司哪家好廣東做seo的公司
  • 西寧微網(wǎng)站建設(shè)拉新充場app推廣平臺(tái)
  • 論述政府門戶網(wǎng)站建設(shè)的基本意義百度優(yōu)化大師
  • phpcms手機(jī)網(wǎng)站長沙百度推廣運(yùn)營公司
  • 做網(wǎng)站為什么要買網(wǎng)站空間百度的seo排名怎么刷
  • 網(wǎng)站設(shè)計(jì)策劃書 模板營銷號(hào)
  • 做直播網(wǎng)站軟件有哪些軟件下載海外域名
  • 哪種源碼做視頻網(wǎng)站好用知乎軟文推廣
  • 一臺(tái)電腦主機(jī)做網(wǎng)站國際新聞最新消息十條
  • 怎么做類似清風(fēng)dj網(wǎng)站自己做一個(gè)網(wǎng)站
  • 互聯(lián)網(wǎng)信息服務(wù)許可證做優(yōu)化關(guān)鍵詞
  • 開遠(yuǎn)市住房和城鄉(xiāng)建設(shè)局網(wǎng)站網(wǎng)絡(luò)營銷的特點(diǎn)主要包括什么
  • 小程序官方開發(fā)文檔沈陽企業(yè)網(wǎng)站seo公司
  • wordpress配置cdn緩存規(guī)則博客可以做seo嗎
  • 怎么用python做網(wǎng)站網(wǎng)絡(luò)運(yùn)營工作內(nèi)容
  • 廣東兩學(xué)一做考試網(wǎng)站今天的病毒感染情況
  • 有趣的網(wǎng)站設(shè)計(jì)最新百度關(guān)鍵詞排名
  • 深圳住建網(wǎng)站專業(yè)網(wǎng)絡(luò)推廣機(jī)構(gòu)
  • 電腦個(gè)人網(wǎng)站怎么做外貿(mào)建站
  • 做天貓還是做網(wǎng)站推廣怎么開通百度推廣賬號(hào)
  • 重慶設(shè)計(jì)公司網(wǎng)站宣傳營銷方式有哪些