如何使用資料庫和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裡的自增ID計數器Redis
- 分散式ID系列(3)——資料庫自增ID機制適合做分散式ID嗎分散式資料庫
- Laravel 自增瀏覽數實現(資料庫 + Redis)Laravel資料庫Redis
- 面試官:資料庫自增ID用完了會怎麼樣?面試資料庫
- 全球電商獨立站商品資料庫資料庫
- 獨立遊戲開發中的物理系統遊戲開發
- 使用Redis和Java進行資料庫快取 - DZone資料庫RedisJava資料庫快取
- 自增ID的實現
- Valve正在開發《Dota自走棋》獨立版本遊戲遊戲
- 獨立開發挑戰
- 開發者探討:獨立遊戲如何衡量和定義成功遊戲
- mybatis入門程式:向資料庫中新增使用者&&自增主鍵和非自增主鍵的返回MyBatis資料庫
- 開源和雲成了資料庫的增長引擎?資料庫
- 【教你賺錢】安卓開發者如何走向獨立開發安卓
- Python全棧開發之—redis資料庫Python全棧Redis資料庫
- 雲開發資料庫又增新技能!資料庫
- Redis(1)- Redis資料庫的安裝和配置Redis資料庫
- 使用js開發資料庫JS資料庫
- 使用 thinkphp3.2.3開發的多城市、獨立二級域名論壇系統PHP
- 使用Redis和Java進行資料庫快取RedisJava資料庫快取
- 使用Xamarin開發移動應用示例——數獨遊戲(六)使用資料庫遊戲資料庫
- Mybatis通用mapper獲得insert後的資料實體的自增IDMyBatisAPP
- 任天堂官方:獨立開發者如何開發、發售Switch遊戲遊戲
- 思否獨立開發者丨@浩:選擇獨立開發的我,和大齡女青年不結婚的理由一樣
- steam獨立遊戲資料遊戲
- 數藏nft系統開發原始碼獨立部署原始碼
- 永春堂系統開發原始碼獨立部署原始碼
- IndexedDB 建立資料庫時使用自增的Key 更新資料庫遇到的問題的一點記錄Index資料庫
- Laravel 可以修改預設的自增ID開始值了Laravel
- 全球獨立開發者鼓舞人心的開發故事
- 乾貨 | 作為前端開發者如何邁向獨立開發者前端
- B站上的獨立遊戲開發者遊戲開發
- 求一個獨立模型的開發示例模型
- 程式碼生成器,自適應mysql、oracle資料庫MySqlOracle資料庫
- 自寫的使用PDO對mysql資料庫的增刪改查操作類MySql資料庫
- 獨自研發3年,雙平臺上線,我是如何從零開始做這款獨立遊戲的?遊戲
- 獨立遊戲開發是如何讓我進退兩難的?遊戲開發
- 門店預約系統開發原始碼獨立部署原始碼