ホームページ  >  記事  >  データベース  >  Redis の順序付けされたコレクションに基づいたランキング リストを実装する Java について

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

藏色散人
藏色散人転載
2020-09-11 13:22:502037ブラウズ

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 までご連絡ください。