国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Redis實戰(zhàn) | 使用Redis 的有序集合(Sorted Set)實現(xiàn)排行榜功能,和Spring Boot集成

這篇具有很好參考價值的文章主要介紹了Redis實戰(zhàn) | 使用Redis 的有序集合(Sorted Set)實現(xiàn)排行榜功能,和Spring Boot集成。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

專欄集錦,大佬們可以收藏以備不時之需

Spring Cloud實戰(zhàn)專欄:https://blog.csdn.net/superdangbo/category_9270827.html

Python 實戰(zhàn)專欄:https://blog.csdn.net/superdangbo/category_9271194.html

Logback 詳解專欄:https://blog.csdn.net/superdangbo/category_9271502.html

tensorflow專欄:https://blog.csdn.net/superdangbo/category_8691332.html

Redis專欄:https://blog.csdn.net/superdangbo/category_9950790.html

Spring Cloud實戰(zhàn):

Spring Cloud 實戰(zhàn) | 解密Feign底層原理,包含實戰(zhàn)源碼

Spring Cloud 實戰(zhàn) | 解密負載均衡Ribbon底層原理,包含實戰(zhàn)源碼

1024程序員節(jié)特輯文章:

1024程序員狂歡節(jié)特輯 | ELK+ 協(xié)同過濾算法構(gòu)建個性化推薦引擎,智能實現(xiàn)“千人千面”

1024程序員節(jié)特輯 | 解密Spring Cloud Hystrix熔斷提高系統(tǒng)的可用性和容錯能力

1024程序員節(jié)特輯 | ELK+ 用戶畫像構(gòu)建個性化推薦引擎,智能實現(xiàn)“千人千面”

1024程序員節(jié)特輯 | OKR VS KPI誰更合適?

1024程序員節(jié)特輯 | Spring Boot實戰(zhàn) 之 MongoDB分片或復(fù)制集操作

Spring實戰(zhàn)系列文章:

Spring實戰(zhàn) | Spring AOP核心秘笈之葵花寶典

Spring實戰(zhàn) | Spring IOC不能說的秘密?

國慶中秋特輯系列文章:

國慶中秋特輯(八)Spring Boot項目如何使用JPA

國慶中秋特輯(七)Java軟件工程師常見20道編程面試題

國慶中秋特輯(六)大學(xué)生常見30道寶藏編程面試題

國慶中秋特輯(五)MySQL如何性能調(diào)優(yōu)?下篇

國慶中秋特輯(四)MySQL如何性能調(diào)優(yōu)?上篇

國慶中秋特輯(三)使用生成對抗網(wǎng)絡(luò)(GAN)生成具有節(jié)日氛圍的畫作,深度學(xué)習(xí)框架 TensorFlow 和 Keras 來實現(xiàn)

國慶中秋特輯(二)浪漫祝福方式 使用生成對抗網(wǎng)絡(luò)(GAN)生成具有節(jié)日氛圍的畫作

國慶中秋特輯(一)浪漫祝福方式 用循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)或長短時記憶網(wǎng)絡(luò)(LSTM)生成祝福詩詞

Redis實戰(zhàn) | 使用Redis 的有序集合(Sorted Set)實現(xiàn)排行榜功能,和Spring Boot集成,redis,spring boot,數(shù)據(jù)庫,spring,java

Redis 的有序集合(Sorted Set)是一個基于分數(shù)(score)排序的數(shù)據(jù)結(jié)構(gòu),它在 Redis 中非常重要,常用于實現(xiàn)排行榜、近似計數(shù)器等功能。

