1. 程式人生 > >使用redis生成資料庫主鍵自增

使用redis生成資料庫主鍵自增

資料庫自增什麼的麻煩死了,尤其是往後還需要考慮到分散式處理,然後偷了個懶,直接redis來搞起...

下面上程式碼

先定義個主鍵生成策略介面,往後方便擴充套件

/**
 * 定義主鍵生成策略介面,以便修改擴充套件
 * @author LeiYong
 *
 */
public interface KeyGenerate {
	/**
	 * 生成String型別主鍵
	 * @param em
	 * @return
	 */
	public String generateStringKey(KeyGenerateEnum em);
	/**
	 * 生成long型別主鍵
	 * @param em
	 * @return
	 */
	public Long generateLongKey(KeyGenerateEnum em);
}




接下來提供一個替補隊員,基礎的主鍵生成方案,採用隨機數(Long)或UUID(String)方式生成
/**
 * 基礎主鍵生成策略,採用隨機數或UUID+隨機數
 * @author LeiYong
 *
 */
public class BaseKeyGenerate implements KeyGenerate{
	@Override
	public String generateStringKey(KeyGenerateEnum em) {
		return StringUtil.getUUID()+StringUtil.getNonceStr(6);
	}
	@Override
	public Long generateLongKey(KeyGenerateEnum em) {
		return System.currentTimeMillis()*1000000+NumberUtil.random(6);
	}
}



主角Redis的快取主鍵類登場
/**
 * 採用Redis的方式產生自增長主鍵
 * @author LeiYong
 *
 */
public class RedisKeyGenerate implements KeyGenerate{
	/**
	 * Logger for this class
	 */
	private final Logger logger = LoggerFactory.getLogger(RedisKeyGenerate.class);

	private final String SEQUENCE_KEY = "SEQ";
	@Autowired
	@Qualifier("redisClientSupport")
	private RedisClientSupport redisClientSupport;
	
	@Override
	public String generateStringKey(KeyGenerateEnum em) {
		Long key = generateLongKey(em);
		if (key!=null) {
			return key.toString();
		}
		//為了防止redis掛了程式能夠繼續執行
		return new BaseKeyGenerate().generateStringKey(em);
	}

	@Override
	public Long generateLongKey(KeyGenerateEnum em) {
		synchronized (em) {
			try {
				Long key = redisClientSupport.incrementHash(SEQUENCE_KEY, em.name(), 1l);
				if (key != null) {
					return key;
				}
			} catch (CacheAccessException e) {
				logger.warn("generateStringKey(KeyGenerateEnum) - exception ignored", e); //$NON-NLS-1$
			}
		}
		//為了防止redis掛了程式能夠繼續執行
		return new BaseKeyGenerate().generateLongKey(em);
	}

}


好了,大功告成,另外使用到了列舉,定義非常簡單的列舉就可以了,還是上個程式碼吧...避免有人不知道列舉,隨便舉個例子,免得透露了公司資料表,保持列舉名稱跟Model類一致即可,往後將說明如何為所有方法的新增自動設定主鍵,領導再也不用擔心新來的小夥伴來問公司主鍵怎麼生成了,直接說句不需要生成,瞬間高大上,秀他一臉,讓他懵逼...
借用Redis生成主鍵實現所有類新增不再需要手動配置主鍵,序列什麼的通通GG

public enum KeyGenerateEnum {
	ActAttend,
	ActRecommendDetail,ActType,
	LogLogin
}

最後註明一點,為了方便變更,請在spring中配置bean,以便自動注入及未來方案修改

	<bean id="keyGenerate" class="com.cykj.base.core.key.RedisKeyGenerate">
	</bean>


相關推薦

使用redis生成資料庫主

資料庫自增什麼的麻煩死了,尤其是往後還需要考慮到分散式處理,然後偷了個懶,直接redis來搞起... 下面上程式碼 先定義個主鍵生成策略介面,往後方便擴充套件 /** * 定義主鍵生成策略介面,以便修改擴充套件 * @author LeiYong * */ pu

db2 資料庫主

