成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Redis 實現排行榜,看這篇文章就夠了

數據庫 Redis
Redis 的有序集合 Sorted Set中的成員是唯一的,但分數(score)卻可以重復,這一點恰恰可以被我們用來實現排行榜的功能。

前言

在日常的服務器開發過程中,經常會遇到排行榜的需求。這里我們主要討論使用redis zset來實現一般的常用排行榜。也就是單key排行榜,分數為整數,一般長度不過萬。

ZSet概述

Redis的ZSet(Sorted Set)是一種有序集合,它結合了Set和SortedList的特性,成員是唯一的,且按照成員的分數(score)進行從小到大排序。在ZSet中,每個元素都會關聯一個分數,分數可以重復,但元素不能重復。這使得ZSet非常適合用于實現排行榜等場景。

每個直播間都有粉絲的排行榜,可以通過key+直播間id來作為redis的key。例如broadcast:20210108231。每個直播間的觀眾按照點贊數排序。則觀眾剛剛進入直播間即可通過ZADD添加排行榜。

張三 觀眾進入直播間。
李四 進入直播間
ZADD [key] [score] [value]

ZADD broadcast:20240108231 1 zhangsan ZADD broadcast:20240108231 1 lisi

1、加分值

`李四` 送了直播間兩顆小紅心。李四分值`加2`。
`ZINCRBY [key] increment [member]

ZINCRBY broadcast:20240108231 2 lisi

2、展示榜單

通過如上指令對直播間分值進行設置之后,得到redis的value如下:

127.0.0.1:6379> ZRANGE broadcast:20240108231 0 -1 WITHSCORES
1) "zhaoliu"
2) "2"
3) "wangwu"
4) "5"
5) "lisi"
6) "8"
7) "zhangsan"
8) "10"

3、查看直播間人數

ZCARD key 返回集合數量。

127.0.0.1:6379> zcard  broadcast:20240108231
(integer) 4

4、離開直播間

張三離開直播間,則刪除對應key。ZREM [key] [value]

127.0.0.1:6379>  ZREM broadcast:20240108231 zhangsan
(integer) 1
127.0.0.1:6379>  ZREVRANGE broadcast:20240108231 0 2
1) "lisi"
2) "wangwu"
3) "zhaoliu"

5、周榜

真實場景中肯定會有時間段的劃分,例如查看日榜、周榜、月榜。只需要按照最小的單位按照時間區分成不同的集合,最后求出這些集合的并集即可。

圖片圖片

ZADD broadcast:1 10 zhangsan

ZADD broadcast:1 10 lisi

ZADD broadcast:2 5 zhangsan

ZADD broadcast:2 5 wangwu

如此,得到兩個zset集合,最后得到兩個集合的并集。

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

WEIGHTS 可以設置每個集合的權重,意為在原來集合分數乘權重得到輸出集合的值。兩個集合并集時,如果有相同的key,則可以通過 SUM|MIN|MAX 進行控制。默認為SUM。

127.0.0.1:6379> ZUNIONSTORE broadcast:week:1 2 broadcast:1 broadcast:2
(integer) 3
127.0.0.1:6379> ZRANGE broadcast:week:1 0 -1 WITHSCORES
1) "wangwu"
2) "5"
3) "lisi"
4) "10"
5) "zhangsan"
6) "15"

Java實現排行榜

要實現一個排行榜,我們需要做以下幾件事:

  • 創建一個ZSet,其中包含用戶ID和對應的分數。
  • 獲取排行榜數據,并按照分數降序排列。

以下是一個簡單的Java代碼示例,展示了如何使用Jedis庫來實現基于Redis的ZSet的秒級排行榜

public class RedisZSetRank{
    
    @Autowired
    private RedisTemplate redisTemplate;

    // 添加用戶分數到排行榜
    public void addScore(String userId, double score) {
         redisTemplate.opsForZSet().add("ranking",userId,score);

    }

    // 獲取排行榜數據
    public Set<String> getRanking() {
        // 獲取前10名
        return redisTemplate.opsForZSet().reverseRange("ranking", 0, 10); 
    }
    
    // 查看某條記錄的排名
    public Long ranking(String code) {
        Long ranking = redisTemplate.opsForZSet().rank("ranking", code);
        if (ranking != null) {
            //有序集合的索引是從0開始的,所以查詢出來的排名要+1。
            return ranking + 1;
        }
        return ranking;
    }
    
    public static void main(String[] args) {

        // 添加用戶分數
        rank.addScore("user1", 100);
        rank.addScore("user2", 200);

        // 獲取排行榜數據
        Set<String> rankingData = rank.getRanking();
        for (String userId : rankingData) {
            System.out.println("User ID: " + userId);
        }
    }
}

這樣就實現了簡單的排行榜。

總結

Redis 的有序集合 Sorted Set中的成員是唯一的,但分數(score)卻可以重復,這一點恰恰可以被我們用來實現排行榜的功能。

責任編輯:武曉燕 來源: 程序員子龍
相關推薦

2017-03-30 22:41:55

虛擬化操作系統軟件

2021-11-10 07:47:48

Traefik邊緣網關

2022-05-27 08:18:00

HashMapHash哈希表

2019-09-25 09:17:43

物聯網技術信息安全

2019-10-31 09:48:53

MySQL數據庫事務

2018-10-31 17:22:25

AI人工智能芯片

2020-10-13 07:44:40

緩存雪崩 穿透

2024-02-28 08:59:47

2018-08-17 09:14:43

餓了么容器演進

2017-12-12 12:53:09

2017-03-10 21:04:04

Android適配

2017-03-07 15:35:26

Android適配 界面

2021-04-09 10:03:12

大數據exactly-onc

2022-08-26 05:22:21

RabbitMQ架構

2023-09-25 08:32:03

Redis數據結構

2023-10-04 00:32:01

數據結構Redis

2021-09-30 07:59:06

zookeeper一致性算法CAP

2019-08-16 09:41:56

UDP協議TCP

2019-07-10 15:15:23

JVM虛擬機Java

2025-03-10 12:10:00

RedisJava排行榜
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 女人精96xxx免费网站p | 国内久久| 一区二区三区在线播放 | 精品久久久久久久久久久 | 国产98在线 | 免费, | 久久久欧洲| www.亚洲国产精品 | 亚洲一区二区三区在线播放 | 黄色免费网站在线看 | 成人影院网站ww555久久精品 | 日韩美女爱爱 | 欧美日韩三级在线观看 | 免费特级黄毛片 | 欧美日韩亚洲国产 | 欧美中文字幕 | 久久精品一区二区三区四区 | 国产一区二区三区视频 | 亚洲国产一区二区视频 | 国产一区二区三区在线视频 | 日日淫 | 男人av在线 | 罗宾被扒开腿做同人网站 | 天天爽夜夜骑 | 麻豆久久久 | 拍真实国产伦偷精品 | 国产黄色大片在线免费观看 | 日韩视频中文字幕 | 黄免费观看| 成人h视频在线观看 | 一区二区视频在线 | 日本午夜精品 | 久久国产精品免费视频 | 精品欧美乱码久久久久久1区2区 | 一区二区三区亚洲视频 | 日本精a在线观看 | 成年人在线视频 | 久久精品国产亚洲a | 黄色大片免费网站 | 自拍偷拍亚洲欧美 | 久久精品视频99 | 亚洲精品乱码久久久久久久久久 |