?????作者名稱:DaenCode
??作者簡介:啥技術(shù)都喜歡搗鼓搗鼓,喜歡分享技術(shù)、經(jīng)驗(yàn)、生活。
??人生感悟:嘗盡人生百味,方知世間冷暖。
??所屬專欄:Redis從頭學(xué)
??前言
之前的篇章對Redis的String數(shù)據(jù)類型已經(jīng)做出了具體分析,并舉例說明了其具體的實(shí)戰(zhàn)場景本文就結(jié)合List數(shù)據(jù)類型結(jié)構(gòu)的特性,一起探討其實(shí)戰(zhàn)中的應(yīng)用場景,并以天貓熱銷榜單為例。
??List數(shù)據(jù)類型分析
Redis中的List數(shù)據(jù)類型是一種有序、可重復(fù)、可變長度
的數(shù)據(jù)結(jié)構(gòu)。它支持在列表的兩端進(jìn)行快速的插入、刪除和查找操作,因此非常適合用于處理隊列、棧以及任務(wù)列表
等場景。
List數(shù)據(jù)類型可以存儲多個相同或不同類型的元素
,并且可以按照插入順序進(jìn)行訪問。Redis提供了一系列的命令來操作List,包括向列表頭部或尾部插入元素、在指定位置插入元素、獲取指定位置的元素、刪除列表中的元素等。有關(guān)其操作命令請參照【Redis從頭學(xué)-3】5個表格帶你學(xué)會使用Redis五大數(shù)據(jù)類型常用命令
List數(shù)據(jù)類型的主要特點(diǎn):
- 有序性:列表中的元素按照插入順序排列,可以根據(jù)索引位置進(jìn)行訪問。
- 可重復(fù)性:列表允許存儲重復(fù)的元素。
- 動態(tài)長度:列表可以根據(jù)需要進(jìn)行動態(tài)擴(kuò)展或收縮,沒有固定的長度限制。
- 快速操作:插入和刪除元素的時間復(fù)雜度為O(1),在列表頭部和尾部進(jìn)行插入和刪除操作非常高效。
??List類型實(shí)戰(zhàn)應(yīng)用場景
通過上述對List類型的分析,可以結(jié)合實(shí)際需求選擇適合List類型結(jié)構(gòu)的場景。本文主要演示排行榜功能的演示代碼。
- 消息隊列:可以通過List實(shí)現(xiàn)簡單的消息隊列,將消息按順序插入到列表尾部,消費(fèi)者從列表頭部取出消息進(jìn)行處理。
- 時間線:將新的動態(tài)信息按照時間順序插入到列表頭部,就可以實(shí)現(xiàn)類似社交媒體的時間線功能。
- 排行榜:可以對熱銷的商品進(jìn)行榜單排序。
熱銷榜單功能
生活中的例子
排序規(guī)則
仿造示例
通過上述生活中的例子,來描述一個熱銷榜單的應(yīng)用場景。實(shí)際場景要比這個復(fù)雜的多哦,這里只是感受List數(shù)據(jù)類型的結(jié)構(gòu)
。
實(shí)現(xiàn)步驟:
- 創(chuàng)建一個洗面奶實(shí)體類WashMilk。字段內(nèi)容包含字段包含id、品牌名稱、好評率、成交額、回購人數(shù)、累計銷量等。
- 按照加權(quán)平均算法得出綜合權(quán)衡的平均值。根據(jù)好評率、成交額、回購人數(shù)、累計銷量因素,對洗面奶進(jìn)行排序。
- 存入Redis中。使用rightPushAll。因?yàn)榕判蚴前唇敌蚺判虻模幸獜挠也迦?,最大值才能展現(xiàn)在第一個。
若序列為:5,4,3,2,1。則按右插法,最終結(jié)果為
5
4
3
2
1
左插法,結(jié)果為:
1
2
3
4
5
加權(quán)平均算法介紹:
加權(quán)平均算法(Weighted Average Algorithm)是一種常見的統(tǒng)計算法,用于計算一組數(shù)據(jù)的加權(quán)平均值。在加權(quán)平均算法中,每個數(shù)據(jù)點(diǎn)都有一個對應(yīng)的權(quán)重,權(quán)重可以表示數(shù)據(jù)的重要性或貢獻(xiàn)度。
加權(quán)平均算法的計算公式如下:加權(quán)平均值 = (數(shù)據(jù)點(diǎn)1 × 權(quán)重1 + 數(shù)據(jù)點(diǎn)2 × 權(quán)重2 + ... + 數(shù)據(jù)點(diǎn)n × 權(quán)重n) / (權(quán)重1 + 權(quán)重2 + ... + 權(quán)重n)
其中,數(shù)據(jù)點(diǎn)1、數(shù)據(jù)點(diǎn)2等表示要計算加權(quán)平均值的數(shù)據(jù)點(diǎn),權(quán)重1、權(quán)重2等表示對應(yīng)數(shù)據(jù)點(diǎn)的權(quán)重。
加權(quán)平均算法適用于以下場景:
- 數(shù)據(jù)點(diǎn)具有不同的重要性或權(quán)重,需要考慮這些差異并進(jìn)行加權(quán)處理。
- 某些數(shù)據(jù)點(diǎn)可能對結(jié)果產(chǎn)生較大的影響,而某些數(shù)據(jù)點(diǎn)可能對結(jié)果影響較小,需要根據(jù)權(quán)重進(jìn)行調(diào)節(jié)。
- 數(shù)據(jù)點(diǎn)的權(quán)重可能隨時間、條件或其他因素而變化,可以動態(tài)調(diào)整計算結(jié)果。
舉例來說,假設(shè)你要計算一組考試成績的加權(quán)平均值,其中不同科目的權(quán)重不同,例如數(shù)學(xué)的權(quán)重為0.4,英語的權(quán)重為0.3,物理的權(quán)重為0.3。
你可以按照如下方式計算加權(quán)平均值:
加權(quán)平均值 = (數(shù)學(xué)成績 × 0.4 + 英語成績 × 0.3 + 物理成績 × 0.3) / (0.4 + 0.3 + 0.3)
通過加權(quán)平均算法,可以根據(jù)不同數(shù)據(jù)點(diǎn)的權(quán)重,將其貢獻(xiàn)度考慮在內(nèi),得出一個綜合權(quán)衡的平均值。這個平均值更能反映數(shù)據(jù)的實(shí)際情況和重要性。
簡易代碼:
@Test
void hotRank(){
String DAILY_RANK_KEY="hotRank:daily";
//模擬數(shù)據(jù)庫查詢到的數(shù)據(jù)
WashMilk washMilk=new WashMilk(1,"香奈兒",0.65,10000,800,100000);
WashMilk washMilk2=new WashMilk(2,"至本",0.85,60040,10000,25465);
WashMilk washMilk3=new WashMilk(3,"蘭蔻",0.60,343543,6000,4534);
WashMilk washMilk4=new WashMilk(4,"雅詩蘭黛",0.67,50000,800,3655);
WashMilk washMilk5=new WashMilk(5,"歐萊雅",0.99,10000,40000,42443);
WashMilk washMilk6=new WashMilk(6,"薇姿",0.65,32443,800,43244);
WashMilk washMilk7=new WashMilk(7,"嬌韻詩",0.82,10000,800,5435654);
WashMilk washMilk8=new WashMilk(8,"相宜本草",0.95,65476,3214,4000);
WashMilk washMilk9=new WashMilk(9,"佰草集",0.90,432535,800,3435);
WashMilk washMilk10=new WashMilk(10,"倩碧",0.75,23423,4356,180000);
List<WashMilk> washMilkList=new ArrayList<>();
//將數(shù)據(jù)添加到list集合。
Stream.of(washMilk,washMilk2,washMilk3,washMilk4,washMilk5,washMilk6,washMilk7,washMilk8,washMilk9,washMilk10).
forEach(washMilkList::add);
//通過加權(quán)平均法,對上述洗面奶綜合排序
Collections.sort(washMilkList, new Comparator<WashMilk>() {
@Override
public int compare(WashMilk o1, WashMilk o2) {
double wm1Score = o1.getGoodRate() * 0.4 + o1.getTurnover() * 0.3 + o1.getRepurchaseCount() * 0.2 + o1.getTotalSales() * 0.1;
double wm2Score = o2.getGoodRate() * 0.4 + o2.getTurnover() * 0.3 + o2.getRepurchaseCount() * 0.2 + o2.getTotalSales() * 0.1;
return Double.compare(wm2Score, wm1Score); // 按照降序排序
}
});
//存入到redis中
redisTemplate.opsForList().rightPushAll(DAILY_RANK_KEY,washMilkList);
System.out.println(redisTemplate.opsForList().range(DAILY_RANK_KEY,0,-1));
}
最終效果
最終效果展示如下圖所示
??寫在最后
有關(guān)于Redis中的List數(shù)據(jù)類型實(shí)戰(zhàn)應(yīng)用場景到此就結(jié)束了。功能演示代碼的邏輯簡單,目的是理解List數(shù)據(jù)類型的應(yīng)用,實(shí)際場景的邏輯根據(jù)具體需求而定。感謝大家的閱讀,希望大家在評論區(qū)對此部分內(nèi)容散發(fā)討論,便于學(xué)到更多的知識。文章來源:http://www.zghlxwxcb.cn/news/detail-659343.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-659343.html
到了這里,關(guān)于【Redis從頭學(xué)-5】Redis中的List數(shù)據(jù)類型實(shí)戰(zhàn)場景之天貓熱銷榜單的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!