Redis 的有序集合(Sorted Set)是基于跳躍表(Skip List)實現(xiàn)的。跳躍表是一種高效的數(shù)據(jù)結(jié)構(gòu),其插入、刪除和查找操作的平均時間復(fù)雜度都是 O(log n),相對于平衡樹(如紅黑樹)的實現(xiàn)要簡單很多。跳躍表的結(jié)構(gòu)類似于鏈表,每個節(jié)點除了保存元素值外,還包含一個指針數(shù)組,分別指向?qū)?yīng)層次的下一個節(jié)點。這種多級指針的設(shè)計,使得跳表可以跨越多個節(jié)點進行快速搜索,同時保證跳表結(jié)構(gòu)的高效性和簡潔性。
有序集合的底層數(shù)據(jù)結(jié)構(gòu)由哈希(Hash)和跳躍表組成。在哈希中,存儲了元素及其關(guān)聯(lián)的評分(分數(shù))。每個元素都有一個唯一的評分,用于確定其在跳躍表中的位置。當(dāng)需要對有序集合進行操作時,Redis 首先通過哈希表找到元素及其評分,然后通過跳躍表進行相應(yīng)的操作。
以下是 Redis 有序集合(Sorted Set)的一些核心操作及其對應(yīng)的核心代碼分析:

  1. 添加元素(ZADD):
    有序集合中的元素添加操作是通過哈希表和跳躍表協(xié)同完成的。首先,Redis 將元素值和評分存儲在哈希表中。然后,根據(jù)評分在跳躍表中找到對應(yīng)的位置,并將新元素插入到該位置。
  2. 獲取元素(ZRANGE、ZREVRANGE):
    有序集合中的獲取元素操作主要依賴于跳躍表。ZRANGE 操作從跳躍表的頭部開始,按照給定的評分范圍返回符合條件的元素。ZREVRANGE 操作則從跳躍表的尾部開始,按照給定的評分范圍返回符合條件的元素。
  3. 刪除元素(ZREM):
    刪除元素操作首先通過哈希表找到對應(yīng)元素,然后在跳躍表中刪除該元素。Redis 只需要刪除哈希表中的指向該元素的指針,跳躍表中的元素會自動上移。
  4. 更新元素評分(ZINCRBY):
    更新元素評分操作僅需修改哈希表中對應(yīng)元素的評分,然后重新計算跳躍表中元素的位置。
  5. 獲取有序集合長度(ZCARD):
    有序集合長度的操作直接查詢哈希表中的鍵值對數(shù)量。
  6. 隨機獲取元素(ZRANDMEMBER):
    隨機獲取元素操作首先從哈希表中隨機選擇一個元素,然后在該元素所在的跳躍表區(qū)間內(nèi)隨機選擇一個元素。
    通過以上操作,Redis 實現(xiàn)了高效有序集合(Sorted Set)的數(shù)據(jù)結(jié)構(gòu),提供了高性能的排序和范圍查找功能。

2、實戰(zhàn)

要使用 Spring Boot 和 Redis 實現(xiàn)排行榜功能,你可以遵循以下步驟:文章來源地址http://www.zghlxwxcb.cn/news/detail-755002.html

  1. 引入依賴
    在你的 Spring Boot 項目的 pom.xml 文件中,添加以下依賴:
<dependencies>  
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-data-redis</artifactId>  
    </dependency>  
</dependencies>  
  1. 配置 Redis
    在 application.properties 或 application.yml 文件中配置 Redis 連接信息:
# application.properties  
spring.redis.host=localhost  
spring.redis.port=6379  
# application.yml  
spring:  
  redis:  
    host: localhost  
    port: 6379  
  1. 創(chuàng)建 Redis 模板
    創(chuàng)建一個 RedisTemplate Bean:
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.data.redis.connection.RedisConnectionFactory;  
import org.springframework.data.redis.core.RedisTemplate;  
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;  
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration  
public class RedisConfig {
    @Bean  
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {  
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();  
        redisTemplate.setConnectionFactory(redisConnectionFactory);  
        redisTemplate.setKeySerializer(new StringRedisSerializer());  
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());  
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());  
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());  
        return redisTemplate;  
    }  
}
  1. 創(chuàng)建排行榜實體類
    創(chuàng)建一個排行榜實體類,包含用戶 ID、分數(shù)等信息:
import java.io.Serializable;
public class RankingEntity implements Serializable {
    private String userId;  
    private double score;
    // 構(gòu)造方法、getter 和 setter  
}
  1. 實現(xiàn) Redis 排行榜操作
    創(chuàng)建一個服務(wù)類,實現(xiàn)排行榜的相關(guān)操作,如添加分數(shù)、查詢排名等:
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.data.redis.core.RedisTemplate;  
import org.springframework.data.redis.core.ValueOperations;  
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
@Service  
public class RankingService {
    @Autowired  
    private RedisTemplate<String, Object> redisTemplate;
    private static final String RANKING_KEY = "ranking_list";
    /**  
     * 添加分數(shù)  
     * @param userId 用戶 ID  
     * @param score 分數(shù)  
     */  
    public void addScore(String userId, double score) {  
        ValueOperations<String, RankingEntity> valueOperations = redisTemplate.opsForValue();  
        valueOperations.set(RANKING_KEY + ":" + userId, score, 60, TimeUnit.SECONDS);  
    }
    /**  
     * 查詢排名  
     * @return 排名列表  
     */  
    public List<Object> getRankingList() {  
        List<Object> rankingList = redisTemplate.opsForList().range(RANKING_KEY, 0, -1);  
        return rankingList;  
    }
    /**  
     * 查詢用戶排名  
     * @param userId 用戶 ID  
     * @return 用戶排名  
     */  
    public Object getUserRanking(String userId) {  
        return redisTemplate.opsForValue().get(RANKING_KEY + ":" + userId);  
    }
     * @param userId 用戶 ID  
     */  
    public void deleteUserScore(String userId) {  
        ValueOperations<String, RankingEntity> valueOperations = redisTemplate.opsForValue();  
        valueOperations.delete(RANKING_KEY + ":" + userId);  
    }
    /**  
     * 更新用戶分數(shù)  
     * @param userId 用戶 ID  
     * @param score 新的分數(shù)  
     */  
    public void updateUserScore(String userId, double score) {  
        ValueOperations<String, RankingEntity> valueOperations = redisTemplate.opsForValue();  
        valueOperations.set(RANKING_KEY + ":" + userId, score, 60, TimeUnit.SECONDS);  
    }
    /**  
     * 獲取用戶排名列表的長度  
     * @return 用戶排名列表的長度  
     */  
    public long getUserRankingListSize() {  
        return redisTemplate.opsForList().size(RANKING_KEY);  
    }
    /**  
     * 在用戶排名列表中插入用戶分數(shù)  
     * @param userId 用戶 ID  
     * @param score 分數(shù)  
     * @param index 插入位置,0 表示插入到列表頭部,負數(shù)表示插入到列表尾部  
     */  
    public void insertUserScore(String userId, double score, long index) {  
        List<Object> rankingList = redisTemplate.opsForList().range(RANKING_KEY, 0, -1);  
        redisTemplate.opsForList().leftPush(RANKING_KEY, score, index);  
    }
    /**  
     * 在用戶排名列表中刪除用戶分數(shù)  
     * @param userId 用戶 ID  
     * @param index 刪除位置,0 表示刪除第一個元素,1 表示刪除第二個元素,依此類推  
     */  
    public void deleteUserScore(String userId, long index) {  
        List<Object> rankingList = redisTemplate.opsForList().range(RANKING_KEY, 0, -1);  
        redisTemplate.opsForList().rightPop(RANKING_KEY, index);  
    }
    /**  
     * 獲取用戶排名列表中的最后一個元素  
     * @return 用戶排名列表中的最后一個元素  
     */  
    public Object getLastUserScore() {  
        return redisTemplate.opsForList().rightPop(RANKING_KEY);  
    }
    /**  
     * 獲取用戶排名列表中的第一個元素  
     * @return 用戶排名列表中的第一個元素  
     */  
    public Object getFirstUserScore() {  
        return redisTemplate.opsForList().leftPop(RANKING_KEY);  
    }
    /**  
     * 在用戶排名列表中添加元素  
     * @param score 添加的分數(shù)  
     */  
    public void addUserScore(double score) {  
        redisTemplate.opsForList().rightPush(RANKING_KEY, score);  
    }
    /**  
     * 在用戶排名列表中刪除元素  
     * @param index 刪除位置,0 表示刪除第一個元素,1 表示刪除第二個元素,依此類推  
     */  
    public void deleteUserScore(long index) {  
        redisTemplate.opsForList().rightPop(RANKING_KEY, index);  
    }
    /**  
     * 獲取用戶排名列表  
     * @return 用戶排名列表  
     */  
    public List<Object> getUserRankingList() {  
        return redisTemplate.opsForList().range(RANKING_KEY, 0, -1);  
    }
    /**  
     * 設(shè)置用戶排名列表的長度  
     * @param length 用戶排名列表的新長度  
     */  
    public void setUserRankingListLength(long length) {  
        redisTemplate.opsForList().setSize(RANKING_KEY, length);  
    }
    /**  
     * 獲取用戶排名  
     *  
     * @param userId 用戶 ID  
     * @return 用戶排名,如果用戶不存在,返回 -1  
     */  
    public int getUserRanking(String userId) {  
        List<Object> rankingList = getRankingList();  
        Object userScore = getUserRanking(userId);  
        if (userScore == null) {  
            return -1;  
        }
                     int rank = 0;    
        for (Object score : rankingList) {    
            if (score.equals(userScore)) {    
                break;    
            }    
            rank++;    
        }    
        return rank;    
    }
    /**  
     * 獲取用戶排名列表中的指定位置的元素  
     *  
     * @param index 指定位置,從 0 開始  
     * @return 用戶排名列表中的指定位置的元素  
     */  
    public Object getUserRankingListElement(long index) {  
        return redisTemplate.opsForList().range(RANKING_KEY, 0, -1).get(index);  
    }
    /**  
     * 獲取用戶排名列表中的用戶分數(shù)  
     *  
     * @param userId 用戶 ID  
     * @return 用戶排名列表中的用戶分數(shù),如果用戶不存在,返回 null  
     */  
    public Object getUserRanking(String userId) {  
        ValueOperations<String, RankingEntity> valueOperations = redisTemplate.opsForValue();  
        return valueOperations.get(RANKING_KEY + ":" + userId);  
    }
    /**  
     * 是否存在用戶  
     *  
     * @param userId 用戶 ID  
     * @return 是否存在用戶  
     */  
    public boolean existsUser(String userId) {  
        ValueOperations<String, RankingEntity> valueOperations = redisTemplate.opsForValue();  
        return valueOperations.hasKey(RANKING_KEY + ":" + userId);  
    }
    /**  
     * 清除所有用戶排名數(shù)據(jù)  
     */  
    public void clearAllUserRankingData() {  
        redisTemplate.delete(RANKING_KEY);  
    }  
}

