日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Redis Zset詳解:排行榜絕佳選擇

來源: 責編: 時間:2024-05-16 09:02:48 209觀看
導讀最近我們發布了一款新的app,其中包含一個搜索功能。在搜索時,會給用戶展示四個熱門搜索詞匯。我們利用 Redis 的有序集合(zset)實現了這一功能。由于應用程序剛剛上線并且尚未大力推廣,所以熱門搜索詞匯顯示的是我們隨手測

最近我們發布了一款新的app,其中包含一個搜索功能。在搜索時,會給用戶展示四個熱門搜索詞匯。我們利用 Redis 的有序集合(zset)實現了這一功能。由于應用程序剛剛上線并且尚未大力推廣,所以熱門搜索詞匯顯示的是我們隨手測試詞匯,如測試、test、111等。這會給人一種不夠專業的印象。為了提升產品形象,我們計劃通過后臺刪除這些測試的詞匯,使熱門搜索詞匯更加貼近實際使用情況。今天,我將與大家分享在 Redis 命令行中操作有序集合(zset)的命令,以及我們實現熱門搜索詞匯功能的思路。byy28資訊網——每日最新資訊28at.com

Redis ZSET 詳解

Redis 中的 ZSET(有序集合)是一種有序的數據結構,它類似于 SET(集合),但每個成員都關聯著一個分數(score),通過分數來進行排序。這使得 ZSET 既可以像 SET 一樣快速查找成員,又可以按照分數從小到大或從大到小進行排序。byy28資訊網——每日最新資訊28at.com

ZSET 的特點包括:byy28資訊網——每日最新資訊28at.com

  • 有序性:成員按照分數的順序排列,可以進行范圍查詢和排名操作。
  • 唯一性:每個成員都是唯一的,但不同成員可以有相同的分數。
  • 快速查找:和 SET 類似,ZSET 也可以在 O(1) 的時間復雜度內查找單個成員。
  • 分數(score)更新:可以對成員的分數進行增加或減少操作,同時保持排序。

ZSET 的底層實現會根據實際的情況選擇ziplist(壓縮列表)/listpack(緊湊列表)(redis7.0已經將 listpack 完整替代 ziplis) 或者skiplist(跳躍表),Redis 會根據實際情況動態地在這兩種底層結構之間切換,使得其在內存和性能之間平衡。這是由兩個配置參數:zset-max-ziplist-entries 和 zset-max-ziplist-value控制的,其默認值為128和64。當 Zset 存儲的元素數量超過zset-max-ziplist-entries的值或者最長元素的長度超過 zset-max-ziplist-value的值的時候Redis 會將底層結構從壓縮列表/緊湊列表轉換為跳躍表。壓縮列表/緊湊列表占用的內存比較少,但是修改數據時可能會對整個列表進行重寫,性能較低; 跳躍表的查找和修改數據的性能較高,但是占用的內存也較多。byy28資訊網——每日最新資訊28at.com

我們在redis 命令行中可以通過以下命令查看 zset的配置參數:byy28資訊網——每日最新資訊28at.com

config get zset*

圖片圖片byy28資訊網——每日最新資訊28at.com

Redis ZSET 使用場景

  • 排行榜

Redis 的zset是設計實時排行的絕佳選擇,我們可以使用它來完成各種排行榜、熱門詞匯等場景的實現。我們app的熱搜詞匯也是通過zset實現的,本文中也將介紹熱搜詞匯的實現方式。byy28資訊網——每日最新資訊28at.com

  • 延時隊列

我們可以將時間戳設置為zset的score,延時處理的任務作為元素,定期或者循環掃描zset來處理到達時間的任務。byy28資訊網——每日最新資訊28at.com

  • 滑動窗口限流

我們可以將接口地址設置為zset的key,時間戳設置為zset的score,使用uuid作為元素,那么我們可以通過zset獲取到 score固定窗口范圍的時間內的請求數來達到限流的目的。byy28資訊網——每日最新資訊28at.com

REDISSON 操作ZSET數據

代碼如下:byy28資訊網——每日最新資訊28at.com

