論大資料倉庫的事務處理之法
李萬鴻2020-10-25
這是一個大資料時代,幾乎所有的好產品都離不開大資料的支持,人工智能更是如此,那么,建立資料倉庫并使用其中的大資料有何困難呢?那就是事務問題,大資料一般是OLAP,而非OLTP,不具備事務管理功能,但實際使用時存在實時更新資料何查詢資料的場景,因此,事務是必不可少的,這個給出一個簡單的辦法加以解決,
一.加鎖原理和方法
Reids的redLock可以提供分布式鎖,可以用來簡單巧妙解決大資料的事務問題,對基于HIve、Clickhouse等大資料倉庫,如果同時讀寫,可以采用RedLock進行事務控制,RedLock對某個操作提供分布式鎖,對SQL陳述句中的執行加鎖,如果寫如資料庫時,就不讓讀取資料,反之依然,
對于事務要求不高的場景來說,這是夠用的,畢竟,大資料倉庫不存在過于頻繁的寫入,大多是讀取資料,所以這個方案是夠用的,
舉個例子,當根據資料庫log實時ETL某個資料后,就需要對資料倉庫DW進行更新,并更新DM主體資料庫,而此時業務應用正在讀取DM或DW的資料,為此,可以在更新寫入DW、DM時加個鎖,完畢后洗掉鎖,讀取資料時首先取鎖,如果可以獲取,就讀資料,否則就等待,直到寫入程式洗掉鎖,才能獲取鎖,并完成讀取,然后洗掉鎖,寫入也一樣,需要先獲取鎖才能完成寫入,否則需要等待讀取完成并洗掉了鎖,才可以拿到鎖并進行寫入,完成后洗掉鎖,讓其他程式可以寫入或讀取資料,
二.關鍵代碼
@Slf4j
public class RedLockDemo {
public static void main(String[] args) {
//連接redis
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
RedissonClient redisson = Redisson.create(config);
log.info("連接Redis");
//1.定義鎖
RLock lock = redisson.getLock("myTest001");
try {
//嘗試加鎖的超時時間
Long timeout = 300L;
//鎖過期時間
Long expire = 30L;
//2.獲取鎖
if (lock.tryLock(timeout, expire, TimeUnit.MILLISECONDS)) {
//2.1.獲取鎖成功的處理
log.info("加鎖成功");
//...do something read or write dw 、 dm
log.info("使用完畢");
} else {
//2.2.獲取鎖失敗的處理
log.info("加鎖失敗");
log.info("其他處理");
}
} catch (InterruptedException e) {
log.error("嘗試獲取分布式鎖失敗", e);
} finally {
//3.釋放鎖
try {
lock.unlock();
log.info("鎖釋放成功");
} catch (Exception e) {
//do nothing...
}
}
//關閉連接
redisson.shutdown();
log.info("關閉redis連接");
}
}
三.不需要鎖的情況
當沒有寫入只有讀取的時候不需要鎖,或只有寫入沒有讀取的時候也不需要鎖,為此需要加個判斷量Flag,放在Redis,首先設為1表示讀,2表示寫,程式寫或讀的時候先取這個變數Flag,如果是讀,而flag=1,就不需要鎖;else flag=2 ,就需要拿鎖,寫的時候與此類似,如果是寫,而flag=2,就不需要鎖;else flag=1 ,就需要拿鎖,
這樣可以減少用鎖,提高效率,
總之,大資料倉庫的事務是不能忽視的,加RedLock鎖是一個簡單巧妙的解決辦法,可以一試,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/193771.html
標籤:其他
上一篇:使用mvn deploy命令上傳jar包到nexus私服
下一篇:sql 中如何將千分號數值,轉化成decimal型,或int型計算。如何對列值進行處理,如果是中文就是0,如果是數值就是數值