DBeaver中,主鍵自增無法勾選,可通過建表語句實現自增。 在自增的column後新增如下語句 GENERATED ALWAYS AS IDENTITY (      START WITH&

Oracle用觸發器實現插入資料

一篇:首先,你要有一張表!CREATE TABLE example(ID Number(4) NOT NULL PRIMARY KEY,NAME VARCHAR(25),PHONE VARCHAR(10),ADDRESS VARCHAR(50));然後,你需要一個自定義的se

Mycat之資料庫主增長(資料庫增長的方式)-yellowcong

我們先來通過mycat實現一個自增長的主鍵,現在有兩個資料庫,mycat和mycat2,然後設定資料庫增長的方式,按照自增長的方式實現。自增長實現步驟:1、建立資料庫,2、建立mycat的自增長函式,3、插入需要自增長策略,4、配置schemal.xml,

Mycat之資料庫主增長(本地時間戳方式)-yellowcong

本地時間的方式,id自動生成的策略ID= 64 位二進位制 (42(毫秒)+5(機器 ID)+5(業務編碼)+12(重複累加),這個本地時間戳的方式是mycat預設的,所以大家在配置的時候,確認一下自己server.xml中的sequnceHandlerT

postgresql 主,以及mybaits 逆向生成

com cli reat 包圖 ble rem default cti password 1、postgresql 主鍵自增 表 event start with 設置起始值 CREATE SEQUENCE event_id_seq START WITH 1

建立一張Oracle主和帶有預設值的資料

0 在建立表前修改一下系統預設時間格式 alter session set nls_date_format = 'yyyy-mm-dd'; 1 建立一個表 CREATE TABLE user_record( ID NUMBER(11) NOT NULL PRIMA

mybatis插入資料時返回的主

mybatis有一個方便的功能就是在插入資料後返回插入的記錄主鍵,設定非常方便,一共有兩種方式,推薦使用第一種 第一種: <insert id="createBook" parameterType="book" useGeneratedKeys="true" keyProperty="

oracle實現插入資料時主

在看ORACLE_PL/SQL例項精解的時候用到了student表,需要自己建立。 1  首先是建表語句 create table student ( student_id number(8) not null primary key, --主鍵列 fi

MySQL資料表中怎麼給已經有主的表加入資料

MySQL資料庫表中有自增主鍵ID,當用SQL插入語句中插入語句帶有ID列值記錄的時候; 如果指定了該列的值,則新插入的值不能和已有的值重複,而且必須大於其中最大的一個值; 也可以不指定該列的值,只將其他列的值插入,讓ID還是按照MySQL自增自己填 具體如下: cre

MyBatis+Oracle用foreach標籤實現批量插入資料以及主

1.前言          最近做一個批量匯入影像的需求,將多條記錄批量插入資料庫中。解決思路:在程式中封裝一個List集合物件,然後把該集合中的實體插入到資料庫中,因為專案使用了MyBatis,所以打算使用MyBatis的foreach功能進行批量插入。資料庫用的是Ora

Oracle資料庫主生成的兩種解決方案

解決方案一:使用序列和觸發器實現(推薦) 1、建立資料庫表 設定主鍵 create table Test_Table(   id number(10) primary key, /*主鍵,自動增加*

【Java】sql實現插入,插入值的主,防止遷移資料時報主衝突的錯誤;

一、問題 我們要自己造一些測試資料,並且這些SQL指令碼要遷移到其他環境,遷移過程中,如果主鍵寫死,在其他環境,可能會出現主鍵衝突;所以,我們要寫活的主鍵,實現起來也很簡單; 二、解決方法 insert into userInfo(id,name,age)val

用註解的方式實現Mybatis插入資料時返回的主Id

一、背景 我們在資料庫表設計的時候,一般都會在表中設計一個自增的id作為表的主鍵。這個id也會關聯到其它表的外來鍵。 這就要求往表中插入資料時能返回表的自增id,用這個ID去給關聯表的欄位賦值。下面講一下如何通過註解的方式實現插入資料時返回自增Id。 二、

SSM】之MyBatis插入資料後獲取

        很多時候,我們都需要在插入一條資料後回過頭來獲取到這條資料在資料表中的自增主鍵,便於後續操作。針對這個問題,有兩種解決方案: (1)先插入,後查詢。我們可以先插入一條資料,然後根據插入的資料的各個欄位值,再次訪問資料庫,從資料庫中將剛剛插入的資料查詢出來。當

mybatis插入ID的資料後返回的ID

開發中碰到使用者註冊的功能需要用到使用者ID,但是使用者ID是資料庫自增生成的,這種情況上網查詢後使用下面的方式配置mybatis的insert語句可以解決  <insert id="insert" keyProperty="id" useGeneratedKeys=

Mybatis插入操作 主 返回成功 但是資料庫沒有資料

如果插入的操作返回成功,但是資料庫沒有資料,一般情況下是因為事務。 下面我們來大概分析下MyBatis。 在MyBatis的配置檔案中: <environments default="devel

sql中,如何得到新增資料的id(主

我們在專案中常常遇到這種情況,想得到剛剛新插入資料庫那條記錄的id,語法如下: INSERT   INTO [soloreztest]   ([name])   output inserted.id   VALUES   ('solorez') 例如: in

MSSQL 對已有資料表新增

最近運維線上檢查,發現線上有個表沒有主鍵標識。需要新增主鍵,我看了下大概十萬左右的資料,現有資料重複率較高,無法對現有列直接新增主鍵,所以需要加一列無意義的主鍵標識。根據主鍵欄位型別找了兩種方式。 1. 主鍵為int 或者bigint ALTER TABLE Atest

程式控制資料庫主生成

主鍵的生成規則:日期(8)+型別(2)+序列(10) 第一個程式 /* *@(#)SequenceControl.java 2015年5月19日 * *Copyright 2015 Cbo,All rights reserved. */ package com.te