package cn.xj.xjdoc.redis.zset;import jakarta.annotation.Resource;import org.redisson.api.RScoredSortedSet;import org.redisson.api.RedissonClient;import org.redisson.client.protocol.ScoredEntry;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Service;import java.util.Collection;@Servicepublic class ZSETService {    private static final Logger log = LoggerFactory.getLogger(ZSETService.class);    @Resource    private RedissonClient redissonClient;    public void operation(){        String zsetKey = "xjzset";        RScoredSortedSet<String> zset = redissonClient.getScoredSortedSet(zsetKey);        //添加元素        zset.add(1.0, "修己xj1");        zset.add(2.0, "修己xj2");        zset.add(3.0, "修己xj3");        zset.add(4.0, "修己xj4");        // 獲取ZSET中指定成員的分數        Double score = zset.getScore("修己xj2");        log.info("1、獲取ZSET中指定成員的分數:{}",score);        //獲取ZSET中指定成員的排名(分數從小到大排序)        Integer rank = zset.rank("修己xj3");        log.info("2、獲取ZSET中指定成員的排名(分數從小到大排序):{}",rank);        //獲取ZSET中指定成員的排名(分數從大到小排序)        Integer reverseRank = zset.revRank("修己xj4");        log.info("3、獲取ZSET中指定成員的排名(分數從大到小排序):{}",reverseRank);        // 獲取ZSET中指定排名范圍內的成員(分數從小到大排序)        Collection<String> membersInRange = zset.valueRange(0, 1);        membersInRange.forEach(o->log.info("4、獲取ZSET中指定排名范圍內的成員(分數從小到大排序):{}",o));        // 獲取ZSET中指定排名范圍內的成員(分數從大到小排序)        Collection<String> membersInRangeRever = zset.valueRangeReversed(0, 1);        membersInRangeRever.forEach(o->log.info("5、獲取ZSET中指定排名范圍內的成員(分數從大到小排序):{}",o));        //獲取ZSET中指定分數范圍內的成員(分數從小到大排序)        Collection<String> membersInScoreRange = zset.valueRange(2.0, true, 3.0, true);        membersInScoreRange.forEach(o->log.info("6、獲取ZSET中指定分數范圍內的成員(分數從小到大排序):{}",o));        //獲取ZSET中指定分數范圍內的成員(分數從大到小排序)        Collection<String> membersInScoreRever = zset.valueRangeReversed(2.0, true, 3.0, true);        membersInScoreRever.forEach(o->log.info("7、獲取ZSET中指定分數范圍內的成員(分數從大到小排序):{}",o));        //獲取ZSET中指定排名范圍內的成員及其分數        Collection<ScoredEntry<String>> membersWithScoresInRange = zset.entryRange(0, 1);        membersWithScoresInRange.forEach(o->log.info("8、獲取ZSET中指定排名范圍內的成員及其分數,成員:{},分數",o.getValue(),o.getScore()));        //獲取ZSET中指定分數范圍內的成員及其分數        Collection<ScoredEntry<String>> membersWithScoresInScoreRange = zset.entryRange(3.0, true, 4.0, true);        membersWithScoresInScoreRange.forEach(o->log.info("9、獲取ZSET中指定分數范圍內的成員及其分數,成員:{},分數",o.getValue(),o.getScore()));        //        Double newScore = zset.addScore("修己xj4", 1);        log.info("10、增加1之后指定成員的分數:{}",newScore);        //刪除ZSET 中的指定成員        Boolean removedFlag = zset.remove("修己xj3");        log.info("11、刪除ZSET 中的指定成員:{}",removedFlag);        //刪除指定排名范圍內的成員        Integer removedByRangeCount = zset.removeRangeByRank(0, 1);        log.info("12、刪除指定排名范圍內的成員數量:{}",removedByRangeCount);        //刪除指定分數范圍內的成員        Integer removedByScoreCount = zset.removeRangeByScore(3.0, true, 4.0, true);        log.info("13、刪除指定分數范圍內的成員數量:{}",removedByScoreCount);    }}

執行結果如下:byy28資訊網——每日最新資訊28at.com

1、獲取ZSET中指定成員的分數:2.02、獲取ZSET中指定成員的排名(分數從小到大排序):23、獲取ZSET中指定成員的排名(分數從大到小排序):04、獲取ZSET中指定排名范圍內的成員(分數從小到大排序):修己xj14、獲取ZSET中指定排名范圍內的成員(分數從小到大排序):修己xj25、獲取ZSET中指定排名范圍內的成員(分數從大到小排序):修己xj45、獲取ZSET中指定排名范圍內的成員(分數從大到小排序):修己xj36、獲取ZSET中指定分數范圍內的成員(分數從小到大排序):修己xj26、獲取ZSET中指定分數范圍內的成員(分數從小到大排序):修己xj37、獲取ZSET中指定分數范圍內的成員(分數從大到小排序):修己xj37、獲取ZSET中指定分數范圍內的成員(分數從大到小排序):修己xj28、獲取ZSET中指定排名范圍內的成員及其分數,成員:修己xj1,分數8、獲取ZSET中指定排名范圍內的成員及其分數,成員:修己xj2,分數9、獲取ZSET中指定分數范圍內的成員及其分數,成員:修己xj3,分數9、獲取ZSET中指定分數范圍內的成員及其分數,成員:修己xj4,分數10、增加1之后指定成員的分數:5.011、刪除ZSET 中的指定成員:true12、刪除指定排名范圍內的成員數量:213、刪除指定分數范圍內的成員數量:0

命令行操作ZSET數據

  • zadd 添加成員
zadd xjzset 1 "修己xj1" 2 "修己xj2" 3 "修己xj3" 4 "修己xj4"
  • zscore 獲取指定成員的分數
zscore xjzset '修己xj2'
  • zrank 獲取指定成員的排名(分數從小到大排序)
zrank xjzset 修己xj3
  • zrevrank 獲取指定成員的排名(分數從大到小排序)
zrevrank xjzset 修己xj3
  • zrange/zrevrange 獲取ZSET中指定排名范圍內的成員   zrange:分數從小到大排序,我們加了一些測試數據,如下

圖片圖片byy28資訊網——每日最新資訊28at.com

zrevrange:分數從大到小排序byy28資訊網——每日最新資訊28at.com

圖片圖片byy28資訊網——每日最新資訊28at.com

zrange key start stop [withscores]zrevrange key start stop [withscores]

其中,key是zset的鍵名,start是起始索引,stop結束索引,withscores表示是否同時返回分數。可以使用負數索引表示從末尾開始,比如-1表示最后一個元素。zrange key 0 -1 則會顯示出所有元素byy28資訊網——每日最新資訊28at.com

zrange xjzset 1 2 withscores
  • zrangebyscore/zrevrangebyscore 獲取ZSET中指定分數score范圍內的成員  zrangebyscore:分數從小到大排序,zrevrangebyscore:分數從大到小排序
zrangebyscore key min max [withscores]zrevrangebyscore key max min [withscores]

其中,key是zset的鍵名,min 和 max 表示score的范圍,范圍為閉區間,withscores表示是否同時返回分數。byy28資訊網——每日最新資訊28at.com

zrangebyscore xjzset 2.5 3.5 withscores
  • zincrby 將指定成員的分數增加指定的值
zincrby xjzset  1  修己xj3

注: 進行double的值的運算時可能會丟失精度,如果對score進行運算時盡可能使用整數運算。byy28資訊網——每日最新資訊28at.com

圖片圖片byy28資訊網——每日最新資訊28at.com

  • zcard 返回zset中成員的數量
zcard xjzset
  • zcount 獲取指定范圍分數內的成員的數量
zcount key min max

其中,key是zset的鍵名,min 和 max 表示score的范圍,范圍為閉區間。byy28資訊網——每日最新資訊28at.com

zcount  xjzset 0 2
  • zrem 刪除指定成員
zrem  xjzset
  • zremrangebyrank  刪除指定排名范圍內的成員
zremrangebyrank key start stop

其中,key是zset的鍵名,start是起始索引,stop結束索引。byy28資訊網——每日最新資訊28at.com

zremrangebyrank xjzset 1 1
  • zremrangebyscore 刪除指定分數范圍內的成員
zremrangebyscore key min max

其中,key是zset的鍵名,min 和 max 表示score的范圍,范圍為閉區間。byy28資訊網——每日最新資訊28at.com

zremrangebyscore  xjzset 0 3

圖片圖片byy28資訊網——每日最新資訊28at.com

熱搜詞匯功能實現

我們設計思路是 將每個搜索詞作為有序集合的成員,而搜索次數作為成員的分數,每次搜索的時候對這個搜索詞的分數加1,這樣可以根據搜索次數對熱搜詞進行排序。byy28資訊網——每日最新資訊28at.com

  • 搜索接口
public String keySearch(String keyStr){    String hotSearchKey = "xj_hotSearch";    RScoredSortedSet<String> hotSearchZSet = redissonClient.getScoredSortedSet(hotSearchKey);    //更新zset中當前搜索詞的搜索次數    hotSearchZSet.addScore(keyStr,1);    //搜索邏輯    //doSearch(keyStr);    return keyStr;}
  • 熱搜詞匯查詢接口
public Collection<String> hotSearch(){    String hotSearchKey = "xj_hotSearch";    RScoredSortedSet<String> hotSearchZSet = redissonClient.getScoredSortedSet(hotSearchKey);    //獲取zset中點擊次數排名前5的數據    Collection<String> hotList= hotSearchZSet.valueRangeReversed(0,4);    return hotList;}

我們加了一些測試數據,如下byy28資訊網——每日最新資訊28at.com

圖片圖片byy28資訊網——每日最新資訊28at.com

圖片圖片byy28資訊網——每日最新資訊28at.com

總結

通過本文的介紹,你學會了如何利用Spring Boot和Redis的ZSET數據結構實現熱門搜索功能,并深入了解了熱搜詞匯的實現細節。通過合理的設計和優化,可以為用戶提供更好的搜索體驗,同時也提升了應用程序的性能和可擴展性。byy28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-88319-0.htmlRedis Zset詳解:排行榜絕佳選擇

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 一文徹底搞明白備忘錄模式

下一篇: 盤點GoLang中的三方庫:govaluate、flag、go-homedir、cast

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美日韩国产影片| 洋洋av久久久久久久一区| 欧美激情国产精品| 久久这里有精品15一区二区三区| 欧美在线观看视频一区二区| 午夜在线不卡| 久久精品国产一区二区三| 久久天堂成人| 欧美亚洲网站| 亚洲欧美日本另类| 久久久久国产精品一区| 久久综合久久久| 欧美色图麻豆| 在线观看亚洲一区| 亚洲最新在线| 久久成人人人人精品欧| 欧美韩日一区| 国产片一区二区| 亚洲精品免费网站| 亚洲女人小视频在线观看| 国产亚洲激情| 在线观看国产欧美| 一个人看的www久久| 午夜在线播放视频欧美| 欧美成人精品福利| 欧美久久久久久久久| 国产精品一卡二| 亚洲日本欧美| 久久久久久久一区| 国产精品久久久久久一区二区三区| 国内精品久久久久影院 日本资源| 亚洲日韩中文字幕在线播放| 久久av一区二区三区漫画| 欧美黄网免费在线观看| 国产欧美精品国产国产专区| 亚洲免费电影在线观看| 久久在线视频在线| 欧美日韩一区二区三区视频| 欧美日韩一区二区三区四区在线观看| 国产热re99久久6国产精品| 在线亚洲一区二区| 欧美久久视频| 亚洲欧洲综合| 欧美好吊妞视频| 亚洲人成在线观看一区二区| 蜜臀久久久99精品久久久久久| 国产在线不卡视频| 久久精品一区二区三区不卡| 欧美三级在线| 在线视频精品一区| 欧美日韩视频在线| 一本色道久久加勒比88综合| 国产日本欧美一区二区三区在线| 亚洲日本一区二区| 美女爽到呻吟久久久久| 红桃视频欧美| 免费成人高清视频| 亚洲精品久久7777| 欧美日韩亚洲国产精品| 亚洲一区二区三区在线看| 国产精品网站在线播放| 亚洲欧美日韩国产另类专区| 国产精品乱看| 欧美影院成人| 午夜精品免费在线| 国产精品综合久久久| 欧美主播一区二区三区美女 久久精品人| 国产欧美精品日韩精品| 亚洲在线观看免费视频| 欧美日本国产精品| 亚洲综合欧美| 伊人婷婷欧美激情| 欧美日韩精品二区| 久久精品国产v日韩v亚洲| 亚洲国产精品一区二区www| 欧美精品久久久久久久久久| 亚洲视频 欧洲视频| 国产日韩精品一区二区浪潮av| 久久手机免费观看| 在线一区免费观看| 在线观看一区视频| 国产精品一区二区黑丝| 美女视频黄a大片欧美| 亚洲视频在线观看网站| 尤妮丝一区二区裸体视频| 欧美性片在线观看| 久久免费视频一区| 亚洲欧美久久久久一区二区三区| 一区在线播放| 国产精品一区二区你懂得| 欧美激情欧美激情在线五月| 久久精品国产亚洲精品| 亚洲一区在线直播| 亚洲六月丁香色婷婷综合久久| 韩国成人福利片在线播放| 欧美日韩伦理在线免费| 欧美高清视频一区| 狼人天天伊人久久| 久久久久久久久久码影片| 亚洲欧美久久久久一区二区三区| 亚洲精品美女| 国产有码一区二区| 欧美电影资源| 久久综合伊人77777麻豆| 欧美在线一级va免费观看| 亚洲免费在线视频| 亚洲永久免费精品| 亚洲永久在线| 亚洲午夜激情免费视频| 99re热精品| 一区二区三区色| 亚洲午夜在线观看视频在线| 亚洲深夜福利网站| 午夜激情久久久| 香蕉久久夜色精品国产| 亚洲欧美日韩一区二区在线 | 亚洲三级免费| 一本大道久久a久久精二百| 亚洲美女精品成人在线视频| 亚洲三级免费| 亚洲男人天堂2024| 欧美一区二区三区另类| 欧美在线网站| 噜噜噜躁狠狠躁狠狠精品视频 | 国产伦精品一区二区三区高清版 | 韩日精品视频| 欧美日韩免费观看一区三区 | 日韩视频不卡| 亚洲永久免费观看| 久久gogo国模裸体人体| 久久综合五月天婷婷伊人| 欧美激情精品久久久久久大尺度| 欧美日韩久久| 国产热re99久久6国产精品| 国产在线观看一区| 亚洲日本中文字幕区| 一区二区三区日韩在线观看| 久久精品国语| 欧美日韩国产综合在线| 国产亚洲一本大道中文在线| 亚洲人成网站在线播| 欧美一区久久| 欧美亚一区二区| 亚洲高清三级视频| 欧美一区二区三区四区夜夜大片| 欧美成人xxx| 国产午夜精品美女视频明星a级| 亚洲精品久久久久中文字幕欢迎你 | 国产三级精品三级| 亚洲精选一区| 久久蜜桃香蕉精品一区二区三区| 欧美日本亚洲韩国国产| 伊人久久婷婷色综合98网| 午夜精品一区二区三区在线播放 | 欧美在线地址| 欧美色欧美亚洲另类七区| 亚洲国产合集| 久久久久九九九| 国产精品一区2区| 亚洲一区视频在线| 欧美四级剧情无删版影片| 亚洲肉体裸体xxxx137| 久久久久久国产精品mv| 国产日产亚洲精品系列| 午夜久久久久久| 国产日韩av一区二区| 欧美影院成年免费版| 国产视频综合在线| 欧美亚洲一级| 国产亚洲欧洲| 久久九九免费视频| 激情亚洲网站| 美女视频一区免费观看| 亚洲国产另类久久久精品极度| 久热成人在线视频| 亚洲激情校园春色| 欧美人与性动交cc0o| 在线综合亚洲欧美在线视频| 欧美小视频在线| 欧美一区二区视频97| 黄色亚洲精品| 欧美母乳在线| 欧美一级一区| 影音先锋欧美精品| 欧美风情在线观看| 洋洋av久久久久久久一区| 国产精品乱人伦一区二区| 欧美制服第一页| 亚洲全黄一级网站| 国产精品女人网站| 美女视频黄a大片欧美| 一区二区高清| 欧美日本精品一区二区三区| 亚洲国产美国国产综合一区二区| 欧美激情1区2区3区| 亚洲私人影吧| 激情综合电影网| 欧美日韩在线电影| 久久精品人人做人人综合| 日韩午夜激情| 国产一区欧美| 欧美日韩在线另类| 久久久久国色av免费看影院| 一本久久知道综合久久|