如何使用資料庫和Redis開發各系統獨立的自增ID生成器
在分散式系統,需要生成唯一ID的系統不止一個,這些ID的生成在各自業務內是獨立的,同時包含業務規則,如果要利用資料庫自增主鍵生成唯一ID,需要每個業務部門建立一張表來為唯一ID服務。 |
而因為Redis的高效能和單執行緒特性,使它在這方面有獨特的優勢。
為了解決各個系統獨自生成自增的唯一ID的需求,而又實現簡單有效,做了如下設計。
各系統獨立的自增ID生成器
資料庫設計(mysql)
DROP TABLE IF EXISTS sys_id_record; CREATE TABLE sys_id_record( id INT UNSIGNED AUTO_INCREMENT, sys_id VARCHAR(40) NOT NULL COMMENT '子系統ID', sys_name VARCHAR(100) NOT NULL COMMENT '子系統名稱', id_from INT NOT NULL DEFAULT 1 COMMENT '子系統ID起始值', lenth SMALLINT NOT NULL DEFAULT 10 COMMENT '子系統ID長度', enabled VARCHAR(1) NOT NULL DEFAULT 'Y', created_by VARCHAR(40) NOT NULL COMMENT '建立人', created_date DATETIME COMMENT '建立時間', updated_by VARCHAR(40) NOT NULL COMMENT '更新人', updated_date DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間', PRIMARY KEY ( id ) )ENGINE=INNODB DEFAULT CHARSET=utf8;
主要程式碼
定義服務介面
package com.davidwang456.test; public interface IDGenerateService { String getIDGenerateBySys(String sysId); }
介面服務實現
package com.davidwang456.test; import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; @Service public class IDGenerateServiceImpl implements IDGenerateService { @Autowired private SysIdRecordDao sysIdRecordDao; @Autowired private RedisTemplate redisTemplate; @Override public String getIDGenerateBySys(String sysId) { init(sysId); Object idSys=redisTemplate.opsForList().rightPop(sysId); if(idSys==null) { Listrecords=sysIdRecordDao.getEnabledSysIdRecord(sysId); if(records!=null&&records.isEmpty()) { SysIdRecord record=records.get(0); Listbuf_ids=new ArrayList<>(); for(int i=1;i<1record.getlenth+1;i++) {="" buf_ids.add(record.getidfrom+i);="" }="" redistemplate.opsforlist().leftpushall(sysid,="" buf_ids);="" record.setidfrom(record.getidfrom()+record.getlenth());="" sysidrecorddao.save(record);="" idsys="redisTemplate.opsForList().rightPop(sysId);" return="" sysid+":"+idsys;="" private="" void="" init(string="" sysid)="" if(!redistemplate.haskey(sysid))="" listrecords=sysIdRecordDao.getEnabledSysIdRecord(sysId); if(records==null||records.isEmpty()) { SysIdRecord record=new SysIdRecord(); //TODO sysIdRecordDao.save(record); } } } }
總結
這個設計的核心思想是資料庫控制各個子系統的起始值和步長,然後將值放到redis佇列中,從佇列中依此取值。當從redis中消耗掉後再次從資料庫中取一批值,依此迴圈。
原文地址:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2716475/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【redis】使用redis RedisAtomicLong生成自增的ID值Redis
- mysql 資料庫自增id 的總結MySql資料庫
- 全球電商獨立站商品資料庫資料庫
- 獨立開啟Oracle的Standby庫Oracle
- Laravel 自增瀏覽數實現(資料庫 + Redis)Laravel資料庫Redis
- 獨立開發挑戰
- Valve正在開發《Dota自走棋》獨立版本遊戲遊戲
- 關於資料庫的資料獨立性及三層模式資料庫模式
- 【教你賺錢】安卓開發者如何走向獨立開發安卓
- 如何實現Redis裡的自增ID計數器Redis
- 任天堂官方:獨立開發者如何開發、發售Switch遊戲遊戲
- 數藏nft系統開發原始碼獨立部署原始碼
- 永春堂系統開發原始碼獨立部署原始碼
- 使用 thinkphp3.2.3開發的多城市、獨立二級域名論壇系統PHP
- 使用Xamarin開發移動應用示例——數獨遊戲(六)使用資料庫遊戲資料庫
- 求一個獨立模型的開發示例模型
- 資料庫和開發行業中的IDE工具資料庫行業IDE
- mybatis入門程式:向資料庫中新增使用者&&自增主鍵和非自增主鍵的返回MyBatis資料庫
- 門店預約系統開發原始碼獨立部署原始碼
- 雲開發資料庫又增新技能!資料庫
- 開源和雲成了資料庫的增長引擎?資料庫
- 使用 mock.js 讓前端開發與後端獨立MockJS前端後端
- 什麼工具可以採集獨立站點資料?如何分析資料?
- 全球獨立開發者鼓舞人心的開發故事
- 使用js開發資料庫JS資料庫
- Redis實現sequence功能自增idRedis
- MyBatis 返回(批次)新增資料的自增idMyBatis
- 使用Redis和Java進行資料庫快取 - DZone資料庫RedisJava資料庫快取
- 獨立開發者如何開發出熱門好評Quest VR遊戲VR遊戲
- Redis(1)- Redis資料庫的安裝和配置Redis資料庫
- 網站是如何「看到」使用者的:獨立IP與cookie和Session網站CookieSession
- 七人拼團系統開發原始碼獨立部署原始碼
- 又一巨頭為資料庫業務註冊獨立公司資料庫
- Hive安裝(本地獨立模式,MySql為後設資料庫)Hive模式MySql資料庫
- 思否獨立開發者丨@浩:選擇獨立開發的我,和大齡女青年不結婚的理由一樣
- 開源了我獨立開發的評論元件 SaaS ? ?元件
- Python全棧開發之—redis資料庫Python全棧Redis資料庫
- 使用Redis和Java進行資料庫快取RedisJava資料庫快取