到了這里,關(guān)于Redis實戰(zhàn) | 使用Redis 的有序集合(Sorted Set)實現(xiàn)排行榜功能,和Spring Boot集成的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • redis—Set集合

    redis—Set集合

    目錄 前言 1.常見命令 2.使用場景 集合類型也是保存多個字符串類型的元素的,但和列表類型不同的是,集合中1)元素之間是無序的2)元素不允許重復(fù),如圖2-24所示。一個集合中最多可以存儲22 - 1個元素。Redis 除了支持集合內(nèi)的增刪查改操作,同時還支持多個集合取交集、并集

    2024年01月25日
    瀏覽(15)
  • Redis 實現(xiàn)用戶積分和積分排行榜微服務(wù)優(yōu)化

    Redis 實現(xiàn)用戶積分和積分排行榜微服務(wù)優(yōu)化

    在之前的博客中我通過 MySQL數(shù)據(jù)庫實現(xiàn)了積分和積分排行榜功能,在數(shù)據(jù)量大和并發(fā)量高的情況下會有以下缺點: SQL編寫復(fù)雜; 數(shù)據(jù)量大,執(zhí)行統(tǒng)計SQL慢; 高并發(fā)下會拖累其他業(yè)務(wù)表的操作,導(dǎo)致系統(tǒng)變慢; 使用 Sorted Sets 保存用戶的積分總數(shù),因為 Sorted Sets 有 score 屬性,

    2024年02月03日
    瀏覽(20)
  • 使用Java的stream().sorted方法對集合進行排序

    Java Stream API 提供了豐富的方法來對流中的元素進行處理和操作。其中, sorted() 方法用于對流中的元素進行排序。本文將深入探討 sorted() 方法的用法、示例代碼以及詳細解釋,以幫助您更好地理解和使用這個方法。 StreamT sorted() : 這個方法用于對流中的元素進行自然排序。要

    2024年02月04日
    瀏覽(20)
  • 微服務(wù)SpringBoot 整合Redis 實現(xiàn)點贊、點贊排行榜

    微服務(wù)SpringBoot 整合Redis 實現(xiàn)點贊、點贊排行榜

    本博文參考 黑馬 程序員B站 Redis課程系列 在點評項目中,有這樣的需求,如何實現(xiàn)筆記的 點贊、以及點贊的排行榜 功能? 使用Redis 的 Set集合、ZSet集合實現(xiàn)點贊功能 Redis 如此強大! 如何發(fā)布探店筆記呢,該部分需求為如下: 要求可上傳圖片,可輸入標題、內(nèi)容即可 發(fā)布按

    2024年01月21日
    瀏覽(22)
  • C語言實現(xiàn)兩個集合合并及有序集合的并集(順序存儲、鏈式存儲)

    1、兩個集合并集問題 獲取LA、LB的表長m、n。 從LB中第一個數(shù)據(jù)元素開始,循環(huán)n次執(zhí)行:從LB中查找第i(1≤i≤n)個數(shù)據(jù)元素賦值給e;然后在LA中查找元素e,如果不存在,則將e插入在表LA的最后。 2、算法描述 3、順序存儲實現(xiàn) 4、鏈式存儲實現(xiàn)

    2024年02月07日
    瀏覽(24)
  • 使用Redis的zset集合實現(xiàn)小程序的滾動分頁

    使用Redis的zset集合實現(xiàn)小程序的滾動分頁

    將每個文檔的 score 值設(shè)置為時間戳(或根據(jù)其他規(guī)則計算的分數(shù)),將文檔的 ID 作為 value,然后將其添加到有序集合中。 獲取當(dāng)前時間戳,作為查詢時間點。 使用 ZRANGEBYSCORE 命令根據(jù) score 值范圍查詢出 score 值在當(dāng)前時間戳之前的所有文檔 ID。 返回查詢結(jié)果作為當(dāng)前頁的結(jié)

    2024年02月03日
    瀏覽(17)
  • Java基礎(chǔ)——Set集合實現(xiàn)類

    (1)Set集合實現(xiàn)類特點: HashSet:無序,不重復(fù),無索引。 LinkedHashSet:有序,不重復(fù),無索引。 TreeSet:排序,不重復(fù),無索引。 ?(2)HashSet集合 1.底層原理: HashSet集合底層采取哈希表存儲的數(shù)據(jù)。 哈希表是一種對于增刪改查數(shù)據(jù)性能都較好的結(jié)構(gòu)。 2.哈希表的組成:?

    2023年04月13日
    瀏覽(20)
  • 【算法】Two Sum II - Input Array Is Sorted 兩數(shù)之和 II - 輸入有序數(shù)組

    給你一個下標從 1 開始的整數(shù)數(shù)組 numbers ,該數(shù)組已按 非遞減順序排列 ,請你從數(shù)組中找出滿足相加之和等于目標數(shù) target 的兩個數(shù)。如果設(shè)這兩個數(shù)分別是 numbers[index1] 和 numbers[index2] ,則 1 = index1 index2 = numbers.length 。 以長度為 2 的整數(shù)數(shù)組 [index1, index2] 的形式返回這兩個

    2024年02月13日
    瀏覽(28)
  • Python 集合 set的使用

    創(chuàng)建集合使用{xxx} 或 set(), 但是創(chuàng)建空集合只能使用 set(), 空大括號{} 用來創(chuàng)建空的字典。 集合和列表區(qū)別: 集合可以去掉重復(fù)數(shù)據(jù),即只存放不同的元素 集合中的元素是無序的,故不支持下標訪問 創(chuàng)建方式不同,列表是用中括號表示,非空集合使用大括號表示。 有點類

    2024年02月12日
    瀏覽(14)
  • 微服務(wù)—Redis實用篇-黑馬頭條項目-達人探店功能(使用set與zset實現(xiàn))

    微服務(wù)—Redis實用篇-黑馬頭條項目-達人探店功能(使用set與zset實現(xiàn))

    1.1、達人探店-發(fā)布探店筆記 發(fā)布探店筆記 探店筆記類似點評網(wǎng)站的評價,往往是圖文結(jié)合。對應(yīng)的表有兩個: tb_blog:探店筆記表,包含筆記中的標題、文字、圖片等 tb_blog_comments:其他用戶對探店筆記的評價 具體發(fā)布流程 上傳接口 注意:同學(xué)們在操作時,需要修改Syste

    2024年02月05日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包