背景
目前課時(shí)是沒有類型的我們希望針對(duì)課時(shí)增加類型的區(qū)分并且控制比例(例如: TRIAL / MAJOR = 3 / 1)
要求
- 不通過數(shù)據(jù)庫記錄已存在的課時(shí)類型信息
- 要保證增加 1 課時(shí)后,之前的課時(shí)類型盡量保持不變
- 當(dāng)類型占比設(shè)置發(fā)生變化時(shí)讲弄,數(shù)據(jù)移動(dòng)最小
結(jié)論
選用第 4 種方案目前測試結(jié)果第 3邮弹、4 種方案效果較好伺帘,但從簡易實(shí)現(xiàn)程度和比例控制來看躲叼,選用第 4 種方案更佳蔬捷。
劃分方案
1. 按時(shí)間順序劃分
弊端
- 按時(shí)間順序分:時(shí)間不均衡,可能導(dǎo)致 TRIAL 課集中在前幾天厉亏,后面兩天想約 TRIAL 約不到
2. 按時(shí)間均分
弊端
- 按時(shí)間均分: 比例調(diào)整后董习,劃分位置變動(dòng)較大
以下兩種方式是通過對(duì)
課時(shí)信息的 Time 字段
進(jìn)行 HASH 并排序后進(jìn)行類型劃分好處: 可以盡量保證新課時(shí)加入集合中后,集合中已存在的課時(shí)類型變化最小
3. 通過一致性 Hash 環(huán)劃分
什么是 一致性 Hash 環(huán)爱只?一致性哈希算法
占比之和等于總節(jié)點(diǎn)數(shù)
皿淋,比如 TRIAL / MJAOR 為 3 / 1
, 根據(jù)占比數(shù)量生成對(duì)應(yīng)的節(jié)點(diǎn),如下:
如果節(jié)點(diǎn)分布過于分散恬试,可能導(dǎo)致數(shù)據(jù)落點(diǎn)不均勻窝趣,如下圖最終分配 2 個(gè) Major, 2 個(gè) Trial训柴。
所以要生成對(duì)應(yīng)的虛擬節(jié)點(diǎn)哑舒,當(dāng)教師放課時(shí)根據(jù) 課時(shí)信息的 Time 字段
生成 HASH 后落入以下節(jié)點(diǎn)中,最終落入節(jié)點(diǎn)的占比即為約課占比
真實(shí)節(jié)點(diǎn)
虛擬節(jié)點(diǎn)
HASH 環(huán)
最終得到 1 個(gè) MAJOR幻馁,3 個(gè) TRIAL洗鸵,形成 3 : 14. 通過 HASH 散列并排序后按比例切分
這個(gè)方案是拿到一個(gè)課時(shí)集合,比如:
"2019-01-14 18:30:00"
"2019-01-14 19:00:00"
"2019-01-15 18:30:00"
"2019-01-15 19:30:00"
把以上集合直接放入 HashSet 得到一個(gè)無序的列表
"2019-01-14 18:30:00"
"2019-01-15 19:30:00"
"2019-01-14 19:00:00"
"2019-01-15 18:30:00"
之后按照比例仗嗦,如:3 / 1 膘滨, 分割后得到:
TRIAL:
"2019-01-14 18:30:00"
"2019-01-15 19:30:00"
"2019-01-14 19:00:00"
MAJOR:
"2019-01-15 18:30:00"
實(shí)例代碼如下:
double trialRatio = 3;
double majorRatio = 1;
String[] keys = {
"2019-01-14 18:30:00"
, "2019-01-14 19:00:00"
, "2019-01-15 18:30:00"
, "2019-01-15 19:30:00"
};
HashSet<String> hashSet = new HashSet<>(keys);
List<String> timeList = Lists.newArrayList(hashSet);
double t = Math.round((double) keys.length / (trialRatio + majorRatio) * trialRatio);
System.out.println("\nTRIAL 課");
timeList.subList(0, (int)t).forEach(System.out::println);
System.out.println("\nMAJOR 課");
timeList.subList((int)t, timeList.size()).forEach(System.out::println);
參考鏈接:
一致性哈希算法的理解與實(shí)踐
Consistent_hashing
Consistent Hashing in Cassandra