《Redis应用实例》Java实现(18):社交关系

社交网络程序的一个核心就是网友之间的社交关系,关注与粉丝等。
 

package com.foxbill.redisinaction;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 社交关系
 */
public class Chapter18 {
    static String key_prefix_following="Chapter18:following";
    static String key_prefix_follower="Chapter18:follower";

    static public void start(Jedis jedis) {
        cleanData(jedis);
        //------------关注
        String user1 = "user1";
        String user2 = "user2";
        String user3 = "user3";
        String user4 = "user4";
        //user1关注user2、user3、user4
        follow(jedis,user1,user2);
        follow(jedis,user1,user3);
        follow(jedis,user1,user4);
        //user2关注user3、user4
        follow(jedis,user2,user3);
        follow(jedis,user2,user4);
        //-------------
        List<String> range = range(jedis, user1, 1, 3);
        String strRange = range.stream()
                .collect(Collectors.joining(","));
        System.out.printf("user1的粉丝1,到3:%s\n",strRange);
        //-------------
        long rank = rank(jedis,user1,user3);
        System.out.printf("user3在user1的粉丝中排序位次:%d\n",rank);
        rank = rank(jedis,user2,user4);
        System.out.printf("user4在user2的粉丝中排序位次:%d\n",rank);
        //-------------取消关注
        unFollow(jedis,user1,user2);
        unFollow(jedis,user2,user3);
    }

    //清理数据,便于反复测试
    private static void cleanData(Jedis jedis) {
        jedis.del(key_prefix_following);
        jedis.del(key_prefix_follower);
    }

    //关注
    private static void follow(Jedis jedis,String userA,String userB) {
        // 开始事务
        Transaction tx = jedis.multi();
        try{
            //执行业务
            String key = String.format("%s:%s",key_prefix_following,userA);
            //按照关注时间先后排序
            double score=System.currentTimeMillis();
            tx.zadd(key,score,userB);

            String key2 = String.format("%s:%s",key_prefix_follower,userB);
            tx.zadd(key2,score,userA);
            // 提交事务
            tx.exec();
        }catch (Exception e) {
            // 事务回滚
            tx.discard();
        }
    }

    //取消关注
    private static void unFollow(Jedis jedis,String userA,String userB){
        // 开始事务
        Transaction tx = jedis.multi();
        try{
            //执行业务
            String key = String.format("%s:%s",key_prefix_following,userA);
            jedis.zrem(key,userB);

            String key2 = String.format("%s:%s",key_prefix_follower,userB);
            jedis.zrem(key2,userA);
            // 提交事务
            tx.exec();
        }catch (Exception e) {
            // 事务回滚
            tx.discard();
        }
    }

    //粉丝排名
    private static Long rank(Jedis jedis,String userA,String userB){
        String key = String.format("%s:%s",key_prefix_following,userA);
        Long rank = jedis.zrank(key, userB);
        return rank;
    }

    //批量获取粉丝
    private static List<String> range(Jedis jedis,String userA,long start,long end){
        String key = String.format("%s:%s",key_prefix_following,userA);
        List<String> zrange = jedis.zrange(key, start, end);
        return zrange;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值