Redisのzset常用命令及び友人関係設定簡易実現札記

27101 ワード

1.Redis秩序セットの使用
ランキング、他人への関心、他人や友人の推薦などの機能の実現にかかわらず、背後にはRedisの秩序ある数列集合(zset)や関連命令を利用して実現される.
まずランキングの実現原理を振り返る:秩序集合は3つの部分から構成され、KEY(キー)、score(メンバーの得点)、member(メンバー).秩序化された集合の各項目は、キー値ペアとして格納され、各項目にはスコアがあります.秩序化された集合はscoreに基づいて自動的にソートされます.この特性を利用すれば、ランキングを実現できます.scoreはデジタルタイプで、整形でも浮動小数点タイプでも構いません.同じスコアの場合、redisはメンバーのASCIIコードに従ってソートされます.
ランキングの採点基準が1つの属性だけでなく、複数の属性の比較である場合(同じ点数で先着順に並べ替える場合)、どうすればいいのでしょうか.ポリシー:スコアリングプロセスを詳細に処理し、scoreを改造し、スコアと時間情報を記録します.実装方法は次の2つです.
  • 得点+時間差の整数scoreを再接続します.
  • 得点+時間差の浮動小数点数scoreを再接続します.整数部はスコアを使用し、小数部は時間差を使用します.注:1、浮動小数点数の場合、小数点前後の桁数と16位を超えないで、15位が望ましい.16ビットを超えると、score値がredisに格納され、精度が失われます.2、時間差はunixタイムスタンプから
  • を生成する.
    redis秩序セットzset共通コマンド:
    //       ,      , ZRANGE    
    ZREVRANGE yourkey 0 -1 withscores
    
    //      n ,      
    ZREVRANGE yourkey 0 n-1 withscores
    
    //              ,              
    ZADD key score1 member1 [score2 member2]
     
    //                (    )。
    ZRANGE key start stop [WITHSCORES]
     
    //                   
    ZSCORE key member
     
    //       
    ZRANK key member
    
    //      
    ZREM key member
    
    //         
    ZCARD key
    
    //           ,key   (min max)or (min max  or min max) or min max        
    ZCOUNT key min max
    
    //            ,     : O(N * M), N               , M         。
    ZINTER key1 key2 [key3···]
    
    //    ( key1 key2      key3):
    ZINTERSTORE key3 key1 key2
    
    //           ,    :
    //numkeys  key   ,  
    //WEIGHTS  ,      key  ,  key    score        
    //AGGREGATE  ,         
    //SUM:            score             score 
    //MIN:            score               score 
    //MAX:           score               score 
    ZINTERSTORE destination numkeys key [key …][WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]
    

    2、友達関係の設定を簡単に実現
  • 分析現在、多くのソーシャルに注目や関門取りなどの機能があり、ユーザーの一部のファンや注目を集めている人だけを取得すると、伝統的なデータベースで類似の機能を実現することができ、実現は容易であるが、2人、さらには複数のユーザーがどの人に注目しているのかを検索したり、2人以上のユーザーの共通のファンを検索したりするのは面倒で、効率も高くない.しかしredisで行うと,redisが複数の集合の交差,並列,差分などの操作をカプセル化しているおかげである.実現するとかなり簡単で効率的です.ユーザーごとに2つのセットを設定するだけでいい、fans_userIDセットはユーザーが所有するファンの集合を表し、following_userIDセットは,ユーザが注目する人の結合を表す.次の操作は、
  • です.
  • コア論理コードは以下の通りである:
  • まず依存を追加し、簡易redisツールクラスを定義します.
    /**
     * @author [email protected]
     * @since 0.1.0
     **/
    public final class RedisUtil {
        
        private static String ADDR = "localhost";
        
        private static int PORT = 6379;
        
        private static String AUTH = "admin";
        
        //    pool         idle(   ) jedis  ,   8。
        private static int MAX_IDLE = 200;
        
        //    
        private static int TIMEOUT = 10000;
        
        //      validate  
        private static boolean TEST_ON_BORROW = true;
        
        private static JedisPool jedisPool = null;
        
        static {
            try {
                JedisPoolConfig config = new JedisPoolConfig();
                config.setMaxIdle(MAX_IDLE);
                config.setTestOnBorrow(TEST_ON_BORROW);
                jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        public synchronized static Jedis getJedis() {
            try {
                if (jedisPool != null) {
                    return jedisPool.getResource();
                } else {
                    return null;
                }
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
        @SuppressWarnings("deprecation")
        public static void returnResource(final Jedis jedis) {
            if (jedis != null) {
                jedisPool.returnResource(jedis);
            }
        }
    }
    

    パッケージの簡単な注目ツール類FollowUtilは、redis関連コマンドに基づいて注目、ファン獲得、共通の友人獲得などの機能を実現し、詳細は注釈を参照してください.
    /**
     * @author [email protected]
     * @since 0.1.0
     **/
    public class FollowUtil {
        
        private static final String FOLLOWING = "FOLLOWING_";
        
        private static final String FANS = "FANS_";
        
        private static final String COMMON_KEY = "COMMON_FOLLOWING_";
    
        /**
         *         
         */    
        public static int addOrRelease(String userId, String followingId) {
            if (userId == null || followingId == null) {
                return -1;
            }
            // 0 =      1 =   
            int isFollow = 0; 
            Jedis jedis = RedisUtil.getJedis();
            String followingKey = FOLLOWING + userId;
            String fansKey = FANS + followingId;        
            if (jedis.zrank(followingKey, followingId) == null) {
                //   userId     followingId
                jedis.zadd(followingKey, System.currentTimeMillis(), followingId);
                jedis.zadd(fansKey, System.currentTimeMillis(), userId);
                isFollow = 1;
            } else { 
                //     
                jedis.zrem(followingKey, followingId);
                jedis.zrem(fansKey, userId);
            }
            return isFollow;
        }
    
        /**
         *            
         * 0:     
         * 1:    
         * 2: userId   otherUserId 
         * 3: otherUserId userId    
         * 4:     
         * @param userId userId
         * @param otherUserId otherUserId
         * @return int
         */
        public int checkRelations (String userId, String otherUserId) {
            if (userId == null || otherUserId == null) {
                return 0;
            }
            if (userId.equals(otherUserId)) {
                return 1;
            }
            Jedis jedis = RedisUtil.getJedis();
            String followingKey = FOLLOWING + userId;
            int relation = 0;
            // userId    otherUserId
            if (jedis.zrank(followingKey, otherUserId) != null) { 
                relation = 2;
            }
            String fansKey = FANS + userId;
            // userId        otherUserId
            if (jedis.zrank(fansKey, userId) != null) {
                relation = 3;
            }
            if ((jedis.zrank(followingKey, otherUserId) != null)
                    && jedis.zrank(fansKey, userId) != null) {
                relation = 4;
            }
            return relation;
        }
    
        /**
         *           
         * @param userId userId
         * @return set
         */
        public static Set<String> findFollowings(String userId) {
            return findSet(FOLLOWING + userId);
        }
        
        /**
         *         
         * @param userId userId
         * @return set
         */
        public static Set<String> findFans(String userId) {
            return findSet(FANS + userId);
        }
        
        /**
         *           
         * @param userId userId
         * @param otherUserId otherUserId
         * @return set
         */
        public static Set<String> findCommonFollowing(String userId, String otherUserId) {
            if (userId == null || otherUserId == null) {
                return new HashSet<>();
            }
            Jedis jedis = RedisUtil.getJedis();
            String commonKey = COMMON_KEY + userId + "_" + otherUserId;
            //         commonKey set 
            jedis.zinterstore(commonKey, FOLLOWING + userId, FOLLOWING + otherUserId);
            Set<String> result = jedis.zrange(commonKey, 0, -1);
            jedis.del(commonKey);
            return result;
        }
    
        /**
         *   key     set
         * @param key key
         * @return set
         */
        private static Set<String> findSet(String key) {
            if (key == null) {
                return new HashSet<>();
            }
            Jedis jedis = RedisUtil.getJedis();
            //   score      
            return jedis.zrevrange(key, 0, -1); 
        }
    }
    
  • 友達推薦の実現は関連規則マイニングアルゴリズムを採用して友達推薦を実現し、典型的な推薦アルゴリズムは例えば:Apriori、FP-Growth及び関連改善アルゴリズムである.

  • 3参考
    https://blog.csdn.net/chengqiuming/article/details/79189955 https://blog.csdn.net/u013239111/article/details/81201404