Redis の順序付けされたコレクションに基づいたランキング リストを実装する Java について

藏色散人
リリース: 2020-09-11 13:23:18
転載
2112 人が閲覧しました

Redis チュートリアル

Redis の順序付けされたコレクションに基づいたランキング リストを実装する Java について

Redis の順序付けされたコレクションに基づいたランキング リストを実装する Java について# 尊敬する Redis が注文したコレクション実装のランキング リストです。困っている友人の役に立てば幸いです。

まえがき

インターネットアプリケーションにおいて、ほぼ必須の要素であるランキングは、人間の比較欲求を刺激するものです。売上ランキングや店舗評判ランキングなどのランキングを実装する方法. クイックソートアルゴリズムを使用して、特定の重みでソートするComparatorインターフェイスを実装できます. 現在、多くの企業がNoSQLデータベースであるredisを使用してランキング機能を実装しています

Redis の順序付けされたコレクションに基づいたランキング リストを実装する Java についてredisをベースにランキングリストを実装

これからやるべきことは企業のランキングです ユーザーによる企業の検索数をランキング基準としてランキングを作成します上位10社

1 .redis関連知識Redis の順序付けされたコレクションに基づいたランキング リストを実装する Java について

ランキング機能の実装に関わるredisのデータ構造はソートセット(順序セット)です

ソートセットについて

set は Set であることはわかっていますが、set の特徴の 1 つは、重複する要素がないことです。ソート セットには、重複する要素がないことに加えて、順序性という特徴もあります。

データ構造の構成:

key: ソートセットの一意の識別子Weight: スコア (スコア) とも呼ばれます。redis はセット内の要素をソートします。重みによる昇順 ソート (デフォルト)、重みは繰り返すことができます value: 要素を設定します。要素は繰り返しできません ###
String(set key),double(权重),String(value)
ログイン後にコピー
###ソート セットはハッシュ テーブルを通じて実装されるため、次のように追加します。関数と検索時間 複雑さは O(1) で、各コレクションには 40 億を超える要素を保存できます######基本コマンド#########コレクションに 1 つ以上の要素を追加します## ### #
ZADD "KEY" SCORE "VALUE" [ SCORE "VALUE"]
ログイン後にコピー
###Effect:###
MyRedis:0>ZADD test 1 "one""1"MyRedis:0>zadd test 4 "four" 5 "five""2"
ログイン後にコピー
######コレクション内の要素の数を取得します######
ZCARD "key"
ログイン後にコピー
###Effect###
MyRedis:0>ZCARD test"5"
ログイン後にコピー
######Get指定された要素のスコア (重み) ######
ZSCORE "KEY" "VALUE"
ログイン後にコピー
###効果###
MyRedis:0>ZSCORE "test" "one""2"
ログイン後にコピー
######指定されたコレクションの指定された要素は、指定されたスコアを増加させます######
ZINCRBY "key" score "value"
ログイン後にコピー
###効果: ###
MyRedis:0>ZSCORE "test" "one""2"MyRedis:0>ZINCRBY "test" 1 "one""3"MyRedis:0>ZSCORE "test" "one" "3"
ログイン後にコピー
##### #指定範囲の要素を取得します(デフォルトはスコア|重みの昇順です)######
ZRANGE "key" 开始下标 结束下标
ログイン後にコピー
###Effect###
MyRedis:0>ZRANGE "test" 0 1
 1)  "two"
 2)  "one"
ログイン後にコピー
###かかりますこの要件を完了するには非常に多くのコマンドがあるので、要件の実装を開始しましょう######2.springboot redis 実装######redis 依存関係のインポート###
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-data-redis</artifactid>
        </dependency>
ログイン後にコピー
###書き込みツール クラス###
    //=============================== sort set =================================

    /**
     * 添加指定元素到有序集合中
     * @param key
     * @param score
     * @param value
     * @return
     */
    public boolean sortSetAdd(String key,double score,String value){
        try{
            return redisTemplate.opsForZSet().add(key,value,score);
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 有序集合中对指定成员的分数加上增量 increment
     * @param key
     * @param value
     * @param i
     * @return
     */
    public double sortSetZincrby(String key,String value,double i){
        try {
            //返回新增元素后的分数
            return redisTemplate.opsForZSet().incrementScore(key, value, i);
        }catch(Exception e){
            e.printStackTrace();
            return -1;
        }
    }

    /**
     * 获得有序集合指定范围元素 (从大到小)
     * @param key
     * @param start
     * @param end
     * @return
     */
    public Set sortSetRange(String key,int start,int end){
        try {
            return redisTemplate.opsForZSet().reverseRange(key, start, end);
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
ログイン後にコピー
## #ビジネス実装:######### ######ランキングにはリアルタイム性の要件が高いため、個人的にはデータベースに永続化する必要はないと考えています###
    /**
     * 根据公司名找到指定公司
     * @param companyName
     * @return
     */
    @Override
    public AjaxResult selectCompanyName(String companyName) {
        Set<object> set =  redisUtils.sGet("company");
        for(Object i : set){
            String json = JSONObject.toJSONString(i);
            JSONObject jsonObject = JSONObject.parseObject(json);
            if(jsonObject.getString("companyName").equals(companyName)){
                //搜索次数 + 1
                redisUtils.sortSetZincrby("companyRank",companyName,1);
                log.info("直接缓存中返回");
                return new AjaxResult().ok(jsonObject);
            }
        }
        log.error("缓存中没有,查数据库");
        TbCommpanyExample tbCommpanyExample = new TbCommpanyExample();
        tbCommpanyExample.createCriteria().andCompanyNameEqualTo(companyName);
        List<tbcommpany> list = tbCommpanyMapper.selectByExample(tbCommpanyExample);
        if(list.size() != 0){
            //放入缓存中
            redisUtils.sSet("company",list.get(0));
            //数据库中存在
            //搜索次数 + 1
            redisUtils.sortSetZincrby("companyRank",companyName,1);
            log.info("sql");
            return new AjaxResult().ok(list.get(0));
        }else{
            return new AjaxResult().error("没有找到该公司:"+companyName);
        }
    }</tbcommpany></object>
ログイン後にコピー
###Getランキング###
    /**
     * 获得公司排行榜(前十)
     * @return
     */
    @Override
    public AjaxResult getCompanyRank() {
        Set set = redisUtils.sortSetRange("companyRank",0,9);
        if(set.size() == 0){
            return new AjaxResult().error("公司排行榜为空");
        }
        return new AjaxResult().ok(set);
    }
ログイン後にコピー
###3. テストと概要#### ###########ポストマンテスト: ###############もう1つの質問は次のとおりです。同じスコアの順位 #######A を次のようにしたい場合、最初に到着した人は、同じスコアで後から到着した B の前にランク付けされます。この問題を解決するにはどうすればよいですか? ######この問題を解決するには、スコアにタイムスタンプを追加することを検討できます。計算式は次のとおりです: ###
带时间戳的分数 = 实际分数*10000000000 + (9999999999 – timestamp)
ログイン後にコピー
###時間のあるこの企業は、エラーをできる限り減らすために独自に記述できます。 ###### ###############

以上がRedis の順序付けされたコレクションに基づいたランキング リストを実装する Java についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート